* config/tc-mips.c (mips16_macro_build): Cast type mismatch.
[external/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3    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, 59 Temple Place - Suite 330, Boston, MA
24    02111-1307, USA.  */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #ifdef USE_STDARG
32 #include <stdarg.h>
33 #endif
34 #ifdef USE_VARARGS
35 #include <varargs.h>
36 #endif
37
38 #include "opcode/mips.h"
39 #include "itbl-ops.h"
40
41 #ifdef DEBUG
42 #define DBG(x) printf x
43 #else
44 #define DBG(x)
45 #endif
46
47 #ifdef OBJ_MAYBE_ELF
48 /* Clean up namespace so we can include obj-elf.h too.  */
49 static int mips_output_flavor PARAMS ((void));
50 static int mips_output_flavor () { return OUTPUT_FLAVOR; }
51 #undef OBJ_PROCESS_STAB
52 #undef OUTPUT_FLAVOR
53 #undef S_GET_ALIGN
54 #undef S_GET_SIZE
55 #undef S_SET_ALIGN
56 #undef S_SET_SIZE
57 #undef obj_frob_file
58 #undef obj_frob_file_after_relocs
59 #undef obj_frob_symbol
60 #undef obj_pop_insert
61 #undef obj_sec_sym_ok_for_reloc
62 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
63
64 #include "obj-elf.h"
65 /* Fix any of them that we actually care about.  */
66 #undef OUTPUT_FLAVOR
67 #define OUTPUT_FLAVOR mips_output_flavor()
68 #endif
69
70 #if defined (OBJ_ELF)
71 #include "elf/mips.h"
72 #endif
73
74 #ifndef ECOFF_DEBUGGING
75 #define NO_ECOFF_DEBUGGING
76 #define ECOFF_DEBUGGING 0
77 #endif
78
79 #include "ecoff.h"
80
81 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
82 static char *mips_regmask_frag;
83 #endif
84
85 #define AT  1
86 #define TREG 24
87 #define PIC_CALL_REG 25
88 #define KT0 26
89 #define KT1 27
90 #define GP  28
91 #define SP  29
92 #define FP  30
93 #define RA  31
94
95 #define ILLEGAL_REG (32)
96
97 /* Allow override of standard little-endian ECOFF format.  */
98
99 #ifndef ECOFF_LITTLE_FORMAT
100 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
101 #endif
102
103 extern int target_big_endian;
104
105 /* The name of the readonly data section.  */
106 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
107                             ? ".data" \
108                             : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
109                             ? ".rdata" \
110                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
111                             ? ".rdata" \
112                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
113                             ? ".rodata" \
114                             : (abort (), ""))
115
116 /* The ABI to use.  */
117 enum mips_abi_level
118 {
119   NO_ABI = 0,
120   O32_ABI,
121   O64_ABI,
122   N32_ABI,
123   N64_ABI,
124   EABI_ABI
125 };
126
127 /* MIPS ABI we are using for this output file.  */
128 static enum mips_abi_level file_mips_abi = NO_ABI;
129
130 /* This is the set of options which may be modified by the .set
131    pseudo-op.  We use a struct so that .set push and .set pop are more
132    reliable.  */
133
134 struct mips_set_options
135 {
136   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
137      if it has not been initialized.  Changed by `.set mipsN', and the
138      -mipsN command line option, and the default CPU.  */
139   int isa;
140   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
141      if they have not been initialized.  Changed by `.set <asename>', by
142      command line options, and based on the default architecture.  */
143   int ase_mips3d;
144   /* Whether we are assembling for the mips16 processor.  0 if we are
145      not, 1 if we are, and -1 if the value has not been initialized.
146      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
147      -nomips16 command line options, and the default CPU.  */
148   int mips16;
149   /* Non-zero if we should not reorder instructions.  Changed by `.set
150      reorder' and `.set noreorder'.  */
151   int noreorder;
152   /* Non-zero if we should not permit the $at ($1) register to be used
153      in instructions.  Changed by `.set at' and `.set noat'.  */
154   int noat;
155   /* Non-zero if we should warn when a macro instruction expands into
156      more than one machine instruction.  Changed by `.set nomacro' and
157      `.set macro'.  */
158   int warn_about_macros;
159   /* Non-zero if we should not move instructions.  Changed by `.set
160      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
161   int nomove;
162   /* Non-zero if we should not optimize branches by moving the target
163      of the branch into the delay slot.  Actually, we don't perform
164      this optimization anyhow.  Changed by `.set bopt' and `.set
165      nobopt'.  */
166   int nobopt;
167   /* Non-zero if we should not autoextend mips16 instructions.
168      Changed by `.set autoextend' and `.set noautoextend'.  */
169   int noautoextend;
170   /* Restrict general purpose registers and floating point registers
171      to 32 bit.  This is initially determined when -mgp32 or -mfp32
172      is passed but can changed if the assembler code uses .set mipsN.  */
173   int gp32;
174   int fp32;
175   /* The ABI currently in use. This is changed by .set mipsN to loosen
176      restrictions and doesn't affect the whole file.  */
177   enum mips_abi_level abi;
178 };
179
180 /* True if -mgp32 was passed.  */
181 static int file_mips_gp32 = -1;
182
183 /* True if -mfp32 was passed.  */
184 static int file_mips_fp32 = -1;
185
186 /* This is the struct we use to hold the current set of options.  Note
187    that we must set the isa field to ISA_UNKNOWN and the mips16 field to
188    -1 to indicate that they have not been initialized.  */
189
190 static struct mips_set_options mips_opts =
191 {
192   ISA_UNKNOWN, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, NO_ABI
193 };
194
195 /* These variables are filled in with the masks of registers used.
196    The object format code reads them and puts them in the appropriate
197    place.  */
198 unsigned long mips_gprmask;
199 unsigned long mips_cprmask[4];
200
201 /* MIPS ISA we are using for this output file.  */
202 static int file_mips_isa = ISA_UNKNOWN;
203
204 /* True if -mips3d was passed or implied by arguments passed on the
205    command line (e.g., by -march).  */
206 static int file_ase_mips3d;
207
208 /* The argument of the -mcpu= flag.  Historical for code generation.  */
209 static int mips_cpu = CPU_UNKNOWN;
210
211 /* The argument of the -march= flag.  The architecture we are assembling.  */
212 static int mips_arch = CPU_UNKNOWN;
213
214 /* The argument of the -mtune= flag.  The architecture for which we
215    are optimizing.  */
216 static int mips_tune = CPU_UNKNOWN;
217
218 /* Whether we should mark the file EABI64 or EABI32.  */
219 static int mips_eabi64 = 0;
220
221 /* If they asked for mips1 or mips2 and a cpu that is
222    mips3 or greater, then mark the object file 32BITMODE.  */
223 static int mips_32bitmode = 0;
224
225 /* Some ISA's have delay slots for instructions which read or write
226    from a coprocessor (eg. mips1-mips3); some don't (eg mips4).
227    Return true if instructions marked INSN_LOAD_COPROC_DELAY,
228    INSN_COPROC_MOVE_DELAY, or INSN_WRITE_COND_CODE actually have a
229    delay slot in this ISA.  The uses of this macro assume that any
230    ISA that has delay slots for one of these, has them for all.  They
231    also assume that ISAs which don't have delays for these insns, don't
232    have delays for the INSN_LOAD_MEMORY_DELAY instructions either.  */
233 #define ISA_HAS_COPROC_DELAYS(ISA) (        \
234    (ISA) == ISA_MIPS1                       \
235    || (ISA) == ISA_MIPS2                    \
236    || (ISA) == ISA_MIPS3                    \
237    )
238
239 /*  Return true if ISA supports 64 bit gp register instructions.  */
240 #define ISA_HAS_64BIT_REGS(ISA) (    \
241    (ISA) == ISA_MIPS3                \
242    || (ISA) == ISA_MIPS4             \
243    || (ISA) == ISA_MIPS5             \
244    || (ISA) == ISA_MIPS64            \
245    )
246
247 #define HAVE_32BIT_GPRS                            \
248     (mips_opts.gp32                                \
249      || mips_opts.abi == O32_ABI                   \
250      || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
251
252 #define HAVE_32BIT_FPRS                            \
253     (mips_opts.fp32                                \
254      || mips_opts.abi == O32_ABI                   \
255      || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
256
257 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
258 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
259
260 #define HAVE_NEWABI (mips_opts.abi == N32_ABI || mips_opts.abi == N64_ABI)
261
262 #define HAVE_64BIT_OBJECTS (mips_opts.abi == N64_ABI)
263
264 /* We can only have 64bit addresses if the object file format
265    supports it.  */
266 #define HAVE_32BIT_ADDRESSES                           \
267    (HAVE_32BIT_GPRS                                    \
268     || ((bfd_arch_bits_per_address (stdoutput) == 32   \
269          || ! HAVE_64BIT_OBJECTS)                      \
270         && mips_pic != EMBEDDED_PIC))
271
272 #define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
273
274 /* Return true if the given CPU supports the MIPS3D ASE.  */
275 #define CPU_HAS_MIPS3D(cpu)     ((cpu) == CPU_SB1      \
276                                  )
277
278 /* Whether the processor uses hardware interlocks to protect
279    reads from the HI and LO registers, and thus does not
280    require nops to be inserted.  */
281
282 #define hilo_interlocks (mips_arch == CPU_R4010                       \
283                          || mips_arch == CPU_SB1                      \
284                          )
285
286 /* Whether the processor uses hardware interlocks to protect reads
287    from the GPRs, and thus does not require nops to be inserted.  */
288 #define gpr_interlocks \
289   (mips_opts.isa != ISA_MIPS1  \
290    || mips_arch == CPU_R3900)
291
292 /* As with other "interlocks" this is used by hardware that has FP
293    (co-processor) interlocks.  */
294 /* Itbl support may require additional care here.  */
295 #define cop_interlocks (mips_arch == CPU_R4300                        \
296                         || mips_arch == CPU_SB1                       \
297                         )
298
299 /* Is this a mfhi or mflo instruction?  */
300 #define MF_HILO_INSN(PINFO) \
301           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
302
303 /* MIPS PIC level.  */
304
305 enum mips_pic_level
306 {
307   /* Do not generate PIC code.  */
308   NO_PIC,
309
310   /* Generate PIC code as in Irix 4.  This is not implemented, and I'm
311      not sure what it is supposed to do.  */
312   IRIX4_PIC,
313
314   /* Generate PIC code as in the SVR4 MIPS ABI.  */
315   SVR4_PIC,
316
317   /* Generate PIC code without using a global offset table: the data
318      segment has a maximum size of 64K, all data references are off
319      the $gp register, and all text references are PC relative.  This
320      is used on some embedded systems.  */
321   EMBEDDED_PIC
322 };
323
324 static enum mips_pic_level mips_pic;
325
326 /* Warn about all NOPS that the assembler generates.  */
327 static int warn_nops = 0;
328
329 /* 1 if we should generate 32 bit offsets from the GP register in
330    SVR4_PIC mode.  Currently has no meaning in other modes.  */
331 static int mips_big_got;
332
333 /* 1 if trap instructions should used for overflow rather than break
334    instructions.  */
335 static int mips_trap;
336
337 /* 1 if double width floating point constants should not be constructed
338    by assembling two single width halves into two single width floating
339    point registers which just happen to alias the double width destination
340    register.  On some architectures this aliasing can be disabled by a bit
341    in the status register, and the setting of this bit cannot be determined
342    automatically at assemble time.  */
343 static int mips_disable_float_construction;
344
345 /* Non-zero if any .set noreorder directives were used.  */
346
347 static int mips_any_noreorder;
348
349 /* Non-zero if nops should be inserted when the register referenced in
350    an mfhi/mflo instruction is read in the next two instructions.  */
351 static int mips_7000_hilo_fix;
352
353 /* The size of the small data section.  */
354 static unsigned int g_switch_value = 8;
355 /* Whether the -G option was used.  */
356 static int g_switch_seen = 0;
357
358 #define N_RMASK 0xc4
359 #define N_VFP   0xd4
360
361 /* If we can determine in advance that GP optimization won't be
362    possible, we can skip the relaxation stuff that tries to produce
363    GP-relative references.  This makes delay slot optimization work
364    better.
365
366    This function can only provide a guess, but it seems to work for
367    gcc output.  It needs to guess right for gcc, otherwise gcc
368    will put what it thinks is a GP-relative instruction in a branch
369    delay slot.
370
371    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
372    fixed it for the non-PIC mode.  KR 95/04/07  */
373 static int nopic_need_relax PARAMS ((symbolS *, int));
374
375 /* handle of the OPCODE hash table */
376 static struct hash_control *op_hash = NULL;
377
378 /* The opcode hash table we use for the mips16.  */
379 static struct hash_control *mips16_op_hash = NULL;
380
381 /* This array holds the chars that always start a comment.  If the
382     pre-processor is disabled, these aren't very useful */
383 const char comment_chars[] = "#";
384
385 /* This array holds the chars that only start a comment at the beginning of
386    a line.  If the line seems to have the form '# 123 filename'
387    .line and .file directives will appear in the pre-processed output */
388 /* Note that input_file.c hand checks for '#' at the beginning of the
389    first line of the input file.  This is because the compiler outputs
390    #NO_APP at the beginning of its output.  */
391 /* Also note that C style comments are always supported.  */
392 const char line_comment_chars[] = "#";
393
394 /* This array holds machine specific line separator characters.  */
395 const char line_separator_chars[] = ";";
396
397 /* Chars that can be used to separate mant from exp in floating point nums */
398 const char EXP_CHARS[] = "eE";
399
400 /* Chars that mean this number is a floating point constant */
401 /* As in 0f12.456 */
402 /* or    0d1.2345e12 */
403 const char FLT_CHARS[] = "rRsSfFdDxXpP";
404
405 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
406    changed in read.c .  Ideally it shouldn't have to know about it at all,
407    but nothing is ideal around here.
408  */
409
410 static char *insn_error;
411
412 static int auto_align = 1;
413
414 /* When outputting SVR4 PIC code, the assembler needs to know the
415    offset in the stack frame from which to restore the $gp register.
416    This is set by the .cprestore pseudo-op, and saved in this
417    variable.  */
418 static offsetT mips_cprestore_offset = -1;
419
420 /* Similiar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
421    more optimizations, it can use a register value instead of a memory-saved
422    offset and even an other register than $gp as global pointer.  */
423 static offsetT mips_cpreturn_offset = -1;
424 static int mips_cpreturn_register = -1;
425 static int mips_gp_register = GP;
426
427 /* Whether mips_cprestore_offset has been set in the current function
428    (or whether it has already been warned about, if not).  */
429 static int mips_cprestore_valid = 0;
430
431 /* This is the register which holds the stack frame, as set by the
432    .frame pseudo-op.  This is needed to implement .cprestore.  */
433 static int mips_frame_reg = SP;
434
435 /* Whether mips_frame_reg has been set in the current function
436    (or whether it has already been warned about, if not).  */
437 static int mips_frame_reg_valid = 0;
438
439 /* To output NOP instructions correctly, we need to keep information
440    about the previous two instructions.  */
441
442 /* Whether we are optimizing.  The default value of 2 means to remove
443    unneeded NOPs and swap branch instructions when possible.  A value
444    of 1 means to not swap branches.  A value of 0 means to always
445    insert NOPs.  */
446 static int mips_optimize = 2;
447
448 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
449    equivalent to seeing no -g option at all.  */
450 static int mips_debug = 0;
451
452 /* The previous instruction.  */
453 static struct mips_cl_insn prev_insn;
454
455 /* The instruction before prev_insn.  */
456 static struct mips_cl_insn prev_prev_insn;
457
458 /* If we don't want information for prev_insn or prev_prev_insn, we
459    point the insn_mo field at this dummy integer.  */
460 static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
461
462 /* Non-zero if prev_insn is valid.  */
463 static int prev_insn_valid;
464
465 /* The frag for the previous instruction.  */
466 static struct frag *prev_insn_frag;
467
468 /* The offset into prev_insn_frag for the previous instruction.  */
469 static long prev_insn_where;
470
471 /* The reloc type for the previous instruction, if any.  */
472 static bfd_reloc_code_real_type prev_insn_reloc_type[3];
473
474 /* The reloc for the previous instruction, if any.  */
475 static fixS *prev_insn_fixp[3];
476
477 /* Non-zero if the previous instruction was in a delay slot.  */
478 static int prev_insn_is_delay_slot;
479
480 /* Non-zero if the previous instruction was in a .set noreorder.  */
481 static int prev_insn_unreordered;
482
483 /* Non-zero if the previous instruction uses an extend opcode (if
484    mips16).  */
485 static int prev_insn_extended;
486
487 /* Non-zero if the previous previous instruction was in a .set
488    noreorder.  */
489 static int prev_prev_insn_unreordered;
490
491 /* If this is set, it points to a frag holding nop instructions which
492    were inserted before the start of a noreorder section.  If those
493    nops turn out to be unnecessary, the size of the frag can be
494    decreased.  */
495 static fragS *prev_nop_frag;
496
497 /* The number of nop instructions we created in prev_nop_frag.  */
498 static int prev_nop_frag_holds;
499
500 /* The number of nop instructions that we know we need in
501    prev_nop_frag.  */
502 static int prev_nop_frag_required;
503
504 /* The number of instructions we've seen since prev_nop_frag.  */
505 static int prev_nop_frag_since;
506
507 /* For ECOFF and ELF, relocations against symbols are done in two
508    parts, with a HI relocation and a LO relocation.  Each relocation
509    has only 16 bits of space to store an addend.  This means that in
510    order for the linker to handle carries correctly, it must be able
511    to locate both the HI and the LO relocation.  This means that the
512    relocations must appear in order in the relocation table.
513
514    In order to implement this, we keep track of each unmatched HI
515    relocation.  We then sort them so that they immediately precede the
516    corresponding LO relocation.  */
517
518 struct mips_hi_fixup
519 {
520   /* Next HI fixup.  */
521   struct mips_hi_fixup *next;
522   /* This fixup.  */
523   fixS *fixp;
524   /* The section this fixup is in.  */
525   segT seg;
526 };
527
528 /* The list of unmatched HI relocs.  */
529
530 static struct mips_hi_fixup *mips_hi_fixup_list;
531
532 /* Map normal MIPS register numbers to mips16 register numbers.  */
533
534 #define X ILLEGAL_REG
535 static const int mips32_to_16_reg_map[] =
536 {
537   X, X, 2, 3, 4, 5, 6, 7,
538   X, X, X, X, X, X, X, X,
539   0, 1, X, X, X, X, X, X,
540   X, X, X, X, X, X, X, X
541 };
542 #undef X
543
544 /* Map mips16 register numbers to normal MIPS register numbers.  */
545
546 static const unsigned int mips16_to_32_reg_map[] =
547 {
548   16, 17, 2, 3, 4, 5, 6, 7
549 };
550 \f
551 /* Since the MIPS does not have multiple forms of PC relative
552    instructions, we do not have to do relaxing as is done on other
553    platforms.  However, we do have to handle GP relative addressing
554    correctly, which turns out to be a similar problem.
555
556    Every macro that refers to a symbol can occur in (at least) two
557    forms, one with GP relative addressing and one without.  For
558    example, loading a global variable into a register generally uses
559    a macro instruction like this:
560      lw $4,i
561    If i can be addressed off the GP register (this is true if it is in
562    the .sbss or .sdata section, or if it is known to be smaller than
563    the -G argument) this will generate the following instruction:
564      lw $4,i($gp)
565    This instruction will use a GPREL reloc.  If i can not be addressed
566    off the GP register, the following instruction sequence will be used:
567      lui $at,i
568      lw $4,i($at)
569    In this case the first instruction will have a HI16 reloc, and the
570    second reloc will have a LO16 reloc.  Both relocs will be against
571    the symbol i.
572
573    The issue here is that we may not know whether i is GP addressable
574    until after we see the instruction that uses it.  Therefore, we
575    want to be able to choose the final instruction sequence only at
576    the end of the assembly.  This is similar to the way other
577    platforms choose the size of a PC relative instruction only at the
578    end of assembly.
579
580    When generating position independent code we do not use GP
581    addressing in quite the same way, but the issue still arises as
582    external symbols and local symbols must be handled differently.
583
584    We handle these issues by actually generating both possible
585    instruction sequences.  The longer one is put in a frag_var with
586    type rs_machine_dependent.  We encode what to do with the frag in
587    the subtype field.  We encode (1) the number of existing bytes to
588    replace, (2) the number of new bytes to use, (3) the offset from
589    the start of the existing bytes to the first reloc we must generate
590    (that is, the offset is applied from the start of the existing
591    bytes after they are replaced by the new bytes, if any), (4) the
592    offset from the start of the existing bytes to the second reloc,
593    (5) whether a third reloc is needed (the third reloc is always four
594    bytes after the second reloc), and (6) whether to warn if this
595    variant is used (this is sometimes needed if .set nomacro or .set
596    noat is in effect).  All these numbers are reasonably small.
597
598    Generating two instruction sequences must be handled carefully to
599    ensure that delay slots are handled correctly.  Fortunately, there
600    are a limited number of cases.  When the second instruction
601    sequence is generated, append_insn is directed to maintain the
602    existing delay slot information, so it continues to apply to any
603    code after the second instruction sequence.  This means that the
604    second instruction sequence must not impose any requirements not
605    required by the first instruction sequence.
606
607    These variant frags are then handled in functions called by the
608    machine independent code.  md_estimate_size_before_relax returns
609    the final size of the frag.  md_convert_frag sets up the final form
610    of the frag.  tc_gen_reloc adjust the first reloc and adds a second
611    one if needed.  */
612 #define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
613   ((relax_substateT) \
614    (((old) << 23) \
615     | ((new) << 16) \
616     | (((reloc1) + 64) << 9) \
617     | (((reloc2) + 64) << 2) \
618     | ((reloc3) ? (1 << 1) : 0) \
619     | ((warn) ? 1 : 0)))
620 #define RELAX_OLD(i) (((i) >> 23) & 0x7f)
621 #define RELAX_NEW(i) (((i) >> 16) & 0x7f)
622 #define RELAX_RELOC1(i) ((valueT) (((i) >> 9) & 0x7f) - 64)
623 #define RELAX_RELOC2(i) ((valueT) (((i) >> 2) & 0x7f) - 64)
624 #define RELAX_RELOC3(i) (((i) >> 1) & 1)
625 #define RELAX_WARN(i) ((i) & 1)
626
627 /* For mips16 code, we use an entirely different form of relaxation.
628    mips16 supports two versions of most instructions which take
629    immediate values: a small one which takes some small value, and a
630    larger one which takes a 16 bit value.  Since branches also follow
631    this pattern, relaxing these values is required.
632
633    We can assemble both mips16 and normal MIPS code in a single
634    object.  Therefore, we need to support this type of relaxation at
635    the same time that we support the relaxation described above.  We
636    use the high bit of the subtype field to distinguish these cases.
637
638    The information we store for this type of relaxation is the
639    argument code found in the opcode file for this relocation, whether
640    the user explicitly requested a small or extended form, and whether
641    the relocation is in a jump or jal delay slot.  That tells us the
642    size of the value, and how it should be stored.  We also store
643    whether the fragment is considered to be extended or not.  We also
644    store whether this is known to be a branch to a different section,
645    whether we have tried to relax this frag yet, and whether we have
646    ever extended a PC relative fragment because of a shift count.  */
647 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
648   (0x80000000                                                   \
649    | ((type) & 0xff)                                            \
650    | ((small) ? 0x100 : 0)                                      \
651    | ((ext) ? 0x200 : 0)                                        \
652    | ((dslot) ? 0x400 : 0)                                      \
653    | ((jal_dslot) ? 0x800 : 0))
654 #define RELAX_MIPS16_P(i) (((i) & 0x80000000) != 0)
655 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
656 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
657 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
658 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
659 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
660 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
661 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
662 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
663 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
664 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
665 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
666 \f
667 /* Prototypes for static functions.  */
668
669 #ifdef __STDC__
670 #define internalError() \
671     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
672 #else
673 #define internalError() as_fatal (_("MIPS internal Error"));
674 #endif
675
676 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
677
678 static int insn_uses_reg PARAMS ((struct mips_cl_insn *ip,
679                                   unsigned int reg, enum mips_regclass class));
680 static int reg_needs_delay PARAMS ((unsigned int));
681 static void mips16_mark_labels PARAMS ((void));
682 static void append_insn PARAMS ((char *place,
683                                  struct mips_cl_insn * ip,
684                                  expressionS * p,
685                                  bfd_reloc_code_real_type *r,
686                                  boolean));
687 static void mips_no_prev_insn PARAMS ((int));
688 static void mips_emit_delays PARAMS ((boolean));
689 #ifdef USE_STDARG
690 static void macro_build PARAMS ((char *place, int *counter, expressionS * ep,
691                                  const char *name, const char *fmt,
692                                  ...));
693 #else
694 static void macro_build ();
695 #endif
696 static void mips16_macro_build PARAMS ((char *, int *, expressionS *,
697                                         const char *, const char *,
698                                         va_list));
699 static void macro_build_lui PARAMS ((char *place, int *counter,
700                                      expressionS * ep, int regnum));
701 static void set_at PARAMS ((int *counter, int reg, int unsignedp));
702 static void check_absolute_expr PARAMS ((struct mips_cl_insn * ip,
703                                          expressionS *));
704 static void load_register PARAMS ((int *, int, expressionS *, int));
705 static void load_address PARAMS ((int *, int, expressionS *, int, int *));
706 static void move_register PARAMS ((int *, int, int));
707 static void macro PARAMS ((struct mips_cl_insn * ip));
708 static void mips16_macro PARAMS ((struct mips_cl_insn * ip));
709 #ifdef LOSING_COMPILER
710 static void macro2 PARAMS ((struct mips_cl_insn * ip));
711 #endif
712 static void mips_ip PARAMS ((char *str, struct mips_cl_insn * ip));
713 static void mips16_ip PARAMS ((char *str, struct mips_cl_insn * ip));
714 static void mips16_immed PARAMS ((char *, unsigned int, int, offsetT, boolean,
715                                   boolean, boolean, unsigned long *,
716                                   boolean *, unsigned short *));
717 static int my_getPercentOp PARAMS ((char **, unsigned int *, int *));
718 static int my_getSmallParser PARAMS ((char **, unsigned int *, int *));
719 static int my_getSmallExpression PARAMS ((expressionS *, char *));
720 static void my_getExpression PARAMS ((expressionS *, char *));
721 #ifdef OBJ_ELF
722 static int support_64bit_objects PARAMS((void));
723 #endif
724 static symbolS *get_symbol PARAMS ((void));
725 static void mips_align PARAMS ((int to, int fill, symbolS *label));
726 static void s_align PARAMS ((int));
727 static void s_change_sec PARAMS ((int));
728 static void s_cons PARAMS ((int));
729 static void s_float_cons PARAMS ((int));
730 static void s_mips_globl PARAMS ((int));
731 static void s_option PARAMS ((int));
732 static void s_mipsset PARAMS ((int));
733 static void s_abicalls PARAMS ((int));
734 static void s_cpload PARAMS ((int));
735 static void s_cpsetup PARAMS ((int));
736 static void s_cplocal PARAMS ((int));
737 static void s_cprestore PARAMS ((int));
738 static void s_cpreturn PARAMS ((int));
739 static void s_gpvalue PARAMS ((int));
740 static void s_gpword PARAMS ((int));
741 static void s_cpadd PARAMS ((int));
742 static void s_insn PARAMS ((int));
743 static void md_obj_begin PARAMS ((void));
744 static void md_obj_end PARAMS ((void));
745 static long get_number PARAMS ((void));
746 static void s_mips_ent PARAMS ((int));
747 static void s_mips_end PARAMS ((int));
748 static void s_mips_frame PARAMS ((int));
749 static void s_mips_mask PARAMS ((int));
750 static void s_mips_stab PARAMS ((int));
751 static void s_mips_weakext PARAMS ((int));
752 static void s_file PARAMS ((int));
753 static int mips16_extended_frag PARAMS ((fragS *, asection *, long));
754 static const char *mips_isa_to_str PARAMS ((int));
755 static const char *mips_cpu_to_str PARAMS ((int));
756 static int validate_mips_insn PARAMS ((const struct mips_opcode *));
757 static void show PARAMS ((FILE *, char *, int *, int *));
758 #ifdef OBJ_ELF
759 static int mips_need_elf_addend_fixup PARAMS ((fixS *));
760 #endif
761
762 /* Return values of my_getSmallExpression().  */
763
764 enum small_ex_type
765 {
766   S_EX_NONE = 0,
767   S_EX_REGISTER,
768
769   /* Direct relocation creation by %percent_op().  */
770   S_EX_HALF,
771   S_EX_HI,
772   S_EX_LO,
773   S_EX_GP_REL,
774   S_EX_GOT,
775   S_EX_CALL16,
776   S_EX_GOT_DISP,
777   S_EX_GOT_PAGE,
778   S_EX_GOT_OFST,
779   S_EX_GOT_HI,
780   S_EX_GOT_LO,
781   S_EX_NEG,
782   S_EX_HIGHER,
783   S_EX_HIGHEST,
784   S_EX_CALL_HI,
785   S_EX_CALL_LO
786 };
787
788 /* Table and functions used to map between CPU/ISA names, and
789    ISA levels, and CPU numbers.  */
790
791 struct mips_cpu_info
792 {
793   const char *name;           /* CPU or ISA name.  */
794   int is_isa;                 /* Is this an ISA?  (If 0, a CPU.) */
795   int isa;                    /* ISA level.  */
796   int cpu;                    /* CPU number (default CPU if ISA).  */
797 };
798
799 static const struct mips_cpu_info *mips_cpu_info_from_name PARAMS ((const char *));
800 static const struct mips_cpu_info *mips_cpu_info_from_isa PARAMS ((int));
801 static const struct mips_cpu_info *mips_cpu_info_from_cpu PARAMS ((int));
802 \f
803 /* Pseudo-op table.
804
805    The following pseudo-ops from the Kane and Heinrich MIPS book
806    should be defined here, but are currently unsupported: .alias,
807    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
808
809    The following pseudo-ops from the Kane and Heinrich MIPS book are
810    specific to the type of debugging information being generated, and
811    should be defined by the object format: .aent, .begin, .bend,
812    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
813    .vreg.
814
815    The following pseudo-ops from the Kane and Heinrich MIPS book are
816    not MIPS CPU specific, but are also not specific to the object file
817    format.  This file is probably the best place to define them, but
818    they are not currently supported: .asm0, .endr, .lab, .repeat,
819    .struct.  */
820
821 static const pseudo_typeS mips_pseudo_table[] =
822 {
823   /* MIPS specific pseudo-ops.  */
824   {"option", s_option, 0},
825   {"set", s_mipsset, 0},
826   {"rdata", s_change_sec, 'r'},
827   {"sdata", s_change_sec, 's'},
828   {"livereg", s_ignore, 0},
829   {"abicalls", s_abicalls, 0},
830   {"cpload", s_cpload, 0},
831   {"cpsetup", s_cpsetup, 0},
832   {"cplocal", s_cplocal, 0},
833   {"cprestore", s_cprestore, 0},
834   {"cpreturn", s_cpreturn, 0},
835   {"gpvalue", s_gpvalue, 0},
836   {"gpword", s_gpword, 0},
837   {"cpadd", s_cpadd, 0},
838   {"insn", s_insn, 0},
839
840   /* Relatively generic pseudo-ops that happen to be used on MIPS
841      chips.  */
842   {"asciiz", stringer, 1},
843   {"bss", s_change_sec, 'b'},
844   {"err", s_err, 0},
845   {"half", s_cons, 1},
846   {"dword", s_cons, 3},
847   {"weakext", s_mips_weakext, 0},
848
849   /* These pseudo-ops are defined in read.c, but must be overridden
850      here for one reason or another.  */
851   {"align", s_align, 0},
852   {"byte", s_cons, 0},
853   {"data", s_change_sec, 'd'},
854   {"double", s_float_cons, 'd'},
855   {"float", s_float_cons, 'f'},
856   {"globl", s_mips_globl, 0},
857   {"global", s_mips_globl, 0},
858   {"hword", s_cons, 1},
859   {"int", s_cons, 2},
860   {"long", s_cons, 2},
861   {"octa", s_cons, 4},
862   {"quad", s_cons, 3},
863   {"short", s_cons, 1},
864   {"single", s_float_cons, 'f'},
865   {"stabn", s_mips_stab, 'n'},
866   {"text", s_change_sec, 't'},
867   {"word", s_cons, 2},
868
869 #ifdef MIPS_STABS_ELF
870   { "extern", ecoff_directive_extern, 0},
871 #endif
872
873   { NULL, NULL, 0 },
874 };
875
876 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
877 {
878   /* These pseudo-ops should be defined by the object file format.
879      However, a.out doesn't support them, so we have versions here.  */
880   {"aent", s_mips_ent, 1},
881   {"bgnb", s_ignore, 0},
882   {"end", s_mips_end, 0},
883   {"endb", s_ignore, 0},
884   {"ent", s_mips_ent, 0},
885   {"file", s_file, 0},
886   {"fmask", s_mips_mask, 'F'},
887   {"frame", s_mips_frame, 0},
888   {"loc", s_ignore, 0},
889   {"mask", s_mips_mask, 'R'},
890   {"verstamp", s_ignore, 0},
891   { NULL, NULL, 0 },
892 };
893
894 extern void pop_insert PARAMS ((const pseudo_typeS *));
895
896 void
897 mips_pop_insert ()
898 {
899   pop_insert (mips_pseudo_table);
900   if (! ECOFF_DEBUGGING)
901     pop_insert (mips_nonecoff_pseudo_table);
902 }
903 \f
904 /* Symbols labelling the current insn.  */
905
906 struct insn_label_list
907 {
908   struct insn_label_list *next;
909   symbolS *label;
910 };
911
912 static struct insn_label_list *insn_labels;
913 static struct insn_label_list *free_insn_labels;
914
915 static void mips_clear_insn_labels PARAMS ((void));
916
917 static inline void
918 mips_clear_insn_labels ()
919 {
920   register struct insn_label_list **pl;
921
922   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
923     ;
924   *pl = insn_labels;
925   insn_labels = NULL;
926 }
927 \f
928 static char *expr_end;
929
930 /* Expressions which appear in instructions.  These are set by
931    mips_ip.  */
932
933 static expressionS imm_expr;
934 static expressionS offset_expr;
935
936 /* Relocs associated with imm_expr and offset_expr.  */
937
938 static bfd_reloc_code_real_type imm_reloc[3]
939   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
940 static bfd_reloc_code_real_type offset_reloc[3]
941   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
942
943 /* This is set by mips_ip if imm_reloc is an unmatched HI16_S reloc.  */
944
945 static boolean imm_unmatched_hi;
946
947 /* These are set by mips16_ip if an explicit extension is used.  */
948
949 static boolean mips16_small, mips16_ext;
950
951 #ifdef MIPS_STABS_ELF
952 /* The pdr segment for per procedure frame/regmask info */
953
954 static segT pdr_seg;
955 #endif
956
957 static const char *
958 mips_isa_to_str (isa)
959      int isa;
960 {
961   const struct mips_cpu_info *ci;
962   static char s[20];
963
964   ci = mips_cpu_info_from_isa (isa);
965   if (ci != NULL)
966     return (ci->name);
967
968   sprintf (s, "ISA#%d", isa);
969   return s;
970 }
971
972 static const char *
973 mips_cpu_to_str (cpu)
974      int cpu;
975 {
976   const struct mips_cpu_info *ci;
977   static char s[16];
978
979   ci = mips_cpu_info_from_cpu (cpu);
980   if (ci != NULL)
981     return (ci->name);
982
983   sprintf (s, "CPU#%d", cpu);
984   return s;
985 }
986
987 /* The default target format to use.  */
988
989 const char *
990 mips_target_format ()
991 {
992   switch (OUTPUT_FLAVOR)
993     {
994     case bfd_target_aout_flavour:
995       return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
996     case bfd_target_ecoff_flavour:
997       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
998     case bfd_target_coff_flavour:
999       return "pe-mips";
1000     case bfd_target_elf_flavour:
1001 #ifdef TE_TMIPS
1002       /* This is traditional mips */
1003       return (target_big_endian
1004               ? (HAVE_64BIT_OBJECTS ? "elf64-tradbigmips"
1005                  : "elf32-tradbigmips")
1006               : (HAVE_64BIT_OBJECTS ? "elf64-tradlittlemips"
1007                  : "elf32-tradlittlemips"));
1008 #else
1009       return (target_big_endian
1010               ? (HAVE_64BIT_OBJECTS ? "elf64-bigmips" : "elf32-bigmips")
1011               : (HAVE_64BIT_OBJECTS ? "elf64-littlemips"
1012                  : "elf32-littlemips"));
1013 #endif
1014     default:
1015       abort ();
1016       return NULL;
1017     }
1018 }
1019
1020 /* This function is called once, at assembler startup time.  It should
1021    set up all the tables, etc. that the MD part of the assembler will need.  */
1022
1023 void
1024 md_begin ()
1025 {
1026   register const char *retval = NULL;
1027   int i = 0;
1028   const char *cpu;
1029   char *a = NULL;
1030   int broken = 0;
1031   int mips_isa_from_cpu;
1032   int target_cpu_had_mips16 = 0;
1033   const struct mips_cpu_info *ci;
1034
1035   /* GP relative stuff not working for PE */
1036   if (strncmp (TARGET_OS, "pe", 2) == 0
1037       && g_switch_value != 0)
1038     {
1039       if (g_switch_seen)
1040         as_bad (_("-G not supported in this configuration."));
1041       g_switch_value = 0;
1042     }
1043
1044   cpu = TARGET_CPU;
1045   if (strcmp (cpu + (sizeof TARGET_CPU) - 3, "el") == 0)
1046     {
1047       a = xmalloc (sizeof TARGET_CPU);
1048       strcpy (a, TARGET_CPU);
1049       a[(sizeof TARGET_CPU) - 3] = '\0';
1050       cpu = a;
1051     }
1052
1053   if (strncmp (cpu, "mips16", sizeof "mips16" - 1) == 0)
1054     {
1055       target_cpu_had_mips16 = 1;
1056       cpu += sizeof "mips16" - 1;
1057     }
1058
1059   if (mips_opts.mips16 < 0)
1060     mips_opts.mips16 = target_cpu_had_mips16;
1061
1062   /* Backward compatibility for historic -mcpu= option.  Check for
1063      incompatible options, warn if -mcpu is used.  */
1064   if (mips_cpu != CPU_UNKNOWN
1065       && mips_arch != CPU_UNKNOWN
1066       && mips_cpu != mips_arch)
1067     {
1068       as_fatal (_("The -mcpu option can't be used together with -march. "
1069                   "Use -mtune instead of -mcpu."));
1070     }
1071
1072   if (mips_cpu != CPU_UNKNOWN
1073       && mips_tune != CPU_UNKNOWN
1074       && mips_cpu != mips_tune)
1075     {
1076       as_fatal (_("The -mcpu option can't be used together with -mtune. "
1077                   "Use -march instead of -mcpu."));
1078     }
1079
1080 #if 1
1081   /* For backward compatibility, let -mipsN set various defaults.  */
1082   /* This code should go away, to be replaced with something rather more
1083      draconian.  Until GCC 3.1 has been released for some reasonable
1084      amount of time, however, we need to support this.  */
1085   if (mips_opts.isa != ISA_UNKNOWN)
1086     {
1087       /* Translate -mipsN to the appropriate settings of file_mips_gp32
1088          and file_mips_fp32.  Tag binaries as using the mipsN ISA.  */
1089       if (file_mips_gp32 < 0)
1090         {
1091           if (ISA_HAS_64BIT_REGS (mips_opts.isa))
1092             file_mips_gp32 = 0;
1093           else
1094             file_mips_gp32 = 1;
1095         }
1096       if (file_mips_fp32 < 0)
1097         {
1098           if (ISA_HAS_64BIT_REGS (mips_opts.isa))
1099             file_mips_fp32 = 0;
1100           else
1101             file_mips_fp32 = 1;
1102         }
1103
1104       ci = mips_cpu_info_from_isa (mips_opts.isa);
1105       assert (ci != NULL);
1106       /* -mipsN has higher priority than -mcpu but lower than -march.  */
1107       if (mips_arch == CPU_UNKNOWN)
1108         mips_arch = ci->cpu;
1109
1110       /* Default mips_abi.  */
1111       if (mips_opts.abi == NO_ABI)
1112         {
1113           if (mips_opts.isa == ISA_MIPS1 || mips_opts.isa == ISA_MIPS2)
1114             mips_opts.abi = O32_ABI;
1115           else if (mips_opts.isa == ISA_MIPS3 || mips_opts.isa == ISA_MIPS4)
1116             mips_opts.abi = O64_ABI;
1117         }
1118     }
1119
1120   if (mips_arch == CPU_UNKNOWN && mips_cpu != CPU_UNKNOWN)
1121     {
1122       ci = mips_cpu_info_from_cpu (mips_cpu);
1123       assert (ci != NULL);
1124       mips_arch = ci->cpu;
1125       as_warn (_("The -mcpu option is deprecated.  Please use -march and "
1126                  "-mtune instead."));
1127     }
1128
1129   /* Set tune from -mcpu, not from -mipsN.  */
1130   if (mips_tune == CPU_UNKNOWN && mips_cpu != CPU_UNKNOWN)
1131     {
1132       ci = mips_cpu_info_from_cpu (mips_cpu);
1133       assert (ci != NULL);
1134       mips_tune = ci->cpu;
1135     }
1136
1137   /* At this point, mips_arch will either be CPU_UNKNOWN if no ARCH was
1138      specified on the command line, or some other value if one was.
1139      Similarly, mips_opts.isa will be ISA_UNKNOWN if not specified on
1140      the command line, or will be set otherwise if one was.  */
1141
1142   if (mips_arch != CPU_UNKNOWN && mips_opts.isa != ISA_UNKNOWN)
1143     /* Handled above.  */;
1144 #else
1145   if (mips_arch == CPU_UNKNOWN && mips_cpu != CPU_UNKNOWN)
1146     {
1147       ci = mips_cpu_info_from_cpu (mips_cpu);
1148       assert (ci != NULL);
1149       mips_arch = ci->cpu;
1150       as_warn (_("The -mcpu option is deprecated.  Please use -march and "
1151                  "-mtune instead."));
1152     }
1153
1154   /* At this point, mips_arch will either be CPU_UNKNOWN if no ARCH was
1155      specified on the command line, or some other value if one was.
1156      Similarly, mips_opts.isa will be ISA_UNKNOWN if not specified on
1157      the command line, or will be set otherwise if one was.  */
1158
1159   if (mips_arch != CPU_UNKNOWN && mips_opts.isa != ISA_UNKNOWN)
1160     {
1161       /* We have to check if the isa is the default isa of arch.  Otherwise
1162          we'll get invalid object file headers.  */
1163       ci = mips_cpu_info_from_cpu (mips_arch);
1164       assert (ci != NULL);
1165       if (mips_opts.isa != ci->isa)
1166         {
1167           /* This really should be an error instead of a warning, but old
1168              compilers only have -mcpu which sets both arch and tune.  For
1169              now, we discard arch and preserve tune.  */
1170           as_warn (_("The -march option is incompatible to -mipsN and "
1171                      "therefore ignored."));
1172           if (mips_tune == CPU_UNKNOWN)
1173             mips_tune = mips_arch;
1174           ci = mips_cpu_info_from_isa (mips_opts.isa);
1175           assert (ci != NULL);
1176           mips_arch = ci->cpu;
1177         }
1178     }
1179 #endif
1180   else if (mips_arch != CPU_UNKNOWN && mips_opts.isa == ISA_UNKNOWN)
1181     {
1182       /* We have ARCH, we need ISA.  */
1183       ci = mips_cpu_info_from_cpu (mips_arch);
1184       assert (ci != NULL);
1185       mips_opts.isa = ci->isa;
1186     }
1187   else if (mips_arch == CPU_UNKNOWN && mips_opts.isa != ISA_UNKNOWN)
1188     {
1189       /* We have ISA, we need default ARCH.  */
1190       ci = mips_cpu_info_from_isa (mips_opts.isa);
1191       assert (ci != NULL);
1192       mips_arch = ci->cpu;
1193     }
1194   else
1195     {
1196       /* We need to set both ISA and ARCH from target cpu.  */
1197       ci = mips_cpu_info_from_name (cpu);
1198       if (ci == NULL)
1199         ci = mips_cpu_info_from_cpu (CPU_R3000);
1200       assert (ci != NULL);
1201       mips_opts.isa = ci->isa;
1202       mips_arch = ci->cpu;
1203     }
1204
1205   if (mips_tune == CPU_UNKNOWN)
1206     mips_tune = mips_arch;
1207
1208   ci = mips_cpu_info_from_cpu (mips_arch);
1209   assert (ci != NULL);
1210   mips_isa_from_cpu = ci->isa;
1211
1212   /* End of TARGET_CPU processing, get rid of malloced memory
1213      if necessary.  */
1214   cpu = NULL;
1215   if (a != NULL)
1216     {
1217       free (a);
1218       a = NULL;
1219     }
1220
1221   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
1222     as_bad (_("trap exception not supported at ISA 1"));
1223
1224   /* Set the EABI kind based on the ISA before the user gets
1225      to change the ISA with directives.  This isn't really
1226      the best, but then neither is basing the abi on the isa.  */
1227   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
1228       && mips_opts.abi == EABI_ABI)
1229     mips_eabi64 = 1;
1230
1231   /* If they asked for mips1 or mips2 and a cpu that is
1232      mips3 or greater, then mark the object file 32BITMODE.  */
1233   if (mips_isa_from_cpu != ISA_UNKNOWN
1234       && ! ISA_HAS_64BIT_REGS (mips_opts.isa)
1235       && ISA_HAS_64BIT_REGS (mips_isa_from_cpu))
1236     mips_32bitmode = 1;
1237
1238   /* If the selected architecture includes support for ASEs, enable
1239      generation of code for them.  */
1240   if (mips_opts.ase_mips3d == -1 && CPU_HAS_MIPS3D (mips_arch))
1241     mips_opts.ase_mips3d = 1;
1242
1243   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
1244     as_warn (_("Could not set architecture and machine"));
1245
1246   if (file_mips_gp32 < 0)
1247     file_mips_gp32 = 0;
1248   if (file_mips_fp32 < 0)
1249     file_mips_fp32 = 0;
1250
1251   file_mips_isa = mips_opts.isa;
1252   file_mips_abi = mips_opts.abi;
1253   file_ase_mips3d = mips_opts.ase_mips3d;
1254   mips_opts.gp32 = file_mips_gp32;
1255   mips_opts.fp32 = file_mips_fp32;
1256
1257   op_hash = hash_new ();
1258
1259   for (i = 0; i < NUMOPCODES;)
1260     {
1261       const char *name = mips_opcodes[i].name;
1262
1263       retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
1264       if (retval != NULL)
1265         {
1266           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1267                    mips_opcodes[i].name, retval);
1268           /* Probably a memory allocation problem?  Give up now.  */
1269           as_fatal (_("Broken assembler.  No assembly attempted."));
1270         }
1271       do
1272         {
1273           if (mips_opcodes[i].pinfo != INSN_MACRO)
1274             {
1275               if (!validate_mips_insn (&mips_opcodes[i]))
1276                 broken = 1;
1277             }
1278           ++i;
1279         }
1280       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1281     }
1282
1283   mips16_op_hash = hash_new ();
1284
1285   i = 0;
1286   while (i < bfd_mips16_num_opcodes)
1287     {
1288       const char *name = mips16_opcodes[i].name;
1289
1290       retval = hash_insert (mips16_op_hash, name, (PTR) &mips16_opcodes[i]);
1291       if (retval != NULL)
1292         as_fatal (_("internal: can't hash `%s': %s"),
1293                   mips16_opcodes[i].name, retval);
1294       do
1295         {
1296           if (mips16_opcodes[i].pinfo != INSN_MACRO
1297               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1298                   != mips16_opcodes[i].match))
1299             {
1300               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1301                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1302               broken = 1;
1303             }
1304           ++i;
1305         }
1306       while (i < bfd_mips16_num_opcodes
1307              && strcmp (mips16_opcodes[i].name, name) == 0);
1308     }
1309
1310   if (broken)
1311     as_fatal (_("Broken assembler.  No assembly attempted."));
1312
1313   /* We add all the general register names to the symbol table.  This
1314      helps us detect invalid uses of them.  */
1315   for (i = 0; i < 32; i++)
1316     {
1317       char buf[5];
1318
1319       sprintf (buf, "$%d", i);
1320       symbol_table_insert (symbol_new (buf, reg_section, i,
1321                                        &zero_address_frag));
1322     }
1323   symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1324                                    &zero_address_frag));
1325   symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1326                                    &zero_address_frag));
1327   symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1328                                    &zero_address_frag));
1329   symbol_table_insert (symbol_new ("$at", reg_section, AT,
1330                                    &zero_address_frag));
1331   symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1332                                    &zero_address_frag));
1333   symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1334                                    &zero_address_frag));
1335   symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1336                                    &zero_address_frag));
1337
1338   mips_no_prev_insn (false);
1339
1340   mips_gprmask = 0;
1341   mips_cprmask[0] = 0;
1342   mips_cprmask[1] = 0;
1343   mips_cprmask[2] = 0;
1344   mips_cprmask[3] = 0;
1345
1346   /* set the default alignment for the text section (2**2) */
1347   record_alignment (text_section, 2);
1348
1349   if (USE_GLOBAL_POINTER_OPT)
1350     bfd_set_gp_size (stdoutput, g_switch_value);
1351
1352   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1353     {
1354       /* On a native system, sections must be aligned to 16 byte
1355          boundaries.  When configured for an embedded ELF target, we
1356          don't bother.  */
1357       if (strcmp (TARGET_OS, "elf") != 0)
1358         {
1359           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1360           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1361           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1362         }
1363
1364       /* Create a .reginfo section for register masks and a .mdebug
1365          section for debugging information.  */
1366       {
1367         segT seg;
1368         subsegT subseg;
1369         flagword flags;
1370         segT sec;
1371
1372         seg = now_seg;
1373         subseg = now_subseg;
1374
1375         /* The ABI says this section should be loaded so that the
1376            running program can access it.  However, we don't load it
1377            if we are configured for an embedded target */
1378         flags = SEC_READONLY | SEC_DATA;
1379         if (strcmp (TARGET_OS, "elf") != 0)
1380           flags |= SEC_ALLOC | SEC_LOAD;
1381
1382         if (! HAVE_NEWABI)
1383           {
1384             sec = subseg_new (".reginfo", (subsegT) 0);
1385
1386             (void) bfd_set_section_flags (stdoutput, sec, flags);
1387             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1388
1389 #ifdef OBJ_ELF
1390             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1391 #endif
1392           }
1393         else
1394           {
1395             /* The 64-bit ABI uses a .MIPS.options section rather than
1396                .reginfo section.  */
1397             sec = subseg_new (".MIPS.options", (subsegT) 0);
1398             (void) bfd_set_section_flags (stdoutput, sec, flags);
1399             (void) bfd_set_section_alignment (stdoutput, sec, 3);
1400
1401 #ifdef OBJ_ELF
1402             /* Set up the option header.  */
1403             {
1404               Elf_Internal_Options opthdr;
1405               char *f;
1406
1407               opthdr.kind = ODK_REGINFO;
1408               opthdr.size = (sizeof (Elf_External_Options)
1409                              + sizeof (Elf64_External_RegInfo));
1410               opthdr.section = 0;
1411               opthdr.info = 0;
1412               f = frag_more (sizeof (Elf_External_Options));
1413               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1414                                              (Elf_External_Options *) f);
1415
1416               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1417             }
1418 #endif
1419           }
1420
1421         if (ECOFF_DEBUGGING)
1422           {
1423             sec = subseg_new (".mdebug", (subsegT) 0);
1424             (void) bfd_set_section_flags (stdoutput, sec,
1425                                           SEC_HAS_CONTENTS | SEC_READONLY);
1426             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1427           }
1428
1429 #ifdef MIPS_STABS_ELF
1430         pdr_seg = subseg_new (".pdr", (subsegT) 0);
1431         (void) bfd_set_section_flags (stdoutput, pdr_seg,
1432                              SEC_READONLY | SEC_RELOC | SEC_DEBUGGING);
1433         (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1434 #endif
1435
1436         subseg_set (seg, subseg);
1437       }
1438     }
1439
1440   if (! ECOFF_DEBUGGING)
1441     md_obj_begin ();
1442 }
1443
1444 void
1445 md_mips_end ()
1446 {
1447   if (! ECOFF_DEBUGGING)
1448     md_obj_end ();
1449 }
1450
1451 void
1452 md_assemble (str)
1453      char *str;
1454 {
1455   struct mips_cl_insn insn;
1456   bfd_reloc_code_real_type unused_reloc[3]
1457     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1458
1459   imm_expr.X_op = O_absent;
1460   imm_unmatched_hi = false;
1461   offset_expr.X_op = O_absent;
1462   imm_reloc[0] = BFD_RELOC_UNUSED;
1463   imm_reloc[1] = BFD_RELOC_UNUSED;
1464   imm_reloc[2] = BFD_RELOC_UNUSED;
1465   offset_reloc[0] = BFD_RELOC_UNUSED;
1466   offset_reloc[1] = BFD_RELOC_UNUSED;
1467   offset_reloc[2] = BFD_RELOC_UNUSED;
1468
1469   if (mips_opts.mips16)
1470     mips16_ip (str, &insn);
1471   else
1472     {
1473       mips_ip (str, &insn);
1474       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1475             str, insn.insn_opcode));
1476     }
1477
1478   if (insn_error)
1479     {
1480       as_bad ("%s `%s'", insn_error, str);
1481       return;
1482     }
1483
1484   if (insn.insn_mo->pinfo == INSN_MACRO)
1485     {
1486       if (mips_opts.mips16)
1487         mips16_macro (&insn);
1488       else
1489         macro (&insn);
1490     }
1491   else
1492     {
1493       if (imm_expr.X_op != O_absent)
1494         append_insn (NULL, &insn, &imm_expr, imm_reloc, imm_unmatched_hi);
1495       else if (offset_expr.X_op != O_absent)
1496         append_insn (NULL, &insn, &offset_expr, offset_reloc, false);
1497       else
1498         append_insn (NULL, &insn, NULL, unused_reloc, false);
1499     }
1500 }
1501
1502 /* See whether instruction IP reads register REG.  CLASS is the type
1503    of register.  */
1504
1505 static int
1506 insn_uses_reg (ip, reg, class)
1507      struct mips_cl_insn *ip;
1508      unsigned int reg;
1509      enum mips_regclass class;
1510 {
1511   if (class == MIPS16_REG)
1512     {
1513       assert (mips_opts.mips16);
1514       reg = mips16_to_32_reg_map[reg];
1515       class = MIPS_GR_REG;
1516     }
1517
1518   /* Don't report on general register 0, since it never changes.  */
1519   if (class == MIPS_GR_REG && reg == 0)
1520     return 0;
1521
1522   if (class == MIPS_FP_REG)
1523     {
1524       assert (! mips_opts.mips16);
1525       /* If we are called with either $f0 or $f1, we must check $f0.
1526          This is not optimal, because it will introduce an unnecessary
1527          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
1528          need to distinguish reading both $f0 and $f1 or just one of
1529          them.  Note that we don't have to check the other way,
1530          because there is no instruction that sets both $f0 and $f1
1531          and requires a delay.  */
1532       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1533           && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1534               == (reg &~ (unsigned) 1)))
1535         return 1;
1536       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1537           && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1538               == (reg &~ (unsigned) 1)))
1539         return 1;
1540     }
1541   else if (! mips_opts.mips16)
1542     {
1543       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1544           && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1545         return 1;
1546       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1547           && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1548         return 1;
1549     }
1550   else
1551     {
1552       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1553           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1554                                     & MIPS16OP_MASK_RX)]
1555               == reg))
1556         return 1;
1557       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1558           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1559                                     & MIPS16OP_MASK_RY)]
1560               == reg))
1561         return 1;
1562       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1563           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1564                                     & MIPS16OP_MASK_MOVE32Z)]
1565               == reg))
1566         return 1;
1567       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1568         return 1;
1569       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1570         return 1;
1571       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1572         return 1;
1573       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1574           && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1575               & MIPS16OP_MASK_REGR32) == reg)
1576         return 1;
1577     }
1578
1579   return 0;
1580 }
1581
1582 /* This function returns true if modifying a register requires a
1583    delay.  */
1584
1585 static int
1586 reg_needs_delay (reg)
1587      unsigned int reg;
1588 {
1589   unsigned long prev_pinfo;
1590
1591   prev_pinfo = prev_insn.insn_mo->pinfo;
1592   if (! mips_opts.noreorder
1593       && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1594       && ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1595           || (! gpr_interlocks
1596               && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1597     {
1598       /* A load from a coprocessor or from memory.  All load
1599          delays delay the use of general register rt for one
1600          instruction on the r3000.  The r6000 and r4000 use
1601          interlocks.  */
1602       /* Itbl support may require additional care here.  */
1603       know (prev_pinfo & INSN_WRITE_GPR_T);
1604       if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1605         return 1;
1606     }
1607
1608   return 0;
1609 }
1610
1611 /* Mark instruction labels in mips16 mode.  This permits the linker to
1612    handle them specially, such as generating jalx instructions when
1613    needed.  We also make them odd for the duration of the assembly, in
1614    order to generate the right sort of code.  We will make them even
1615    in the adjust_symtab routine, while leaving them marked.  This is
1616    convenient for the debugger and the disassembler.  The linker knows
1617    to make them odd again.  */
1618
1619 static void
1620 mips16_mark_labels ()
1621 {
1622   if (mips_opts.mips16)
1623     {
1624       struct insn_label_list *l;
1625       valueT val;
1626
1627       for (l = insn_labels; l != NULL; l = l->next)
1628         {
1629 #ifdef OBJ_ELF
1630           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1631             S_SET_OTHER (l->label, STO_MIPS16);
1632 #endif
1633           val = S_GET_VALUE (l->label);
1634           if ((val & 1) == 0)
1635             S_SET_VALUE (l->label, val + 1);
1636         }
1637     }
1638 }
1639
1640 /* Output an instruction.  PLACE is where to put the instruction; if
1641    it is NULL, this uses frag_more to get room.  IP is the instruction
1642    information.  ADDRESS_EXPR is an operand of the instruction to be
1643    used with RELOC_TYPE.  */
1644
1645 static void
1646 append_insn (place, ip, address_expr, reloc_type, unmatched_hi)
1647      char *place;
1648      struct mips_cl_insn *ip;
1649      expressionS *address_expr;
1650      bfd_reloc_code_real_type *reloc_type;
1651      boolean unmatched_hi;
1652 {
1653   register unsigned long prev_pinfo, pinfo;
1654   char *f;
1655   fixS *fixp[3];
1656   int nops = 0;
1657
1658   /* Mark instruction labels in mips16 mode.  */
1659   if (mips_opts.mips16)
1660     mips16_mark_labels ();
1661
1662   prev_pinfo = prev_insn.insn_mo->pinfo;
1663   pinfo = ip->insn_mo->pinfo;
1664
1665   if (place == NULL && (! mips_opts.noreorder || prev_nop_frag != NULL))
1666     {
1667       int prev_prev_nop;
1668
1669       /* If the previous insn required any delay slots, see if we need
1670          to insert a NOP or two.  There are eight kinds of possible
1671          hazards, of which an instruction can have at most one type.
1672          (1) a load from memory delay
1673          (2) a load from a coprocessor delay
1674          (3) an unconditional branch delay
1675          (4) a conditional branch delay
1676          (5) a move to coprocessor register delay
1677          (6) a load coprocessor register from memory delay
1678          (7) a coprocessor condition code delay
1679          (8) a HI/LO special register delay
1680
1681          There are a lot of optimizations we could do that we don't.
1682          In particular, we do not, in general, reorder instructions.
1683          If you use gcc with optimization, it will reorder
1684          instructions and generally do much more optimization then we
1685          do here; repeating all that work in the assembler would only
1686          benefit hand written assembly code, and does not seem worth
1687          it.  */
1688
1689       /* This is how a NOP is emitted.  */
1690 #define emit_nop()                                      \
1691   (mips_opts.mips16                                     \
1692    ? md_number_to_chars (frag_more (2), 0x6500, 2)      \
1693    : md_number_to_chars (frag_more (4), 0, 4))
1694
1695       /* The previous insn might require a delay slot, depending upon
1696          the contents of the current insn.  */
1697       if (! mips_opts.mips16
1698           && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1699           && (((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1700                && ! cop_interlocks)
1701               || (! gpr_interlocks
1702                   && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1703         {
1704           /* A load from a coprocessor or from memory.  All load
1705              delays delay the use of general register rt for one
1706              instruction on the r3000.  The r6000 and r4000 use
1707              interlocks.  */
1708           /* Itbl support may require additional care here.  */
1709           know (prev_pinfo & INSN_WRITE_GPR_T);
1710           if (mips_optimize == 0
1711               || insn_uses_reg (ip,
1712                                 ((prev_insn.insn_opcode >> OP_SH_RT)
1713                                  & OP_MASK_RT),
1714                                 MIPS_GR_REG))
1715             ++nops;
1716         }
1717       else if (! mips_opts.mips16
1718                && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1719                && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
1720                     && ! cop_interlocks)
1721                    || (mips_opts.isa == ISA_MIPS1
1722                        && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))))
1723         {
1724           /* A generic coprocessor delay.  The previous instruction
1725              modified a coprocessor general or control register.  If
1726              it modified a control register, we need to avoid any
1727              coprocessor instruction (this is probably not always
1728              required, but it sometimes is).  If it modified a general
1729              register, we avoid using that register.
1730
1731              On the r6000 and r4000 loading a coprocessor register
1732              from memory is interlocked, and does not require a delay.
1733
1734              This case is not handled very well.  There is no special
1735              knowledge of CP0 handling, and the coprocessors other
1736              than the floating point unit are not distinguished at
1737              all.  */
1738           /* Itbl support may require additional care here. FIXME!
1739              Need to modify this to include knowledge about
1740              user specified delays!  */
1741           if (prev_pinfo & INSN_WRITE_FPR_T)
1742             {
1743               if (mips_optimize == 0
1744                   || insn_uses_reg (ip,
1745                                     ((prev_insn.insn_opcode >> OP_SH_FT)
1746                                      & OP_MASK_FT),
1747                                     MIPS_FP_REG))
1748                 ++nops;
1749             }
1750           else if (prev_pinfo & INSN_WRITE_FPR_S)
1751             {
1752               if (mips_optimize == 0
1753                   || insn_uses_reg (ip,
1754                                     ((prev_insn.insn_opcode >> OP_SH_FS)
1755                                      & OP_MASK_FS),
1756                                     MIPS_FP_REG))
1757                 ++nops;
1758             }
1759           else
1760             {
1761               /* We don't know exactly what the previous instruction
1762                  does.  If the current instruction uses a coprocessor
1763                  register, we must insert a NOP.  If previous
1764                  instruction may set the condition codes, and the
1765                  current instruction uses them, we must insert two
1766                  NOPS.  */
1767               /* Itbl support may require additional care here.  */
1768               if (mips_optimize == 0
1769                   || ((prev_pinfo & INSN_WRITE_COND_CODE)
1770                       && (pinfo & INSN_READ_COND_CODE)))
1771                 nops += 2;
1772               else if (pinfo & INSN_COP)
1773                 ++nops;
1774             }
1775         }
1776       else if (! mips_opts.mips16
1777                && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1778                && (prev_pinfo & INSN_WRITE_COND_CODE)
1779                && ! cop_interlocks)
1780         {
1781           /* The previous instruction sets the coprocessor condition
1782              codes, but does not require a general coprocessor delay
1783              (this means it is a floating point comparison
1784              instruction).  If this instruction uses the condition
1785              codes, we need to insert a single NOP.  */
1786           /* Itbl support may require additional care here.  */
1787           if (mips_optimize == 0
1788               || (pinfo & INSN_READ_COND_CODE))
1789             ++nops;
1790         }
1791
1792       /* If we're fixing up mfhi/mflo for the r7000 and the
1793          previous insn was an mfhi/mflo and the current insn
1794          reads the register that the mfhi/mflo wrote to, then
1795          insert two nops.  */
1796
1797       else if (mips_7000_hilo_fix
1798                && MF_HILO_INSN (prev_pinfo)
1799                && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
1800                                       & OP_MASK_RD),
1801                                  MIPS_GR_REG))
1802         {
1803           nops += 2;
1804         }
1805
1806       /* If we're fixing up mfhi/mflo for the r7000 and the
1807          2nd previous insn was an mfhi/mflo and the current insn
1808          reads the register that the mfhi/mflo wrote to, then
1809          insert one nop.  */
1810
1811       else if (mips_7000_hilo_fix
1812                && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1813                && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1814                                        & OP_MASK_RD),
1815                                     MIPS_GR_REG))
1816
1817         {
1818           nops += 1;
1819         }
1820
1821       else if (prev_pinfo & INSN_READ_LO)
1822         {
1823           /* The previous instruction reads the LO register; if the
1824              current instruction writes to the LO register, we must
1825              insert two NOPS.  Some newer processors have interlocks.
1826              Also the tx39's multiply instructions can be exectuted
1827              immediatly after a read from HI/LO (without the delay),
1828              though the tx39's divide insns still do require the
1829              delay.  */
1830           if (! (hilo_interlocks
1831                  || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1832               && (mips_optimize == 0
1833                   || (pinfo & INSN_WRITE_LO)))
1834             nops += 2;
1835           /* Most mips16 branch insns don't have a delay slot.
1836              If a read from LO is immediately followed by a branch
1837              to a write to LO we have a read followed by a write
1838              less than 2 insns away.  We assume the target of
1839              a branch might be a write to LO, and insert a nop
1840              between a read and an immediately following branch.  */
1841           else if (mips_opts.mips16
1842                    && (mips_optimize == 0
1843                        || (pinfo & MIPS16_INSN_BRANCH)))
1844             nops += 1;
1845         }
1846       else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1847         {
1848           /* The previous instruction reads the HI register; if the
1849              current instruction writes to the HI register, we must
1850              insert a NOP.  Some newer processors have interlocks.
1851              Also the note tx39's multiply above.  */
1852           if (! (hilo_interlocks
1853                  || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1854               && (mips_optimize == 0
1855                   || (pinfo & INSN_WRITE_HI)))
1856             nops += 2;
1857           /* Most mips16 branch insns don't have a delay slot.
1858              If a read from HI is immediately followed by a branch
1859              to a write to HI we have a read followed by a write
1860              less than 2 insns away.  We assume the target of
1861              a branch might be a write to HI, and insert a nop
1862              between a read and an immediately following branch.  */
1863           else if (mips_opts.mips16
1864                    && (mips_optimize == 0
1865                        || (pinfo & MIPS16_INSN_BRANCH)))
1866             nops += 1;
1867         }
1868
1869       /* If the previous instruction was in a noreorder section, then
1870          we don't want to insert the nop after all.  */
1871       /* Itbl support may require additional care here.  */
1872       if (prev_insn_unreordered)
1873         nops = 0;
1874
1875       /* There are two cases which require two intervening
1876          instructions: 1) setting the condition codes using a move to
1877          coprocessor instruction which requires a general coprocessor
1878          delay and then reading the condition codes 2) reading the HI
1879          or LO register and then writing to it (except on processors
1880          which have interlocks).  If we are not already emitting a NOP
1881          instruction, we must check for these cases compared to the
1882          instruction previous to the previous instruction.  */
1883       if ((! mips_opts.mips16
1884            && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1885            && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1886            && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1887            && (pinfo & INSN_READ_COND_CODE)
1888            && ! cop_interlocks)
1889           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1890               && (pinfo & INSN_WRITE_LO)
1891               && ! (hilo_interlocks
1892                     || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT))))
1893           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1894               && (pinfo & INSN_WRITE_HI)
1895               && ! (hilo_interlocks
1896                     || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))))
1897         prev_prev_nop = 1;
1898       else
1899         prev_prev_nop = 0;
1900
1901       if (prev_prev_insn_unreordered)
1902         prev_prev_nop = 0;
1903
1904       if (prev_prev_nop && nops == 0)
1905         ++nops;
1906
1907       /* If we are being given a nop instruction, don't bother with
1908          one of the nops we would otherwise output.  This will only
1909          happen when a nop instruction is used with mips_optimize set
1910          to 0.  */
1911       if (nops > 0
1912           && ! mips_opts.noreorder
1913           && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
1914         --nops;
1915
1916       /* Now emit the right number of NOP instructions.  */
1917       if (nops > 0 && ! mips_opts.noreorder)
1918         {
1919           fragS *old_frag;
1920           unsigned long old_frag_offset;
1921           int i;
1922           struct insn_label_list *l;
1923
1924           old_frag = frag_now;
1925           old_frag_offset = frag_now_fix ();
1926
1927           for (i = 0; i < nops; i++)
1928             emit_nop ();
1929
1930           if (listing)
1931             {
1932               listing_prev_line ();
1933               /* We may be at the start of a variant frag.  In case we
1934                  are, make sure there is enough space for the frag
1935                  after the frags created by listing_prev_line.  The
1936                  argument to frag_grow here must be at least as large
1937                  as the argument to all other calls to frag_grow in
1938                  this file.  We don't have to worry about being in the
1939                  middle of a variant frag, because the variants insert
1940                  all needed nop instructions themselves.  */
1941               frag_grow (40);
1942             }
1943
1944           for (l = insn_labels; l != NULL; l = l->next)
1945             {
1946               valueT val;
1947
1948               assert (S_GET_SEGMENT (l->label) == now_seg);
1949               symbol_set_frag (l->label, frag_now);
1950               val = (valueT) frag_now_fix ();
1951               /* mips16 text labels are stored as odd.  */
1952               if (mips_opts.mips16)
1953                 val += 1;
1954               S_SET_VALUE (l->label, val);
1955             }
1956
1957 #ifndef NO_ECOFF_DEBUGGING
1958           if (ECOFF_DEBUGGING)
1959             ecoff_fix_loc (old_frag, old_frag_offset);
1960 #endif
1961         }
1962       else if (prev_nop_frag != NULL)
1963         {
1964           /* We have a frag holding nops we may be able to remove.  If
1965              we don't need any nops, we can decrease the size of
1966              prev_nop_frag by the size of one instruction.  If we do
1967              need some nops, we count them in prev_nops_required.  */
1968           if (prev_nop_frag_since == 0)
1969             {
1970               if (nops == 0)
1971                 {
1972                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1973                   --prev_nop_frag_holds;
1974                 }
1975               else
1976                 prev_nop_frag_required += nops;
1977             }
1978           else
1979             {
1980               if (prev_prev_nop == 0)
1981                 {
1982                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1983                   --prev_nop_frag_holds;
1984                 }
1985               else
1986                 ++prev_nop_frag_required;
1987             }
1988
1989           if (prev_nop_frag_holds <= prev_nop_frag_required)
1990             prev_nop_frag = NULL;
1991
1992           ++prev_nop_frag_since;
1993
1994           /* Sanity check: by the time we reach the second instruction
1995              after prev_nop_frag, we should have used up all the nops
1996              one way or another.  */
1997           assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
1998         }
1999     }
2000
2001   if (*reloc_type > BFD_RELOC_UNUSED)
2002     {
2003       /* We need to set up a variant frag.  */
2004       assert (mips_opts.mips16 && address_expr != NULL);
2005       f = frag_var (rs_machine_dependent, 4, 0,
2006                     RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
2007                                          mips16_small, mips16_ext,
2008                                          (prev_pinfo
2009                                           & INSN_UNCOND_BRANCH_DELAY),
2010                                          (*prev_insn_reloc_type
2011                                           == BFD_RELOC_MIPS16_JMP)),
2012                     make_expr_symbol (address_expr), 0, NULL);
2013     }
2014   else if (place != NULL)
2015     f = place;
2016   else if (mips_opts.mips16
2017            && ! ip->use_extend
2018            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2019     {
2020       /* Make sure there is enough room to swap this instruction with
2021          a following jump instruction.  */
2022       frag_grow (6);
2023       f = frag_more (2);
2024     }
2025   else
2026     {
2027       if (mips_opts.mips16
2028           && mips_opts.noreorder
2029           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2030         as_warn (_("extended instruction in delay slot"));
2031
2032       f = frag_more (4);
2033     }
2034
2035   fixp[0] = fixp[1] = fixp[2] = NULL;
2036   if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
2037     {
2038       if (address_expr->X_op == O_constant)
2039         {
2040           unsigned long tmp;
2041
2042           switch (*reloc_type)
2043             {
2044             case BFD_RELOC_32:
2045               ip->insn_opcode |= address_expr->X_add_number;
2046               break;
2047
2048             case BFD_RELOC_MIPS_HIGHEST:
2049               tmp = (address_expr->X_add_number + 0x800080008000) >> 16;
2050               tmp >>= 16;
2051               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2052               break;
2053
2054             case BFD_RELOC_MIPS_HIGHER:
2055               tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2056               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2057               break;
2058
2059             case BFD_RELOC_HI16_S:
2060               ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2061                                   >> 16) & 0xffff;
2062               break;
2063
2064             case BFD_RELOC_HI16:
2065               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2066               break;
2067
2068             case BFD_RELOC_LO16:
2069               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2070               break;
2071
2072             case BFD_RELOC_MIPS_JMP:
2073               if ((address_expr->X_add_number & 3) != 0)
2074                 as_bad (_("jump to misaligned address (0x%lx)"),
2075                         (unsigned long) address_expr->X_add_number);
2076               if (address_expr->X_add_number & ~0xfffffff
2077                   || address_expr->X_add_number > 0x7fffffc)
2078                 as_bad (_("jump address range overflow (0x%lx)"),
2079                         (unsigned long) address_expr->X_add_number);
2080               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2081               break;
2082
2083             case BFD_RELOC_MIPS16_JMP:
2084               if ((address_expr->X_add_number & 3) != 0)
2085                 as_bad (_("jump to misaligned address (0x%lx)"),
2086                         (unsigned long) address_expr->X_add_number);
2087               if (address_expr->X_add_number & ~0xfffffff
2088                   || address_expr->X_add_number > 0x7fffffc)
2089                 as_bad (_("jump address range overflow (0x%lx)"),
2090                         (unsigned long) address_expr->X_add_number);
2091               ip->insn_opcode |=
2092                 (((address_expr->X_add_number & 0x7c0000) << 3)
2093                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2094                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2095               break;
2096
2097             case BFD_RELOC_16_PCREL:
2098               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2099               break;
2100
2101             case BFD_RELOC_16_PCREL_S2:
2102               goto need_reloc;
2103
2104             default:
2105               internalError ();
2106             }
2107         }
2108       else
2109         {
2110         need_reloc:
2111           /* Don't generate a reloc if we are writing into a variant frag.  */
2112           if (place == NULL)
2113             {
2114               fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2115                                      address_expr,
2116                                      (*reloc_type == BFD_RELOC_16_PCREL
2117                                       || *reloc_type == BFD_RELOC_16_PCREL_S2),
2118                                      reloc_type[0]);
2119
2120               /* These relocations can have an addend that won't fit in
2121                  4 octets for 64bit assembly.  */
2122               if (HAVE_64BIT_GPRS &&
2123                   (*reloc_type == BFD_RELOC_16
2124                   || *reloc_type == BFD_RELOC_32
2125                   || *reloc_type == BFD_RELOC_MIPS_JMP
2126                   || *reloc_type == BFD_RELOC_HI16_S
2127                   || *reloc_type == BFD_RELOC_LO16
2128                   || *reloc_type == BFD_RELOC_GPREL16
2129                   || *reloc_type == BFD_RELOC_MIPS_LITERAL
2130                   || *reloc_type == BFD_RELOC_GPREL32
2131                   || *reloc_type == BFD_RELOC_64
2132                   || *reloc_type == BFD_RELOC_CTOR
2133                   || *reloc_type == BFD_RELOC_MIPS_SUB
2134                   || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2135                   || *reloc_type == BFD_RELOC_MIPS_HIGHER
2136                   || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2137                   || *reloc_type == BFD_RELOC_MIPS_REL16
2138                   || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2139                 fixp[0]->fx_no_overflow = 1;
2140
2141               if (unmatched_hi)
2142                 {
2143                   struct mips_hi_fixup *hi_fixup;
2144
2145                   assert (*reloc_type == BFD_RELOC_HI16_S);
2146                   hi_fixup = ((struct mips_hi_fixup *)
2147                               xmalloc (sizeof (struct mips_hi_fixup)));
2148                   hi_fixup->fixp = fixp[0];
2149                   hi_fixup->seg = now_seg;
2150                   hi_fixup->next = mips_hi_fixup_list;
2151                   mips_hi_fixup_list = hi_fixup;
2152                 }
2153
2154               if (reloc_type[1] != BFD_RELOC_UNUSED)
2155                 {
2156                   /* FIXME: This symbol can be one of
2157                      RSS_UNDEF, RSS_GP, RSS_GP0, RSS_LOC.  */
2158                   address_expr->X_op = O_absent;
2159                   address_expr->X_add_symbol = 0;
2160                   address_expr->X_add_number = 0;
2161
2162                   fixp[1] = fix_new_exp (frag_now, f - frag_now->fr_literal,
2163                                          4, address_expr, false,
2164                                          reloc_type[1]);
2165
2166                   /* These relocations can have an addend that won't fit in
2167                      4 octets for 64bit assembly.  */
2168                   if (HAVE_64BIT_GPRS &&
2169                       (*reloc_type == BFD_RELOC_16
2170                        || *reloc_type == BFD_RELOC_32
2171                        || *reloc_type == BFD_RELOC_MIPS_JMP
2172                        || *reloc_type == BFD_RELOC_HI16_S
2173                        || *reloc_type == BFD_RELOC_LO16
2174                        || *reloc_type == BFD_RELOC_GPREL16
2175                        || *reloc_type == BFD_RELOC_MIPS_LITERAL
2176                        || *reloc_type == BFD_RELOC_GPREL32
2177                        || *reloc_type == BFD_RELOC_64
2178                        || *reloc_type == BFD_RELOC_CTOR
2179                        || *reloc_type == BFD_RELOC_MIPS_SUB
2180                        || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2181                        || *reloc_type == BFD_RELOC_MIPS_HIGHER
2182                        || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2183                        || *reloc_type == BFD_RELOC_MIPS_REL16
2184                        || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2185                      fixp[1]->fx_no_overflow = 1;
2186
2187                   if (reloc_type[2] != BFD_RELOC_UNUSED)
2188                     {
2189                       address_expr->X_op = O_absent;
2190                       address_expr->X_add_symbol = 0;
2191                       address_expr->X_add_number = 0;
2192
2193                       fixp[2] = fix_new_exp (frag_now,
2194                                              f - frag_now->fr_literal, 4,
2195                                              address_expr, false,
2196                                              reloc_type[2]);
2197
2198                       /* These relocations can have an addend that won't fit in
2199                          4 octets for 64bit assembly.  */
2200                       if (HAVE_64BIT_GPRS &&
2201                           (*reloc_type == BFD_RELOC_16
2202                            || *reloc_type == BFD_RELOC_32
2203                            || *reloc_type == BFD_RELOC_MIPS_JMP
2204                            || *reloc_type == BFD_RELOC_HI16_S
2205                            || *reloc_type == BFD_RELOC_LO16
2206                            || *reloc_type == BFD_RELOC_GPREL16
2207                            || *reloc_type == BFD_RELOC_MIPS_LITERAL
2208                            || *reloc_type == BFD_RELOC_GPREL32
2209                            || *reloc_type == BFD_RELOC_64
2210                            || *reloc_type == BFD_RELOC_CTOR
2211                            || *reloc_type == BFD_RELOC_MIPS_SUB
2212                            || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2213                            || *reloc_type == BFD_RELOC_MIPS_HIGHER
2214                            || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2215                            || *reloc_type == BFD_RELOC_MIPS_REL16
2216                            || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2217                        fixp[2]->fx_no_overflow = 1;
2218                     }
2219                 }
2220             }
2221         }
2222     }
2223
2224   if (! mips_opts.mips16)
2225     md_number_to_chars (f, ip->insn_opcode, 4);
2226   else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
2227     {
2228       md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2229       md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
2230     }
2231   else
2232     {
2233       if (ip->use_extend)
2234         {
2235           md_number_to_chars (f, 0xf000 | ip->extend, 2);
2236           f += 2;
2237         }
2238       md_number_to_chars (f, ip->insn_opcode, 2);
2239     }
2240
2241   /* Update the register mask information.  */
2242   if (! mips_opts.mips16)
2243     {
2244       if (pinfo & INSN_WRITE_GPR_D)
2245         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2246       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2247         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2248       if (pinfo & INSN_READ_GPR_S)
2249         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2250       if (pinfo & INSN_WRITE_GPR_31)
2251         mips_gprmask |= 1 << 31;
2252       if (pinfo & INSN_WRITE_FPR_D)
2253         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2254       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2255         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2256       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2257         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2258       if ((pinfo & INSN_READ_FPR_R) != 0)
2259         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2260       if (pinfo & INSN_COP)
2261         {
2262           /* We don't keep enough information to sort these cases out.
2263              The itbl support does keep this information however, although
2264              we currently don't support itbl fprmats as part of the cop
2265              instruction.  May want to add this support in the future.  */
2266         }
2267       /* Never set the bit for $0, which is always zero.  */
2268       mips_gprmask &= ~1 << 0;
2269     }
2270   else
2271     {
2272       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2273         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2274                               & MIPS16OP_MASK_RX);
2275       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2276         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2277                               & MIPS16OP_MASK_RY);
2278       if (pinfo & MIPS16_INSN_WRITE_Z)
2279         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2280                               & MIPS16OP_MASK_RZ);
2281       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2282         mips_gprmask |= 1 << TREG;
2283       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2284         mips_gprmask |= 1 << SP;
2285       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2286         mips_gprmask |= 1 << RA;
2287       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2288         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2289       if (pinfo & MIPS16_INSN_READ_Z)
2290         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2291                               & MIPS16OP_MASK_MOVE32Z);
2292       if (pinfo & MIPS16_INSN_READ_GPR_X)
2293         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2294                               & MIPS16OP_MASK_REGR32);
2295     }
2296
2297   if (place == NULL && ! mips_opts.noreorder)
2298     {
2299       /* Filling the branch delay slot is more complex.  We try to
2300          switch the branch with the previous instruction, which we can
2301          do if the previous instruction does not set up a condition
2302          that the branch tests and if the branch is not itself the
2303          target of any branch.  */
2304       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2305           || (pinfo & INSN_COND_BRANCH_DELAY))
2306         {
2307           if (mips_optimize < 2
2308               /* If we have seen .set volatile or .set nomove, don't
2309                  optimize.  */
2310               || mips_opts.nomove != 0
2311               /* If we had to emit any NOP instructions, then we
2312                  already know we can not swap.  */
2313               || nops != 0
2314               /* If we don't even know the previous insn, we can not
2315                  swap.  */
2316               || ! prev_insn_valid
2317               /* If the previous insn is already in a branch delay
2318                  slot, then we can not swap.  */
2319               || prev_insn_is_delay_slot
2320               /* If the previous previous insn was in a .set
2321                  noreorder, we can't swap.  Actually, the MIPS
2322                  assembler will swap in this situation.  However, gcc
2323                  configured -with-gnu-as will generate code like
2324                    .set noreorder
2325                    lw   $4,XXX
2326                    .set reorder
2327                    INSN
2328                    bne  $4,$0,foo
2329                  in which we can not swap the bne and INSN.  If gcc is
2330                  not configured -with-gnu-as, it does not output the
2331                  .set pseudo-ops.  We don't have to check
2332                  prev_insn_unreordered, because prev_insn_valid will
2333                  be 0 in that case.  We don't want to use
2334                  prev_prev_insn_valid, because we do want to be able
2335                  to swap at the start of a function.  */
2336               || prev_prev_insn_unreordered
2337               /* If the branch is itself the target of a branch, we
2338                  can not swap.  We cheat on this; all we check for is
2339                  whether there is a label on this instruction.  If
2340                  there are any branches to anything other than a
2341                  label, users must use .set noreorder.  */
2342               || insn_labels != NULL
2343               /* If the previous instruction is in a variant frag, we
2344                  can not do the swap.  This does not apply to the
2345                  mips16, which uses variant frags for different
2346                  purposes.  */
2347               || (! mips_opts.mips16
2348                   && prev_insn_frag->fr_type == rs_machine_dependent)
2349               /* If the branch reads the condition codes, we don't
2350                  even try to swap, because in the sequence
2351                    ctc1 $X,$31
2352                    INSN
2353                    INSN
2354                    bc1t LABEL
2355                  we can not swap, and I don't feel like handling that
2356                  case.  */
2357               || (! mips_opts.mips16
2358                   && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2359                   && (pinfo & INSN_READ_COND_CODE))
2360               /* We can not swap with an instruction that requires a
2361                  delay slot, becase the target of the branch might
2362                  interfere with that instruction.  */
2363               || (! mips_opts.mips16
2364                   && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2365                   && (prev_pinfo
2366               /* Itbl support may require additional care here.  */
2367                       & (INSN_LOAD_COPROC_DELAY
2368                          | INSN_COPROC_MOVE_DELAY
2369                          | INSN_WRITE_COND_CODE)))
2370               || (! (hilo_interlocks
2371                      || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
2372                   && (prev_pinfo
2373                       & (INSN_READ_LO
2374                          | INSN_READ_HI)))
2375               || (! mips_opts.mips16
2376                   && ! gpr_interlocks
2377                   && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))
2378               || (! mips_opts.mips16
2379                   && mips_opts.isa == ISA_MIPS1
2380                   /* Itbl support may require additional care here.  */
2381                   && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))
2382               /* We can not swap with a branch instruction.  */
2383               || (prev_pinfo
2384                   & (INSN_UNCOND_BRANCH_DELAY
2385                      | INSN_COND_BRANCH_DELAY
2386                      | INSN_COND_BRANCH_LIKELY))
2387               /* We do not swap with a trap instruction, since it
2388                  complicates trap handlers to have the trap
2389                  instruction be in a delay slot.  */
2390               || (prev_pinfo & INSN_TRAP)
2391               /* If the branch reads a register that the previous
2392                  instruction sets, we can not swap.  */
2393               || (! mips_opts.mips16
2394                   && (prev_pinfo & INSN_WRITE_GPR_T)
2395                   && insn_uses_reg (ip,
2396                                     ((prev_insn.insn_opcode >> OP_SH_RT)
2397                                      & OP_MASK_RT),
2398                                     MIPS_GR_REG))
2399               || (! mips_opts.mips16
2400                   && (prev_pinfo & INSN_WRITE_GPR_D)
2401                   && insn_uses_reg (ip,
2402                                     ((prev_insn.insn_opcode >> OP_SH_RD)
2403                                      & OP_MASK_RD),
2404                                     MIPS_GR_REG))
2405               || (mips_opts.mips16
2406                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2407                        && insn_uses_reg (ip,
2408                                          ((prev_insn.insn_opcode
2409                                            >> MIPS16OP_SH_RX)
2410                                           & MIPS16OP_MASK_RX),
2411                                          MIPS16_REG))
2412                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2413                           && insn_uses_reg (ip,
2414                                             ((prev_insn.insn_opcode
2415                                               >> MIPS16OP_SH_RY)
2416                                              & MIPS16OP_MASK_RY),
2417                                             MIPS16_REG))
2418                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2419                           && insn_uses_reg (ip,
2420                                             ((prev_insn.insn_opcode
2421                                               >> MIPS16OP_SH_RZ)
2422                                              & MIPS16OP_MASK_RZ),
2423                                             MIPS16_REG))
2424                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2425                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2426                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2427                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
2428                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2429                           && insn_uses_reg (ip,
2430                                             MIPS16OP_EXTRACT_REG32R (prev_insn.
2431                                                                      insn_opcode),
2432                                             MIPS_GR_REG))))
2433               /* If the branch writes a register that the previous
2434                  instruction sets, we can not swap (we know that
2435                  branches write only to RD or to $31).  */
2436               || (! mips_opts.mips16
2437                   && (prev_pinfo & INSN_WRITE_GPR_T)
2438                   && (((pinfo & INSN_WRITE_GPR_D)
2439                        && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2440                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2441                       || ((pinfo & INSN_WRITE_GPR_31)
2442                           && (((prev_insn.insn_opcode >> OP_SH_RT)
2443                                & OP_MASK_RT)
2444                               == 31))))
2445               || (! mips_opts.mips16
2446                   && (prev_pinfo & INSN_WRITE_GPR_D)
2447                   && (((pinfo & INSN_WRITE_GPR_D)
2448                        && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2449                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2450                       || ((pinfo & INSN_WRITE_GPR_31)
2451                           && (((prev_insn.insn_opcode >> OP_SH_RD)
2452                                & OP_MASK_RD)
2453                               == 31))))
2454               || (mips_opts.mips16
2455                   && (pinfo & MIPS16_INSN_WRITE_31)
2456                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2457                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2458                           && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2459                               == RA))))
2460               /* If the branch writes a register that the previous
2461                  instruction reads, we can not swap (we know that
2462                  branches only write to RD or to $31).  */
2463               || (! mips_opts.mips16
2464                   && (pinfo & INSN_WRITE_GPR_D)
2465                   && insn_uses_reg (&prev_insn,
2466                                     ((ip->insn_opcode >> OP_SH_RD)
2467                                      & OP_MASK_RD),
2468                                     MIPS_GR_REG))
2469               || (! mips_opts.mips16
2470                   && (pinfo & INSN_WRITE_GPR_31)
2471                   && insn_uses_reg (&prev_insn, 31, MIPS_GR_REG))
2472               || (mips_opts.mips16
2473                   && (pinfo & MIPS16_INSN_WRITE_31)
2474                   && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2475               /* If we are generating embedded PIC code, the branch
2476                  might be expanded into a sequence which uses $at, so
2477                  we can't swap with an instruction which reads it.  */
2478               || (mips_pic == EMBEDDED_PIC
2479                   && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2480               /* If the previous previous instruction has a load
2481                  delay, and sets a register that the branch reads, we
2482                  can not swap.  */
2483               || (! mips_opts.mips16
2484                   && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2485               /* Itbl support may require additional care here.  */
2486                   && ((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2487                       || (! gpr_interlocks
2488                           && (prev_prev_insn.insn_mo->pinfo
2489                               & INSN_LOAD_MEMORY_DELAY)))
2490                   && insn_uses_reg (ip,
2491                                     ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2492                                      & OP_MASK_RT),
2493                                     MIPS_GR_REG))
2494               /* If one instruction sets a condition code and the
2495                  other one uses a condition code, we can not swap.  */
2496               || ((pinfo & INSN_READ_COND_CODE)
2497                   && (prev_pinfo & INSN_WRITE_COND_CODE))
2498               || ((pinfo & INSN_WRITE_COND_CODE)
2499                   && (prev_pinfo & INSN_READ_COND_CODE))
2500               /* If the previous instruction uses the PC, we can not
2501                  swap.  */
2502               || (mips_opts.mips16
2503                   && (prev_pinfo & MIPS16_INSN_READ_PC))
2504               /* If the previous instruction was extended, we can not
2505                  swap.  */
2506               || (mips_opts.mips16 && prev_insn_extended)
2507               /* If the previous instruction had a fixup in mips16
2508                  mode, we can not swap.  This normally means that the
2509                  previous instruction was a 4 byte branch anyhow.  */
2510               || (mips_opts.mips16 && prev_insn_fixp[0])
2511               /* If the previous instruction is a sync, sync.l, or
2512                  sync.p, we can not swap.  */
2513               || (prev_pinfo & INSN_SYNC))
2514             {
2515               /* We could do even better for unconditional branches to
2516                  portions of this object file; we could pick up the
2517                  instruction at the destination, put it in the delay
2518                  slot, and bump the destination address.  */
2519               emit_nop ();
2520               /* Update the previous insn information.  */
2521               prev_prev_insn = *ip;
2522               prev_insn.insn_mo = &dummy_opcode;
2523             }
2524           else
2525             {
2526               /* It looks like we can actually do the swap.  */
2527               if (! mips_opts.mips16)
2528                 {
2529                   char *prev_f;
2530                   char temp[4];
2531
2532                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2533                   memcpy (temp, prev_f, 4);
2534                   memcpy (prev_f, f, 4);
2535                   memcpy (f, temp, 4);
2536                   if (prev_insn_fixp[0])
2537                     {
2538                       prev_insn_fixp[0]->fx_frag = frag_now;
2539                       prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2540                     }
2541                   if (prev_insn_fixp[1])
2542                     {
2543                       prev_insn_fixp[1]->fx_frag = frag_now;
2544                       prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2545                     }
2546                   if (prev_insn_fixp[2])
2547                     {
2548                       prev_insn_fixp[2]->fx_frag = frag_now;
2549                       prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
2550                     }
2551                   if (fixp[0])
2552                     {
2553                       fixp[0]->fx_frag = prev_insn_frag;
2554                       fixp[0]->fx_where = prev_insn_where;
2555                     }
2556                   if (fixp[1])
2557                     {
2558                       fixp[1]->fx_frag = prev_insn_frag;
2559                       fixp[1]->fx_where = prev_insn_where;
2560                     }
2561                   if (fixp[2])
2562                     {
2563                       fixp[2]->fx_frag = prev_insn_frag;
2564                       fixp[2]->fx_where = prev_insn_where;
2565                     }
2566                 }
2567               else
2568                 {
2569                   char *prev_f;
2570                   char temp[2];
2571
2572                   assert (prev_insn_fixp[0] == NULL);
2573                   assert (prev_insn_fixp[1] == NULL);
2574                   assert (prev_insn_fixp[2] == NULL);
2575                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2576                   memcpy (temp, prev_f, 2);
2577                   memcpy (prev_f, f, 2);
2578                   if (*reloc_type != BFD_RELOC_MIPS16_JMP)
2579                     {
2580                       assert (*reloc_type == BFD_RELOC_UNUSED);
2581                       memcpy (f, temp, 2);
2582                     }
2583                   else
2584                     {
2585                       memcpy (f, f + 2, 2);
2586                       memcpy (f + 2, temp, 2);
2587                     }
2588                   if (fixp[0])
2589                     {
2590                       fixp[0]->fx_frag = prev_insn_frag;
2591                       fixp[0]->fx_where = prev_insn_where;
2592                     }
2593                   if (fixp[1])
2594                     {
2595                       fixp[1]->fx_frag = prev_insn_frag;
2596                       fixp[1]->fx_where = prev_insn_where;
2597                     }
2598                   if (fixp[2])
2599                     {
2600                       fixp[2]->fx_frag = prev_insn_frag;
2601                       fixp[2]->fx_where = prev_insn_where;
2602                     }
2603                 }
2604
2605               /* Update the previous insn information; leave prev_insn
2606                  unchanged.  */
2607               prev_prev_insn = *ip;
2608             }
2609           prev_insn_is_delay_slot = 1;
2610
2611           /* If that was an unconditional branch, forget the previous
2612              insn information.  */
2613           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2614             {
2615               prev_prev_insn.insn_mo = &dummy_opcode;
2616               prev_insn.insn_mo = &dummy_opcode;
2617             }
2618
2619           prev_insn_fixp[0] = NULL;
2620           prev_insn_fixp[1] = NULL;
2621           prev_insn_fixp[2] = NULL;
2622           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2623           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2624           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2625           prev_insn_extended = 0;
2626         }
2627       else if (pinfo & INSN_COND_BRANCH_LIKELY)
2628         {
2629           /* We don't yet optimize a branch likely.  What we should do
2630              is look at the target, copy the instruction found there
2631              into the delay slot, and increment the branch to jump to
2632              the next instruction.  */
2633           emit_nop ();
2634           /* Update the previous insn information.  */
2635           prev_prev_insn = *ip;
2636           prev_insn.insn_mo = &dummy_opcode;
2637           prev_insn_fixp[0] = NULL;
2638           prev_insn_fixp[1] = NULL;
2639           prev_insn_fixp[2] = NULL;
2640           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2641           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2642           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2643           prev_insn_extended = 0;
2644         }
2645       else
2646         {
2647           /* Update the previous insn information.  */
2648           if (nops > 0)
2649             prev_prev_insn.insn_mo = &dummy_opcode;
2650           else
2651             prev_prev_insn = prev_insn;
2652           prev_insn = *ip;
2653
2654           /* Any time we see a branch, we always fill the delay slot
2655              immediately; since this insn is not a branch, we know it
2656              is not in a delay slot.  */
2657           prev_insn_is_delay_slot = 0;
2658
2659           prev_insn_fixp[0] = fixp[0];
2660           prev_insn_fixp[1] = fixp[1];
2661           prev_insn_fixp[2] = fixp[2];
2662           prev_insn_reloc_type[0] = reloc_type[0];
2663           prev_insn_reloc_type[1] = reloc_type[1];
2664           prev_insn_reloc_type[2] = reloc_type[2];
2665           if (mips_opts.mips16)
2666             prev_insn_extended = (ip->use_extend
2667                                   || *reloc_type > BFD_RELOC_UNUSED);
2668         }
2669
2670       prev_prev_insn_unreordered = prev_insn_unreordered;
2671       prev_insn_unreordered = 0;
2672       prev_insn_frag = frag_now;
2673       prev_insn_where = f - frag_now->fr_literal;
2674       prev_insn_valid = 1;
2675     }
2676   else if (place == NULL)
2677     {
2678       /* We need to record a bit of information even when we are not
2679          reordering, in order to determine the base address for mips16
2680          PC relative relocs.  */
2681       prev_prev_insn = prev_insn;
2682       prev_insn = *ip;
2683       prev_insn_reloc_type[0] = reloc_type[0];
2684       prev_insn_reloc_type[1] = reloc_type[1];
2685       prev_insn_reloc_type[2] = reloc_type[2];
2686       prev_prev_insn_unreordered = prev_insn_unreordered;
2687       prev_insn_unreordered = 1;
2688     }
2689
2690   /* We just output an insn, so the next one doesn't have a label.  */
2691   mips_clear_insn_labels ();
2692
2693   /* We must ensure that a fixup associated with an unmatched %hi
2694      reloc does not become a variant frag.  Otherwise, the
2695      rearrangement of %hi relocs in frob_file may confuse
2696      tc_gen_reloc.  */
2697   if (unmatched_hi)
2698     {
2699       frag_wane (frag_now);
2700       frag_new (0);
2701     }
2702 }
2703
2704 /* This function forgets that there was any previous instruction or
2705    label.  If PRESERVE is non-zero, it remembers enough information to
2706    know whether nops are needed before a noreorder section.  */
2707
2708 static void
2709 mips_no_prev_insn (preserve)
2710      int preserve;
2711 {
2712   if (! preserve)
2713     {
2714       prev_insn.insn_mo = &dummy_opcode;
2715       prev_prev_insn.insn_mo = &dummy_opcode;
2716       prev_nop_frag = NULL;
2717       prev_nop_frag_holds = 0;
2718       prev_nop_frag_required = 0;
2719       prev_nop_frag_since = 0;
2720     }
2721   prev_insn_valid = 0;
2722   prev_insn_is_delay_slot = 0;
2723   prev_insn_unreordered = 0;
2724   prev_insn_extended = 0;
2725   prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2726   prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2727   prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2728   prev_prev_insn_unreordered = 0;
2729   mips_clear_insn_labels ();
2730 }
2731
2732 /* This function must be called whenever we turn on noreorder or emit
2733    something other than instructions.  It inserts any NOPS which might
2734    be needed by the previous instruction, and clears the information
2735    kept for the previous instructions.  The INSNS parameter is true if
2736    instructions are to follow.  */
2737
2738 static void
2739 mips_emit_delays (insns)
2740      boolean insns;
2741 {
2742   if (! mips_opts.noreorder)
2743     {
2744       int nops;
2745
2746       nops = 0;
2747       if ((! mips_opts.mips16
2748            && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2749            && (! cop_interlocks
2750                && (prev_insn.insn_mo->pinfo
2751                    & (INSN_LOAD_COPROC_DELAY
2752                       | INSN_COPROC_MOVE_DELAY
2753                       | INSN_WRITE_COND_CODE))))
2754           || (! hilo_interlocks
2755               && (prev_insn.insn_mo->pinfo
2756                   & (INSN_READ_LO
2757                      | INSN_READ_HI)))
2758           || (! mips_opts.mips16
2759               && ! gpr_interlocks
2760               && (prev_insn.insn_mo->pinfo
2761                   & INSN_LOAD_MEMORY_DELAY))
2762           || (! mips_opts.mips16
2763               && mips_opts.isa == ISA_MIPS1
2764               && (prev_insn.insn_mo->pinfo
2765                   & INSN_COPROC_MEMORY_DELAY)))
2766         {
2767           /* Itbl support may require additional care here.  */
2768           ++nops;
2769           if ((! mips_opts.mips16
2770                && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2771                && (! cop_interlocks
2772                    && prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2773               || (! hilo_interlocks
2774                   && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2775                       || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2776             ++nops;
2777
2778           if (prev_insn_unreordered)
2779             nops = 0;
2780         }
2781       else if ((! mips_opts.mips16
2782                 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2783                 && (! cop_interlocks
2784                     && prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2785                || (! hilo_interlocks
2786                    && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2787                        || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2788         {
2789           /* Itbl support may require additional care here.  */
2790           if (! prev_prev_insn_unreordered)
2791             ++nops;
2792         }
2793
2794       if (nops > 0)
2795         {
2796           struct insn_label_list *l;
2797
2798           if (insns)
2799             {
2800               /* Record the frag which holds the nop instructions, so
2801                  that we can remove them if we don't need them.  */
2802               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2803               prev_nop_frag = frag_now;
2804               prev_nop_frag_holds = nops;
2805               prev_nop_frag_required = 0;
2806               prev_nop_frag_since = 0;
2807             }
2808
2809           for (; nops > 0; --nops)
2810             emit_nop ();
2811
2812           if (insns)
2813             {
2814               /* Move on to a new frag, so that it is safe to simply
2815                  decrease the size of prev_nop_frag.  */
2816               frag_wane (frag_now);
2817               frag_new (0);
2818             }
2819
2820           for (l = insn_labels; l != NULL; l = l->next)
2821             {
2822               valueT val;
2823
2824               assert (S_GET_SEGMENT (l->label) == now_seg);
2825               symbol_set_frag (l->label, frag_now);
2826               val = (valueT) frag_now_fix ();
2827               /* mips16 text labels are stored as odd.  */
2828               if (mips_opts.mips16)
2829                 val += 1;
2830               S_SET_VALUE (l->label, val);
2831             }
2832         }
2833     }
2834
2835   /* Mark instruction labels in mips16 mode.  */
2836   if (mips_opts.mips16 && insns)
2837     mips16_mark_labels ();
2838
2839   mips_no_prev_insn (insns);
2840 }
2841
2842 /* Build an instruction created by a macro expansion.  This is passed
2843    a pointer to the count of instructions created so far, an
2844    expression, the name of the instruction to build, an operand format
2845    string, and corresponding arguments.  */
2846
2847 #ifdef USE_STDARG
2848 static void
2849 macro_build (char *place,
2850              int *counter,
2851              expressionS * ep,
2852              const char *name,
2853              const char *fmt,
2854              ...)
2855 #else
2856 static void
2857 macro_build (place, counter, ep, name, fmt, va_alist)
2858      char *place;
2859      int *counter;
2860      expressionS *ep;
2861      const char *name;
2862      const char *fmt;
2863      va_dcl
2864 #endif
2865 {
2866   struct mips_cl_insn insn;
2867   bfd_reloc_code_real_type r[3];
2868   va_list args;
2869
2870 #ifdef USE_STDARG
2871   va_start (args, fmt);
2872 #else
2873   va_start (args);
2874 #endif
2875
2876   /*
2877    * If the macro is about to expand into a second instruction,
2878    * print a warning if needed. We need to pass ip as a parameter
2879    * to generate a better warning message here...
2880    */
2881   if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
2882     as_warn (_("Macro instruction expanded into multiple instructions"));
2883
2884   if (place == NULL)
2885     *counter += 1;              /* bump instruction counter */
2886
2887   if (mips_opts.mips16)
2888     {
2889       mips16_macro_build (place, counter, ep, name, fmt, args);
2890       va_end (args);
2891       return;
2892     }
2893
2894   r[0] = BFD_RELOC_UNUSED;
2895   r[1] = BFD_RELOC_UNUSED;
2896   r[2] = BFD_RELOC_UNUSED;
2897   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2898   assert (insn.insn_mo);
2899   assert (strcmp (name, insn.insn_mo->name) == 0);
2900
2901   /* Search until we get a match for NAME.  */
2902   while (1)
2903     {
2904       if (strcmp (fmt, insn.insn_mo->args) == 0
2905           && insn.insn_mo->pinfo != INSN_MACRO
2906           && OPCODE_IS_MEMBER (insn.insn_mo,
2907                                (mips_opts.isa
2908                                 | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
2909                                mips_arch)
2910           && (mips_arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
2911         break;
2912
2913       ++insn.insn_mo;
2914       assert (insn.insn_mo->name);
2915       assert (strcmp (name, insn.insn_mo->name) == 0);
2916     }
2917
2918   insn.insn_opcode = insn.insn_mo->match;
2919   for (;;)
2920     {
2921       switch (*fmt++)
2922         {
2923         case '\0':
2924           break;
2925
2926         case ',':
2927         case '(':
2928         case ')':
2929           continue;
2930
2931         case 't':
2932         case 'w':
2933         case 'E':
2934           insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
2935           continue;
2936
2937         case 'c':
2938           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
2939           continue;
2940
2941         case 'T':
2942         case 'W':
2943           insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
2944           continue;
2945
2946         case 'd':
2947         case 'G':
2948           insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
2949           continue;
2950
2951         case 'U':
2952           {
2953             int tmp = va_arg (args, int);
2954
2955             insn.insn_opcode |= tmp << OP_SH_RT;
2956             insn.insn_opcode |= tmp << OP_SH_RD;
2957             continue;
2958           }
2959
2960         case 'V':
2961         case 'S':
2962           insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
2963           continue;
2964
2965         case 'z':
2966           continue;
2967
2968         case '<':
2969           insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
2970           continue;
2971
2972         case 'D':
2973           insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
2974           continue;
2975
2976         case 'B':
2977           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
2978           continue;
2979
2980         case 'J':
2981           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
2982           continue;
2983
2984         case 'q':
2985           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
2986           continue;
2987
2988         case 'b':
2989         case 's':
2990         case 'r':
2991         case 'v':
2992           insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
2993           continue;
2994
2995         case 'i':
2996         case 'j':
2997         case 'o':
2998           *r = (bfd_reloc_code_real_type) va_arg (args, int);
2999           assert (*r == BFD_RELOC_GPREL16
3000                   || *r == BFD_RELOC_MIPS_LITERAL
3001                   || *r == BFD_RELOC_MIPS_HIGHER
3002                   || *r == BFD_RELOC_HI16_S
3003                   || *r == BFD_RELOC_LO16
3004                   || *r == BFD_RELOC_MIPS_GOT16
3005                   || *r == BFD_RELOC_MIPS_CALL16
3006                   || *r == BFD_RELOC_MIPS_GOT_LO16
3007                   || *r == BFD_RELOC_MIPS_CALL_LO16
3008                   || (ep->X_op == O_subtract
3009                       && *r == BFD_RELOC_PCREL_LO16));
3010           continue;
3011
3012         case 'u':
3013           *r = (bfd_reloc_code_real_type) va_arg (args, int);
3014           assert (ep != NULL
3015                   && (ep->X_op == O_constant
3016                       || (ep->X_op == O_symbol
3017                           && (*r == BFD_RELOC_MIPS_HIGHEST
3018                               || *r == BFD_RELOC_HI16_S
3019                               || *r == BFD_RELOC_HI16
3020                               || *r == BFD_RELOC_GPREL16
3021                               || *r == BFD_RELOC_MIPS_GOT_HI16
3022                               || *r == BFD_RELOC_MIPS_CALL_HI16))
3023                       || (ep->X_op == O_subtract
3024                           && *r == BFD_RELOC_PCREL_HI16_S)));
3025           continue;
3026
3027         case 'p':
3028           assert (ep != NULL);
3029           /*
3030            * This allows macro() to pass an immediate expression for
3031            * creating short branches without creating a symbol.
3032            * Note that the expression still might come from the assembly
3033            * input, in which case the value is not checked for range nor
3034            * is a relocation entry generated (yuck).
3035            */
3036           if (ep->X_op == O_constant)
3037             {
3038               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3039               ep = NULL;
3040             }
3041           else
3042             if (mips_pic == EMBEDDED_PIC)
3043               *r = BFD_RELOC_16_PCREL_S2;
3044             else
3045               *r = BFD_RELOC_16_PCREL;
3046           continue;
3047
3048         case 'a':
3049           assert (ep != NULL);
3050           *r = BFD_RELOC_MIPS_JMP;
3051           continue;
3052
3053         case 'C':
3054           insn.insn_opcode |= va_arg (args, unsigned long);
3055           continue;
3056
3057         default:
3058           internalError ();
3059         }
3060       break;
3061     }
3062   va_end (args);
3063   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3064
3065   append_insn (place, &insn, ep, r, false);
3066 }
3067
3068 static void
3069 mips16_macro_build (place, counter, ep, name, fmt, args)
3070      char *place;
3071      int *counter ATTRIBUTE_UNUSED;
3072      expressionS *ep;
3073      const char *name;
3074      const char *fmt;
3075      va_list args;
3076 {
3077   struct mips_cl_insn insn;
3078   bfd_reloc_code_real_type r[3]
3079     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3080
3081   insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3082   assert (insn.insn_mo);
3083   assert (strcmp (name, insn.insn_mo->name) == 0);
3084
3085   while (strcmp (fmt, insn.insn_mo->args) != 0
3086          || insn.insn_mo->pinfo == INSN_MACRO)
3087     {
3088       ++insn.insn_mo;
3089       assert (insn.insn_mo->name);
3090       assert (strcmp (name, insn.insn_mo->name) == 0);
3091     }
3092
3093   insn.insn_opcode = insn.insn_mo->match;
3094   insn.use_extend = false;
3095
3096   for (;;)
3097     {
3098       int c;
3099
3100       c = *fmt++;
3101       switch (c)
3102         {
3103         case '\0':
3104           break;
3105
3106         case ',':
3107         case '(':
3108         case ')':
3109           continue;
3110
3111         case 'y':
3112         case 'w':
3113           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3114           continue;
3115
3116         case 'x':
3117         case 'v':
3118           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3119           continue;
3120
3121         case 'z':
3122           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3123           continue;
3124
3125         case 'Z':
3126           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3127           continue;
3128
3129         case '0':
3130         case 'S':
3131         case 'P':
3132         case 'R':
3133           continue;
3134
3135         case 'X':
3136           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3137           continue;
3138
3139         case 'Y':
3140           {
3141             int regno;
3142
3143             regno = va_arg (args, int);
3144             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3145             insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3146           }
3147           continue;
3148
3149         case '<':
3150         case '>':
3151         case '4':
3152         case '5':
3153         case 'H':
3154         case 'W':
3155         case 'D':
3156         case 'j':
3157         case '8':
3158         case 'V':
3159         case 'C':
3160         case 'U':
3161         case 'k':
3162         case 'K':
3163         case 'p':
3164         case 'q':
3165           {
3166             assert (ep != NULL);
3167
3168             if (ep->X_op != O_constant)
3169               *r = (int) BFD_RELOC_UNUSED + c;
3170             else
3171               {
3172                 mips16_immed (NULL, 0, c, ep->X_add_number, false, false,
3173                               false, &insn.insn_opcode, &insn.use_extend,
3174                               &insn.extend);
3175                 ep = NULL;
3176                 *r = BFD_RELOC_UNUSED;
3177               }
3178           }
3179           continue;
3180
3181         case '6':
3182           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3183           continue;
3184         }
3185
3186       break;
3187     }
3188
3189   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3190
3191   append_insn (place, &insn, ep, r, false);
3192 }
3193
3194 /*
3195  * Generate a "lui" instruction.
3196  */
3197 static void
3198 macro_build_lui (place, counter, ep, regnum)
3199      char *place;
3200      int *counter;
3201      expressionS *ep;
3202      int regnum;
3203 {
3204   expressionS high_expr;
3205   struct mips_cl_insn insn;
3206   bfd_reloc_code_real_type r[3]
3207     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3208   CONST char *name = "lui";
3209   CONST char *fmt = "t,u";
3210
3211   assert (! mips_opts.mips16);
3212
3213   if (place == NULL)
3214     high_expr = *ep;
3215   else
3216     {
3217       high_expr.X_op = O_constant;
3218       high_expr.X_add_number = ep->X_add_number;
3219     }
3220
3221   if (high_expr.X_op == O_constant)
3222     {
3223       /* we can compute the instruction now without a relocation entry */
3224       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3225                                 >> 16) & 0xffff;
3226       *r = BFD_RELOC_UNUSED;
3227     }
3228   else if (! HAVE_NEWABI)
3229     {
3230       assert (ep->X_op == O_symbol);
3231       /* _gp_disp is a special case, used from s_cpload.  */
3232       assert (mips_pic == NO_PIC
3233               || strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0);
3234       *r = BFD_RELOC_HI16_S;
3235     }
3236
3237   /*
3238    * If the macro is about to expand into a second instruction,
3239    * print a warning if needed. We need to pass ip as a parameter
3240    * to generate a better warning message here...
3241    */
3242   if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
3243     as_warn (_("Macro instruction expanded into multiple instructions"));
3244
3245   if (place == NULL)
3246     *counter += 1;              /* bump instruction counter */
3247
3248   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3249   assert (insn.insn_mo);
3250   assert (strcmp (name, insn.insn_mo->name) == 0);
3251   assert (strcmp (fmt, insn.insn_mo->args) == 0);
3252
3253   insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
3254   if (*r == BFD_RELOC_UNUSED)
3255     {
3256       insn.insn_opcode |= high_expr.X_add_number;
3257       append_insn (place, &insn, NULL, r, false);
3258     }
3259   else
3260     append_insn (place, &insn, &high_expr, r, false);
3261 }
3262
3263 /*                      set_at()
3264  * Generates code to set the $at register to true (one)
3265  * if reg is less than the immediate expression.
3266  */
3267 static void
3268 set_at (counter, reg, unsignedp)
3269      int *counter;
3270      int reg;
3271      int unsignedp;
3272 {
3273   if (imm_expr.X_op == O_constant
3274       && imm_expr.X_add_number >= -0x8000
3275       && imm_expr.X_add_number < 0x8000)
3276     macro_build ((char *) NULL, counter, &imm_expr,
3277                  unsignedp ? "sltiu" : "slti",
3278                  "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
3279   else
3280     {
3281       load_register (counter, AT, &imm_expr, HAVE_64BIT_GPRS);
3282       macro_build ((char *) NULL, counter, (expressionS *) NULL,
3283                    unsignedp ? "sltu" : "slt",
3284                    "d,v,t", AT, reg, AT);
3285     }
3286 }
3287
3288 /* Warn if an expression is not a constant.  */
3289
3290 static void
3291 check_absolute_expr (ip, ex)
3292      struct mips_cl_insn *ip;
3293      expressionS *ex;
3294 {
3295   if (ex->X_op == O_big)
3296     as_bad (_("unsupported large constant"));
3297   else if (ex->X_op != O_constant)
3298     as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3299 }
3300
3301 /* Count the leading zeroes by performing a binary chop. This is a
3302    bulky bit of source, but performance is a LOT better for the
3303    majority of values than a simple loop to count the bits:
3304        for (lcnt = 0; (lcnt < 32); lcnt++)
3305          if ((v) & (1 << (31 - lcnt)))
3306            break;
3307   However it is not code size friendly, and the gain will drop a bit
3308   on certain cached systems.
3309 */
3310 #define COUNT_TOP_ZEROES(v)             \
3311   (((v) & ~0xffff) == 0                 \
3312    ? ((v) & ~0xff) == 0                 \
3313      ? ((v) & ~0xf) == 0                \
3314        ? ((v) & ~0x3) == 0              \
3315          ? ((v) & ~0x1) == 0            \
3316            ? !(v)                       \
3317              ? 32                       \
3318              : 31                       \
3319            : 30                         \
3320          : ((v) & ~0x7) == 0            \
3321            ? 29                         \
3322            : 28                         \
3323        : ((v) & ~0x3f) == 0             \
3324          ? ((v) & ~0x1f) == 0           \
3325            ? 27                         \
3326            : 26                         \
3327          : ((v) & ~0x7f) == 0           \
3328            ? 25                         \
3329            : 24                         \
3330      : ((v) & ~0xfff) == 0              \
3331        ? ((v) & ~0x3ff) == 0            \
3332          ? ((v) & ~0x1ff) == 0          \
3333            ? 23                         \
3334            : 22                         \
3335          : ((v) & ~0x7ff) == 0          \
3336            ? 21                         \
3337            : 20                         \
3338        : ((v) & ~0x3fff) == 0           \
3339          ? ((v) & ~0x1fff) == 0         \
3340            ? 19                         \
3341            : 18                         \
3342          : ((v) & ~0x7fff) == 0         \
3343            ? 17                         \
3344            : 16                         \
3345    : ((v) & ~0xffffff) == 0             \
3346      ? ((v) & ~0xfffff) == 0            \
3347        ? ((v) & ~0x3ffff) == 0          \
3348          ? ((v) & ~0x1ffff) == 0        \
3349            ? 15                         \
3350            : 14                         \
3351          : ((v) & ~0x7ffff) == 0        \
3352            ? 13                         \
3353            : 12                         \
3354        : ((v) & ~0x3fffff) == 0         \
3355          ? ((v) & ~0x1fffff) == 0       \
3356            ? 11                         \
3357            : 10                         \
3358          : ((v) & ~0x7fffff) == 0       \
3359            ? 9                          \
3360            : 8                          \
3361      : ((v) & ~0xfffffff) == 0          \
3362        ? ((v) & ~0x3ffffff) == 0        \
3363          ? ((v) & ~0x1ffffff) == 0      \
3364            ? 7                          \
3365            : 6                          \
3366          : ((v) & ~0x7ffffff) == 0      \
3367            ? 5                          \
3368            : 4                          \
3369        : ((v) & ~0x3fffffff) == 0       \
3370          ? ((v) & ~0x1fffffff) == 0     \
3371            ? 3                          \
3372            : 2                          \
3373          : ((v) & ~0x7fffffff) == 0     \
3374            ? 1                          \
3375            : 0)
3376
3377 /* Is the given value a sign-extended 32-bit value?  */
3378 #define IS_SEXT_32BIT_NUM(x)                                            \
3379   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
3380    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
3381
3382 /*                      load_register()
3383  *  This routine generates the least number of instructions neccessary to load
3384  *  an absolute expression value into a register.
3385  */
3386 static void
3387 load_register (counter, reg, ep, dbl)
3388      int *counter;
3389      int reg;
3390      expressionS *ep;
3391      int dbl;
3392 {
3393   int freg;
3394   expressionS hi32, lo32;
3395
3396   if (ep->X_op != O_big)
3397     {
3398       assert (ep->X_op == O_constant);
3399       if (ep->X_add_number < 0x8000
3400           && (ep->X_add_number >= 0
3401               || (ep->X_add_number >= -0x8000
3402                   && (! dbl
3403                       || ! ep->X_unsigned
3404                       || sizeof (ep->X_add_number) > 4))))
3405         {
3406           /* We can handle 16 bit signed values with an addiu to
3407              $zero.  No need to ever use daddiu here, since $zero and
3408              the result are always correct in 32 bit mode.  */
3409           macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3410                        (int) BFD_RELOC_LO16);
3411           return;
3412         }
3413       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3414         {
3415           /* We can handle 16 bit unsigned values with an ori to
3416              $zero.  */
3417           macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
3418                        (int) BFD_RELOC_LO16);
3419           return;
3420         }
3421       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)
3422                 && (! dbl
3423                     || ! ep->X_unsigned
3424                     || sizeof (ep->X_add_number) > 4
3425                     || (ep->X_add_number & 0x80000000) == 0))
3426                || ((HAVE_32BIT_GPRS || ! dbl)
3427                    && (ep->X_add_number &~ (offsetT) 0xffffffff) == 0)
3428                || (HAVE_32BIT_GPRS
3429                    && ! dbl
3430                    && ((ep->X_add_number &~ (offsetT) 0xffffffff)
3431                        == ~ (offsetT) 0xffffffff)))
3432         {
3433           /* 32 bit values require an lui.  */
3434           macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3435                        (int) BFD_RELOC_HI16);
3436           if ((ep->X_add_number & 0xffff) != 0)
3437             macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
3438                          (int) BFD_RELOC_LO16);
3439           return;
3440         }
3441     }
3442
3443   /* The value is larger than 32 bits.  */
3444
3445   if (HAVE_32BIT_GPRS)
3446     {
3447       as_bad (_("Number (0x%lx) larger than 32 bits"),
3448               (unsigned long) ep->X_add_number);
3449       macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3450                    (int) BFD_RELOC_LO16);
3451       return;
3452     }
3453
3454   if (ep->X_op != O_big)
3455     {
3456       hi32 = *ep;
3457       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3458       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3459       hi32.X_add_number &= 0xffffffff;
3460       lo32 = *ep;
3461       lo32.X_add_number &= 0xffffffff;
3462     }
3463   else
3464     {
3465       assert (ep->X_add_number > 2);
3466       if (ep->X_add_number == 3)
3467         generic_bignum[3] = 0;
3468       else if (ep->X_add_number > 4)
3469         as_bad (_("Number larger than 64 bits"));
3470       lo32.X_op = O_constant;
3471       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3472       hi32.X_op = O_constant;
3473       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3474     }
3475
3476   if (hi32.X_add_number == 0)
3477     freg = 0;
3478   else
3479     {
3480       int shift, bit;
3481       unsigned long hi, lo;
3482
3483       if (hi32.X_add_number == (offsetT) 0xffffffff)
3484         {
3485           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3486             {
3487               macro_build ((char *) NULL, counter, &lo32, "addiu", "t,r,j",
3488                            reg, 0, (int) BFD_RELOC_LO16);
3489               return;
3490             }
3491           if (lo32.X_add_number & 0x80000000)
3492             {
3493               macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3494                            (int) BFD_RELOC_HI16);
3495               if (lo32.X_add_number & 0xffff)
3496                 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i",
3497                              reg, reg, (int) BFD_RELOC_LO16);
3498               return;
3499             }
3500         }
3501
3502       /* Check for 16bit shifted constant.  We know that hi32 is
3503          non-zero, so start the mask on the first bit of the hi32
3504          value.  */
3505       shift = 17;
3506       do
3507         {
3508           unsigned long himask, lomask;
3509
3510           if (shift < 32)
3511             {
3512               himask = 0xffff >> (32 - shift);
3513               lomask = (0xffff << shift) & 0xffffffff;
3514             }
3515           else
3516             {
3517               himask = 0xffff << (shift - 32);
3518               lomask = 0;
3519             }
3520           if ((hi32.X_add_number & ~(offsetT) himask) == 0
3521               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3522             {
3523               expressionS tmp;
3524
3525               tmp.X_op = O_constant;
3526               if (shift < 32)
3527                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3528                                     | (lo32.X_add_number >> shift));
3529               else
3530                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3531               macro_build ((char *) NULL, counter, &tmp,
3532                            "ori", "t,r,i", reg, 0,
3533                            (int) BFD_RELOC_LO16);
3534               macro_build ((char *) NULL, counter, (expressionS *) NULL,
3535                            (shift >= 32) ? "dsll32" : "dsll",
3536                            "d,w,<", reg, reg,
3537                            (shift >= 32) ? shift - 32 : shift);
3538               return;
3539             }
3540           shift++;
3541         }
3542       while (shift <= (64 - 16));
3543
3544       /* Find the bit number of the lowest one bit, and store the
3545          shifted value in hi/lo.  */
3546       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3547       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3548       if (lo != 0)
3549         {
3550           bit = 0;
3551           while ((lo & 1) == 0)
3552             {
3553               lo >>= 1;
3554               ++bit;
3555             }
3556           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3557           hi >>= bit;
3558         }
3559       else
3560         {
3561           bit = 32;
3562           while ((hi & 1) == 0)
3563             {
3564               hi >>= 1;
3565               ++bit;
3566             }
3567           lo = hi;
3568           hi = 0;
3569         }
3570
3571       /* Optimize if the shifted value is a (power of 2) - 1.  */
3572       if ((hi == 0 && ((lo + 1) & lo) == 0)
3573           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3574         {
3575           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3576           if (shift != 0)
3577             {
3578               expressionS tmp;
3579
3580               /* This instruction will set the register to be all
3581                  ones.  */
3582               tmp.X_op = O_constant;
3583               tmp.X_add_number = (offsetT) -1;
3584               macro_build ((char *) NULL, counter, &tmp, "addiu", "t,r,j",
3585                            reg, 0, (int) BFD_RELOC_LO16);
3586               if (bit != 0)
3587                 {
3588                   bit += shift;
3589                   macro_build ((char *) NULL, counter, (expressionS *) NULL,
3590                                (bit >= 32) ? "dsll32" : "dsll",
3591                                "d,w,<", reg, reg,
3592                                (bit >= 32) ? bit - 32 : bit);
3593                 }
3594               macro_build ((char *) NULL, counter, (expressionS *) NULL,
3595                            (shift >= 32) ? "dsrl32" : "dsrl",
3596                            "d,w,<", reg, reg,
3597                            (shift >= 32) ? shift - 32 : shift);
3598               return;
3599             }
3600         }
3601
3602       /* Sign extend hi32 before calling load_register, because we can
3603          generally get better code when we load a sign extended value.  */
3604       if ((hi32.X_add_number & 0x80000000) != 0)
3605         hi32.X_add_number |= ~(offsetT) 0xffffffff;
3606       load_register (counter, reg, &hi32, 0);
3607       freg = reg;
3608     }
3609   if ((lo32.X_add_number & 0xffff0000) == 0)
3610     {
3611       if (freg != 0)
3612         {
3613           macro_build ((char *) NULL, counter, (expressionS *) NULL,
3614                        "dsll32", "d,w,<", reg, freg, 0);
3615           freg = reg;
3616         }
3617     }
3618   else
3619     {
3620       expressionS mid16;
3621
3622       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3623         {
3624           macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3625                        (int) BFD_RELOC_HI16);
3626           macro_build ((char *) NULL, counter, (expressionS *) NULL,
3627                        "dsrl32", "d,w,<", reg, reg, 0);
3628           return;
3629         }
3630
3631       if (freg != 0)
3632         {
3633           macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3634                        "d,w,<", reg, freg, 16);
3635           freg = reg;
3636         }
3637       mid16 = lo32;
3638       mid16.X_add_number >>= 16;
3639       macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
3640                    freg, (int) BFD_RELOC_LO16);
3641       macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3642                    "d,w,<", reg, reg, 16);
3643       freg = reg;
3644     }
3645   if ((lo32.X_add_number & 0xffff) != 0)
3646     macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, freg,
3647                  (int) BFD_RELOC_LO16);
3648 }
3649
3650 /* Load an address into a register.  */
3651
3652 static void
3653 load_address (counter, reg, ep, dbl, used_at)
3654      int *counter;
3655      int reg;
3656      expressionS *ep;
3657      int dbl;
3658      int *used_at;
3659 {
3660   char *p;
3661
3662   if (ep->X_op != O_constant
3663       && ep->X_op != O_symbol)
3664     {
3665       as_bad (_("expression too complex"));
3666       ep->X_op = O_constant;
3667     }
3668
3669   if (ep->X_op == O_constant)
3670     {
3671       load_register (counter, reg, ep, dbl);
3672       return;
3673     }
3674
3675   if (mips_pic == NO_PIC)
3676     {
3677       /* If this is a reference to a GP relative symbol, we want
3678            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
3679          Otherwise we want
3680            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
3681            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3682          If we have an addend, we always use the latter form.
3683
3684          With 64bit address space and a usable $at we want
3685            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3686            lui          $at,<sym>               (BFD_RELOC_HI16_S)
3687            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3688            daddiu       $at,<sym>               (BFD_RELOC_LO16)
3689            dsll32       $reg,0
3690            dadd         $reg,$reg,$at
3691
3692          If $at is already in use, we use an path which is suboptimal
3693          on superscalar processors.
3694            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3695            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3696            dsll         $reg,16
3697            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
3698            dsll         $reg,16
3699            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
3700        */
3701       if (dbl)
3702         {
3703           p = NULL;
3704
3705           /* We don't do GP optimization for now because RELAX_ENCODE can't
3706              hold the data for such large chunks.  */
3707
3708           if (*used_at == 0)
3709             {
3710               macro_build (p, counter, ep, "lui", "t,u",
3711                            reg, (int) BFD_RELOC_MIPS_HIGHEST);
3712               macro_build (p, counter, ep, "lui", "t,u",
3713                            AT, (int) BFD_RELOC_HI16_S);
3714               macro_build (p, counter, ep, "daddiu", "t,r,j",
3715                            reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3716               macro_build (p, counter, ep, "daddiu", "t,r,j",
3717                            AT, AT, (int) BFD_RELOC_LO16);
3718               macro_build (p, counter, (expressionS *) NULL, "dsll32",
3719                            "d,w,<", reg, reg, 0);
3720               macro_build (p, counter, (expressionS *) NULL, "dadd",
3721                            "d,v,t", reg, reg, AT);
3722               *used_at = 1;
3723             }
3724           else
3725             {
3726               macro_build (p, counter, ep, "lui", "t,u",
3727                            reg, (int) BFD_RELOC_MIPS_HIGHEST);
3728               macro_build (p, counter, ep, "daddiu", "t,r,j",
3729                            reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3730               macro_build (p, counter, (expressionS *) NULL, "dsll",
3731                            "d,w,<", reg, reg, 16);
3732               macro_build (p, counter, ep, "daddiu", "t,r,j",
3733                            reg, reg, (int) BFD_RELOC_HI16_S);
3734               macro_build (p, counter, (expressionS *) NULL, "dsll",
3735                            "d,w,<", reg, reg, 16);
3736               macro_build (p, counter, ep, "daddiu", "t,r,j",
3737                            reg, reg, (int) BFD_RELOC_LO16);
3738             }
3739         }
3740       else
3741         {
3742           p = NULL;
3743           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3744               && ! nopic_need_relax (ep->X_add_symbol, 1))
3745             {
3746               frag_grow (20);
3747               macro_build ((char *) NULL, counter, ep,
3748                            dbl ? "daddiu" : "addiu", "t,r,j", reg, GP,
3749                            (int) BFD_RELOC_GPREL16);
3750               p = frag_var (rs_machine_dependent, 8, 0,
3751                             RELAX_ENCODE (4, 8, 0, 4, 0,
3752                                           mips_opts.warn_about_macros),
3753                             ep->X_add_symbol, 0, NULL);
3754             }
3755           macro_build_lui (p, counter, ep, reg);
3756           if (p != NULL)
3757             p += 4;
3758           macro_build (p, counter, ep, dbl ? "daddiu" : "addiu",
3759                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3760         }
3761     }
3762   else if (mips_pic == SVR4_PIC && ! mips_big_got)
3763     {
3764       expressionS ex;
3765
3766       /* If this is a reference to an external symbol, we want
3767            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3768          Otherwise we want
3769            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3770            nop
3771            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3772          If there is a constant, it must be added in after.  */
3773       ex.X_add_number = ep->X_add_number;
3774       ep->X_add_number = 0;
3775       frag_grow (20);
3776       macro_build ((char *) NULL, counter, ep,
3777                    HAVE_32BIT_ADDRESSES ? "lw" : "ld",
3778                    "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP);
3779       macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
3780       p = frag_var (rs_machine_dependent, 4, 0,
3781                     RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
3782                     ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3783       macro_build (p, counter, ep,
3784                    HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3785                    "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3786       if (ex.X_add_number != 0)
3787         {
3788           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3789             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3790           ex.X_op = O_constant;
3791           macro_build ((char *) NULL, counter, &ex,
3792                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3793                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3794         }
3795     }
3796   else if (mips_pic == SVR4_PIC)
3797     {
3798       expressionS ex;
3799       int off;
3800
3801       /* This is the large GOT case.  If this is a reference to an
3802          external symbol, we want
3803            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
3804            addu         $reg,$reg,$gp
3805            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
3806          Otherwise, for a reference to a local symbol, we want
3807            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3808            nop
3809            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3810          If there is a constant, it must be added in after.  */
3811       ex.X_add_number = ep->X_add_number;
3812       ep->X_add_number = 0;
3813       if (reg_needs_delay (GP))
3814         off = 4;
3815       else
3816         off = 0;
3817       frag_grow (32);
3818       macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3819                    (int) BFD_RELOC_MIPS_GOT_HI16);
3820       macro_build ((char *) NULL, counter, (expressionS *) NULL,
3821                    dbl ? "daddu" : "addu", "d,v,t", reg, reg, GP);
3822       macro_build ((char *) NULL, counter, ep, dbl ? "ld" : "lw",
3823                    "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
3824       p = frag_var (rs_machine_dependent, 12 + off, 0,
3825                     RELAX_ENCODE (12, 12 + off, off, 8 + off, 0,
3826                                   mips_opts.warn_about_macros),
3827                     ep->X_add_symbol, 0, NULL);
3828       if (off > 0)
3829         {
3830           /* We need a nop before loading from $gp.  This special
3831              check is required because the lui which starts the main
3832              instruction stream does not refer to $gp, and so will not
3833              insert the nop which may be required.  */
3834           macro_build (p, counter, (expressionS *) NULL, "nop", "");
3835           p += 4;
3836         }
3837       macro_build (p, counter, ep, dbl ? "ld" : "lw",
3838                    "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT16, GP);
3839       p += 4;
3840       macro_build (p, counter, (expressionS *) NULL, "nop", "");
3841       p += 4;
3842       macro_build (p, counter, ep, dbl ? "daddiu" : "addiu",
3843                    "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3844       if (ex.X_add_number != 0)
3845         {
3846           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3847             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3848           ex.X_op = O_constant;
3849           macro_build ((char *) NULL, counter, &ex, dbl ? "daddiu" : "addiu",
3850                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3851         }
3852     }
3853   else if (mips_pic == EMBEDDED_PIC)
3854     {
3855       /* We always do
3856            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
3857          */
3858       macro_build ((char *) NULL, counter, ep, dbl ? "daddiu" : "addiu",
3859                    "t,r,j", reg, GP, (int) BFD_RELOC_GPREL16);
3860     }
3861   else
3862     abort ();
3863 }
3864
3865 /* Move the contents of register SOURCE into register DEST.  */
3866
3867 static void
3868 move_register (counter, dest, source)
3869      int *counter;
3870      int dest;
3871      int source;
3872 {
3873   macro_build ((char *) NULL, counter, (expressionS *) NULL,
3874                HAVE_32BIT_GPRS ? "addu" : "daddu",
3875                "d,v,t", dest, source, 0);
3876 }
3877
3878 /*
3879  *                      Build macros
3880  *   This routine implements the seemingly endless macro or synthesized
3881  * instructions and addressing modes in the mips assembly language. Many
3882  * of these macros are simple and are similar to each other. These could
3883  * probably be handled by some kind of table or grammer aproach instead of
3884  * this verbose method. Others are not simple macros but are more like
3885  * optimizing code generation.
3886  *   One interesting optimization is when several store macros appear
3887  * consecutivly that would load AT with the upper half of the same address.
3888  * The ensuing load upper instructions are ommited. This implies some kind
3889  * of global optimization. We currently only optimize within a single macro.
3890  *   For many of the load and store macros if the address is specified as a
3891  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
3892  * first load register 'at' with zero and use it as the base register. The
3893  * mips assembler simply uses register $zero. Just one tiny optimization
3894  * we're missing.
3895  */
3896 static void
3897 macro (ip)
3898      struct mips_cl_insn *ip;
3899 {
3900   register int treg, sreg, dreg, breg;
3901   int tempreg;
3902   int mask;
3903   int icnt = 0;
3904   int used_at = 0;
3905   expressionS expr1;
3906   const char *s;
3907   const char *s2;
3908   const char *fmt;
3909   int likely = 0;
3910   int dbl = 0;
3911   int coproc = 0;
3912   int lr = 0;
3913   int imm = 0;
3914   offsetT maxnum;
3915   int off;
3916   bfd_reloc_code_real_type r;
3917   char *p;
3918   int hold_mips_optimize;
3919
3920   assert (! mips_opts.mips16);
3921
3922   treg = (ip->insn_opcode >> 16) & 0x1f;
3923   dreg = (ip->insn_opcode >> 11) & 0x1f;
3924   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
3925   mask = ip->insn_mo->mask;
3926
3927   expr1.X_op = O_constant;
3928   expr1.X_op_symbol = NULL;
3929   expr1.X_add_symbol = NULL;
3930   expr1.X_add_number = 1;
3931
3932   switch (mask)
3933     {
3934     case M_DABS:
3935       dbl = 1;
3936     case M_ABS:
3937       /* bgez $a0,.+12
3938          move v0,$a0
3939          sub v0,$zero,$a0
3940          */
3941
3942       mips_emit_delays (true);
3943       ++mips_opts.noreorder;
3944       mips_any_noreorder = 1;
3945
3946       expr1.X_add_number = 8;
3947       macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
3948       if (dreg == sreg)
3949         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
3950                      0);
3951       else
3952         move_register (&icnt, dreg, sreg);
3953       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
3954                    dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
3955
3956       --mips_opts.noreorder;
3957       return;
3958
3959     case M_ADD_I:
3960       s = "addi";
3961       s2 = "add";
3962       goto do_addi;
3963     case M_ADDU_I:
3964       s = "addiu";
3965       s2 = "addu";
3966       goto do_addi;
3967     case M_DADD_I:
3968       dbl = 1;
3969       s = "daddi";
3970       s2 = "dadd";
3971       goto do_addi;
3972     case M_DADDU_I:
3973       dbl = 1;
3974       s = "daddiu";
3975       s2 = "daddu";
3976     do_addi:
3977       if (imm_expr.X_op == O_constant
3978           && imm_expr.X_add_number >= -0x8000
3979           && imm_expr.X_add_number < 0x8000)
3980         {
3981           macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
3982                        (int) BFD_RELOC_LO16);
3983           return;
3984         }
3985       load_register (&icnt, AT, &imm_expr, dbl);
3986       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
3987                    treg, sreg, AT);
3988       break;
3989
3990     case M_AND_I:
3991       s = "andi";
3992       s2 = "and";
3993       goto do_bit;
3994     case M_OR_I:
3995       s = "ori";
3996       s2 = "or";
3997       goto do_bit;
3998     case M_NOR_I:
3999       s = "";
4000       s2 = "nor";
4001       goto do_bit;
4002     case M_XOR_I:
4003       s = "xori";
4004       s2 = "xor";
4005     do_bit:
4006       if (imm_expr.X_op == O_constant
4007           && imm_expr.X_add_number >= 0
4008           && imm_expr.X_add_number < 0x10000)
4009         {
4010           if (mask != M_NOR_I)
4011             macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
4012                          sreg, (int) BFD_RELOC_LO16);
4013           else
4014             {
4015               macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
4016                            treg, sreg, (int) BFD_RELOC_LO16);
4017               macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nor",
4018                            "d,v,t", treg, treg, 0);
4019             }
4020           return;
4021         }
4022
4023       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4024       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4025                    treg, sreg, AT);
4026       break;
4027
4028     case M_BEQ_I:
4029       s = "beq";
4030       goto beq_i;
4031     case M_BEQL_I:
4032       s = "beql";
4033       likely = 1;
4034       goto beq_i;
4035     case M_BNE_I:
4036       s = "bne";
4037       goto beq_i;
4038     case M_BNEL_I:
4039       s = "bnel";
4040       likely = 1;
4041     beq_i:
4042       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4043         {
4044           macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
4045                        0);
4046           return;
4047         }
4048       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4049       macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
4050       break;
4051
4052     case M_BGEL:
4053       likely = 1;
4054     case M_BGE:
4055       if (treg == 0)
4056         {
4057           macro_build ((char *) NULL, &icnt, &offset_expr,
4058                        likely ? "bgezl" : "bgez", "s,p", sreg);
4059           return;
4060         }
4061       if (sreg == 0)
4062         {
4063           macro_build ((char *) NULL, &icnt, &offset_expr,
4064                        likely ? "blezl" : "blez", "s,p", treg);
4065           return;
4066         }
4067       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4068                    AT, sreg, treg);
4069       macro_build ((char *) NULL, &icnt, &offset_expr,
4070                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4071       break;
4072
4073     case M_BGTL_I:
4074       likely = 1;
4075     case M_BGT_I:
4076       /* check for > max integer */
4077       maxnum = 0x7fffffff;
4078       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4079         {
4080           maxnum <<= 16;
4081           maxnum |= 0xffff;
4082           maxnum <<= 16;
4083           maxnum |= 0xffff;
4084         }
4085       if (imm_expr.X_op == O_constant
4086           && imm_expr.X_add_number >= maxnum
4087           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4088         {
4089         do_false:
4090           /* result is always false */
4091           if (! likely)
4092             {
4093               if (warn_nops)
4094                 as_warn (_("Branch %s is always false (nop)"),
4095                          ip->insn_mo->name);
4096               macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop",
4097                            "", 0);
4098             }
4099           else
4100             {
4101               if (warn_nops)
4102                 as_warn (_("Branch likely %s is always false"),
4103                          ip->insn_mo->name);
4104               macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
4105                            "s,t,p", 0, 0);
4106             }
4107           return;
4108         }
4109       if (imm_expr.X_op != O_constant)
4110         as_bad (_("Unsupported large constant"));
4111       imm_expr.X_add_number++;
4112       /* FALLTHROUGH */
4113     case M_BGE_I:
4114     case M_BGEL_I:
4115       if (mask == M_BGEL_I)
4116         likely = 1;
4117       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4118         {
4119           macro_build ((char *) NULL, &icnt, &offset_expr,
4120                        likely ? "bgezl" : "bgez", "s,p", sreg);
4121           return;
4122         }
4123       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4124         {
4125           macro_build ((char *) NULL, &icnt, &offset_expr,
4126                        likely ? "bgtzl" : "bgtz", "s,p", sreg);
4127           return;
4128         }
4129       maxnum = 0x7fffffff;
4130       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4131         {
4132           maxnum <<= 16;
4133           maxnum |= 0xffff;
4134           maxnum <<= 16;
4135           maxnum |= 0xffff;
4136         }
4137       maxnum = - maxnum - 1;
4138       if (imm_expr.X_op == O_constant
4139           && imm_expr.X_add_number <= maxnum
4140           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4141         {
4142         do_true:
4143           /* result is always true */
4144           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4145           macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
4146           return;
4147         }
4148       set_at (&icnt, sreg, 0);
4149       macro_build ((char *) NULL, &icnt, &offset_expr,
4150                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4151       break;
4152
4153     case M_BGEUL:
4154       likely = 1;
4155     case M_BGEU:
4156       if (treg == 0)
4157         goto do_true;
4158       if (sreg == 0)
4159         {
4160           macro_build ((char *) NULL, &icnt, &offset_expr,
4161                        likely ? "beql" : "beq", "s,t,p", 0, treg);
4162           return;
4163         }
4164       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4165                    "d,v,t", AT, sreg, treg);
4166       macro_build ((char *) NULL, &icnt, &offset_expr,
4167                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4168       break;
4169
4170     case M_BGTUL_I:
4171       likely = 1;
4172     case M_BGTU_I:
4173       if (sreg == 0
4174           || (HAVE_32BIT_GPRS
4175               && imm_expr.X_op == O_constant
4176               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4177         goto do_false;
4178       if (imm_expr.X_op != O_constant)
4179         as_bad (_("Unsupported large constant"));
4180       imm_expr.X_add_number++;
4181       /* FALLTHROUGH */
4182     case M_BGEU_I:
4183     case M_BGEUL_I:
4184       if (mask == M_BGEUL_I)
4185         likely = 1;
4186       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4187         goto do_true;
4188       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4189         {
4190           macro_build ((char *) NULL, &icnt, &offset_expr,
4191                        likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4192           return;
4193         }
4194       set_at (&icnt, sreg, 1);
4195       macro_build ((char *) NULL, &icnt, &offset_expr,
4196                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4197       break;
4198
4199     case M_BGTL:
4200       likely = 1;
4201     case M_BGT:
4202       if (treg == 0)
4203         {
4204           macro_build ((char *) NULL, &icnt, &offset_expr,
4205                        likely ? "bgtzl" : "bgtz", "s,p", sreg);
4206           return;
4207         }
4208       if (sreg == 0)
4209         {
4210           macro_build ((char *) NULL, &icnt, &offset_expr,
4211                        likely ? "bltzl" : "bltz", "s,p", treg);
4212           return;
4213         }
4214       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4215                    AT, treg, sreg);
4216       macro_build ((char *) NULL, &icnt, &offset_expr,
4217                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4218       break;
4219
4220     case M_BGTUL:
4221       likely = 1;
4222     case M_BGTU:
4223       if (treg == 0)
4224         {
4225           macro_build ((char *) NULL, &icnt, &offset_expr,
4226                        likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4227           return;
4228         }
4229       if (sreg == 0)
4230         goto do_false;
4231       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4232                    "d,v,t", AT, treg, sreg);
4233       macro_build ((char *) NULL, &icnt, &offset_expr,
4234                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4235       break;
4236
4237     case M_BLEL:
4238       likely = 1;
4239     case M_BLE:
4240       if (treg == 0)
4241         {
4242           macro_build ((char *) NULL, &icnt, &offset_expr,
4243                        likely ? "blezl" : "blez", "s,p", sreg);
4244           return;
4245         }
4246       if (sreg == 0)
4247         {
4248           macro_build ((char *) NULL, &icnt, &offset_expr,
4249                        likely ? "bgezl" : "bgez", "s,p", treg);
4250           return;
4251         }
4252       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4253                    AT, treg, sreg);
4254       macro_build ((char *) NULL, &icnt, &offset_expr,
4255                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4256       break;
4257
4258     case M_BLEL_I:
4259       likely = 1;
4260     case M_BLE_I:
4261       maxnum = 0x7fffffff;
4262       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4263         {
4264           maxnum <<= 16;
4265           maxnum |= 0xffff;
4266           maxnum <<= 16;
4267           maxnum |= 0xffff;
4268         }
4269       if (imm_expr.X_op == O_constant
4270           && imm_expr.X_add_number >= maxnum
4271           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4272         goto do_true;
4273       if (imm_expr.X_op != O_constant)
4274         as_bad (_("Unsupported large constant"));
4275       imm_expr.X_add_number++;
4276       /* FALLTHROUGH */
4277     case M_BLT_I:
4278     case M_BLTL_I:
4279       if (mask == M_BLTL_I)
4280         likely = 1;
4281       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4282         {
4283           macro_build ((char *) NULL, &icnt, &offset_expr,
4284                        likely ? "bltzl" : "bltz", "s,p", sreg);
4285           return;
4286         }
4287       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4288         {
4289           macro_build ((char *) NULL, &icnt, &offset_expr,
4290                        likely ? "blezl" : "blez", "s,p", sreg);
4291           return;
4292         }
4293       set_at (&icnt, sreg, 0);
4294       macro_build ((char *) NULL, &icnt, &offset_expr,
4295                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4296       break;
4297
4298     case M_BLEUL:
4299       likely = 1;
4300     case M_BLEU:
4301       if (treg == 0)
4302         {
4303           macro_build ((char *) NULL, &icnt, &offset_expr,
4304                        likely ? "beql" : "beq", "s,t,p", sreg, 0);
4305           return;
4306         }
4307       if (sreg == 0)
4308         goto do_true;
4309       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4310                    "d,v,t", AT, treg, sreg);
4311       macro_build ((char *) NULL, &icnt, &offset_expr,
4312                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4313       break;
4314
4315     case M_BLEUL_I:
4316       likely = 1;
4317     case M_BLEU_I:
4318       if (sreg == 0
4319           || (HAVE_32BIT_GPRS
4320               && imm_expr.X_op == O_constant
4321               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4322         goto do_true;
4323       if (imm_expr.X_op != O_constant)
4324         as_bad (_("Unsupported large constant"));
4325       imm_expr.X_add_number++;
4326       /* FALLTHROUGH */
4327     case M_BLTU_I:
4328     case M_BLTUL_I:
4329       if (mask == M_BLTUL_I)
4330         likely = 1;
4331       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4332         goto do_false;
4333       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4334         {
4335           macro_build ((char *) NULL, &icnt, &offset_expr,
4336                        likely ? "beql" : "beq",
4337                        "s,t,p", sreg, 0);
4338           return;
4339         }
4340       set_at (&icnt, sreg, 1);
4341       macro_build ((char *) NULL, &icnt, &offset_expr,
4342                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4343       break;
4344
4345     case M_BLTL:
4346       likely = 1;
4347     case M_BLT:
4348       if (treg == 0)
4349         {
4350           macro_build ((char *) NULL, &icnt, &offset_expr,
4351                        likely ? "bltzl" : "bltz", "s,p", sreg);
4352           return;
4353         }
4354       if (sreg == 0)
4355         {
4356           macro_build ((char *) NULL, &icnt, &offset_expr,
4357                        likely ? "bgtzl" : "bgtz", "s,p", treg);
4358           return;
4359         }
4360       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4361                    AT, sreg, treg);
4362       macro_build ((char *) NULL, &icnt, &offset_expr,
4363                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4364       break;
4365
4366     case M_BLTUL:
4367       likely = 1;
4368     case M_BLTU:
4369       if (treg == 0)
4370         goto do_false;
4371       if (sreg == 0)
4372         {
4373           macro_build ((char *) NULL, &icnt, &offset_expr,
4374                        likely ? "bnel" : "bne", "s,t,p", 0, treg);
4375           return;
4376         }
4377       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4378                    "d,v,t", AT, sreg,
4379                    treg);
4380       macro_build ((char *) NULL, &icnt, &offset_expr,
4381                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4382       break;
4383
4384     case M_DDIV_3:
4385       dbl = 1;
4386     case M_DIV_3:
4387       s = "mflo";
4388       goto do_div3;
4389     case M_DREM_3:
4390       dbl = 1;
4391     case M_REM_3:
4392       s = "mfhi";
4393     do_div3:
4394       if (treg == 0)
4395         {
4396           as_warn (_("Divide by zero."));
4397           if (mips_trap)
4398             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4399                          "s,t", 0, 0);
4400           else
4401             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4402                          "c", 7);
4403           return;
4404         }
4405
4406       mips_emit_delays (true);
4407       ++mips_opts.noreorder;
4408       mips_any_noreorder = 1;
4409       if (mips_trap)
4410         {
4411           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4412                        "s,t", treg, 0);
4413           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4414                        dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4415         }
4416       else
4417         {
4418           expr1.X_add_number = 8;
4419           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4420           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4421                        dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4422           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4423                        "c", 7);
4424         }
4425       expr1.X_add_number = -1;
4426       macro_build ((char *) NULL, &icnt, &expr1,
4427                    dbl ? "daddiu" : "addiu",
4428                    "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
4429       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4430       macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
4431       if (dbl)
4432         {
4433           expr1.X_add_number = 1;
4434           macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
4435                        (int) BFD_RELOC_LO16);
4436           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsll32",
4437                        "d,w,<", AT, AT, 31);
4438         }
4439       else
4440         {
4441           expr1.X_add_number = 0x80000000;
4442           macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
4443                        (int) BFD_RELOC_HI16);
4444         }
4445       if (mips_trap)
4446         {
4447           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4448                        "s,t", sreg, AT);
4449           /* We want to close the noreorder block as soon as possible, so
4450              that later insns are available for delay slot filling.  */
4451           --mips_opts.noreorder;
4452         }
4453       else
4454         {
4455           expr1.X_add_number = 8;
4456           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
4457           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4458                        0);
4459
4460           /* We want to close the noreorder block as soon as possible, so
4461              that later insns are available for delay slot filling.  */
4462           --mips_opts.noreorder;
4463
4464           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4465                        "c", 6);
4466         }
4467       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d", dreg);
4468       break;
4469
4470     case M_DIV_3I:
4471       s = "div";
4472       s2 = "mflo";
4473       goto do_divi;
4474     case M_DIVU_3I:
4475       s = "divu";
4476       s2 = "mflo";
4477       goto do_divi;
4478     case M_REM_3I:
4479       s = "div";
4480       s2 = "mfhi";
4481       goto do_divi;
4482     case M_REMU_3I:
4483       s = "divu";
4484       s2 = "mfhi";
4485       goto do_divi;
4486     case M_DDIV_3I:
4487       dbl = 1;
4488       s = "ddiv";
4489       s2 = "mflo";
4490       goto do_divi;
4491     case M_DDIVU_3I:
4492       dbl = 1;
4493       s = "ddivu";
4494       s2 = "mflo";
4495       goto do_divi;
4496     case M_DREM_3I:
4497       dbl = 1;
4498       s = "ddiv";
4499       s2 = "mfhi";
4500       goto do_divi;
4501     case M_DREMU_3I:
4502       dbl = 1;
4503       s = "ddivu";
4504       s2 = "mfhi";
4505     do_divi:
4506       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4507         {
4508           as_warn (_("Divide by zero."));
4509           if (mips_trap)
4510             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4511                          "s,t", 0, 0);
4512           else
4513             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4514                          "c", 7);
4515           return;
4516         }
4517       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4518         {
4519           if (strcmp (s2, "mflo") == 0)
4520             move_register (&icnt, dreg, sreg);
4521           else
4522             move_register (&icnt, dreg, 0);
4523           return;
4524         }
4525       if (imm_expr.X_op == O_constant
4526           && imm_expr.X_add_number == -1
4527           && s[strlen (s) - 1] != 'u')
4528         {
4529           if (strcmp (s2, "mflo") == 0)
4530             {
4531               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4532                            dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4533             }
4534           else
4535             move_register (&icnt, dreg, 0);
4536           return;
4537         }
4538
4539       load_register (&icnt, AT, &imm_expr, dbl);
4540       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4541                    sreg, AT);
4542       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4543       break;
4544
4545     case M_DIVU_3:
4546       s = "divu";
4547       s2 = "mflo";
4548       goto do_divu3;
4549     case M_REMU_3:
4550       s = "divu";
4551       s2 = "mfhi";
4552       goto do_divu3;
4553     case M_DDIVU_3:
4554       s = "ddivu";
4555       s2 = "mflo";
4556       goto do_divu3;
4557     case M_DREMU_3:
4558       s = "ddivu";
4559       s2 = "mfhi";
4560     do_divu3:
4561       mips_emit_delays (true);
4562       ++mips_opts.noreorder;
4563       mips_any_noreorder = 1;
4564       if (mips_trap)
4565         {
4566           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4567                        "s,t", treg, 0);
4568           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4569                        sreg, treg);
4570           /* We want to close the noreorder block as soon as possible, so
4571              that later insns are available for delay slot filling.  */
4572           --mips_opts.noreorder;
4573         }
4574       else
4575         {
4576           expr1.X_add_number = 8;
4577           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4578           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4579                        sreg, treg);
4580
4581           /* We want to close the noreorder block as soon as possible, so
4582              that later insns are available for delay slot filling.  */
4583           --mips_opts.noreorder;
4584           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4585                        "c", 7);
4586         }
4587       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4588       return;
4589
4590     case M_DLA_AB:
4591       dbl = 1;
4592     case M_LA_AB:
4593       /* Load the address of a symbol into a register.  If breg is not
4594          zero, we then add a base register to it.  */
4595
4596       if (treg == breg)
4597         {
4598           tempreg = AT;
4599           used_at = 1;
4600         }
4601       else
4602         {
4603           tempreg = treg;
4604           used_at = 0;
4605         }
4606
4607       /* When generating embedded PIC code, we permit expressions of
4608          the form
4609            la   $treg,foo-bar
4610            la   $treg,foo-bar($breg)
4611          where bar is an address in the current section.  These are used
4612          when getting the addresses of functions.  We don't permit
4613          X_add_number to be non-zero, because if the symbol is
4614          external the relaxing code needs to know that any addend is
4615          purely the offset to X_op_symbol.  */
4616       if (mips_pic == EMBEDDED_PIC
4617           && offset_expr.X_op == O_subtract
4618           && (symbol_constant_p (offset_expr.X_op_symbol)
4619               ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
4620               : (symbol_equated_p (offset_expr.X_op_symbol)
4621                  && (S_GET_SEGMENT
4622                      (symbol_get_value_expression (offset_expr.X_op_symbol)
4623                       ->X_add_symbol)
4624                      == now_seg)))
4625           && (offset_expr.X_add_number == 0
4626               || OUTPUT_FLAVOR == bfd_target_elf_flavour))
4627         {
4628           if (breg == 0)
4629             {
4630               tempreg = treg;
4631               used_at = 0;
4632               macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4633                            tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4634             }
4635           else
4636             {
4637               macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4638                            tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4639               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4640                            (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
4641                            "d,v,t", tempreg, tempreg, breg);
4642             }
4643           macro_build ((char *) NULL, &icnt, &offset_expr,
4644                        (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4645                        "t,r,j", treg, tempreg, (int) BFD_RELOC_PCREL_LO16);
4646           if (! used_at)
4647             return;
4648           break;
4649         }
4650
4651       if (offset_expr.X_op != O_symbol
4652           && offset_expr.X_op != O_constant)
4653         {
4654           as_bad (_("expression too complex"));
4655           offset_expr.X_op = O_constant;
4656         }
4657
4658       if (offset_expr.X_op == O_constant)
4659         load_register (&icnt, tempreg, &offset_expr,
4660                        ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
4661                         ? (dbl || HAVE_64BIT_ADDRESSES)
4662                         : HAVE_64BIT_ADDRESSES));
4663       else if (mips_pic == NO_PIC)
4664         {
4665           /* If this is a reference to a GP relative symbol, we want
4666                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
4667              Otherwise we want
4668                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
4669                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4670              If we have a constant, we need two instructions anyhow,
4671              so we may as well always use the latter form.
4672
4673             With 64bit address space and a usable $at we want
4674               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4675               lui       $at,<sym>               (BFD_RELOC_HI16_S)
4676               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4677               daddiu    $at,<sym>               (BFD_RELOC_LO16)
4678               dsll32    $tempreg,0
4679               dadd      $tempreg,$tempreg,$at
4680
4681             If $at is already in use, we use an path which is suboptimal
4682             on superscalar processors.
4683               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4684               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4685               dsll      $tempreg,16
4686               daddiu    $tempreg,<sym>          (BFD_RELOC_HI16_S)
4687               dsll      $tempreg,16
4688               daddiu    $tempreg,<sym>          (BFD_RELOC_LO16)
4689           */
4690           p = NULL;
4691           if (HAVE_64BIT_ADDRESSES)
4692             {
4693               /* We don't do GP optimization for now because RELAX_ENCODE can't
4694                  hold the data for such large chunks.  */
4695
4696             if (used_at == 0)
4697               {
4698                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4699                              tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
4700                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4701                              AT, (int) BFD_RELOC_HI16_S);
4702                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4703                              tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
4704                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4705                              AT, AT, (int) BFD_RELOC_LO16);
4706                 macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
4707                              "d,w,<", tempreg, tempreg, 0);
4708                 macro_build (p, &icnt, (expressionS *) NULL, "dadd", "d,v,t",
4709                              tempreg, tempreg, AT);
4710                 used_at = 1;
4711               }
4712             else
4713               {
4714                 macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4715                              tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
4716                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4717                              tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
4718                 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
4719                              tempreg, tempreg, 16);
4720                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4721                              tempreg, tempreg, (int) BFD_RELOC_HI16_S);
4722                 macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
4723                              tempreg, tempreg, 16);
4724                 macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4725                              tempreg, tempreg, (int) BFD_RELOC_LO16);
4726               }
4727           }
4728         else
4729           {
4730             if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
4731                 && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
4732               {
4733                 frag_grow (20);
4734                 macro_build ((char *) NULL, &icnt, &offset_expr, "addiu",
4735                              "t,r,j", tempreg, GP, (int) BFD_RELOC_GPREL16);
4736                 p = frag_var (rs_machine_dependent, 8, 0,
4737                               RELAX_ENCODE (4, 8, 0, 4, 0,
4738                                             mips_opts.warn_about_macros),
4739                               offset_expr.X_add_symbol, 0, NULL);
4740               }
4741             macro_build_lui (p, &icnt, &offset_expr, tempreg);
4742             if (p != NULL)
4743               p += 4;
4744             macro_build (p, &icnt, &offset_expr, "addiu",
4745                          "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4746           }
4747         }
4748       else if (mips_pic == SVR4_PIC && ! mips_big_got)
4749         {
4750           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
4751
4752           /* If this is a reference to an external symbol, and there
4753              is no constant, we want
4754                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4755              or if tempreg is PIC_CALL_REG
4756                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
4757              For a local symbol, we want
4758                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4759                nop
4760                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4761
4762              If we have a small constant, and this is a reference to
4763              an external symbol, we want
4764                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4765                nop
4766                addiu    $tempreg,$tempreg,<constant>
4767              For a local symbol, we want the same instruction
4768              sequence, but we output a BFD_RELOC_LO16 reloc on the
4769              addiu instruction.
4770
4771              If we have a large constant, and this is a reference to
4772              an external symbol, we want
4773                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4774                lui      $at,<hiconstant>
4775                addiu    $at,$at,<loconstant>
4776                addu     $tempreg,$tempreg,$at
4777              For a local symbol, we want the same instruction
4778              sequence, but we output a BFD_RELOC_LO16 reloc on the
4779              addiu instruction.  */
4780           expr1.X_add_number = offset_expr.X_add_number;
4781           offset_expr.X_add_number = 0;
4782           frag_grow (32);
4783           if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
4784             lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
4785           macro_build ((char *) NULL, &icnt, &offset_expr,
4786                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
4787                        "t,o(b)", tempreg, lw_reloc_type, GP);
4788           if (expr1.X_add_number == 0)
4789             {
4790               int off;
4791
4792               if (breg == 0)
4793                 off = 0;
4794               else
4795                 {
4796                   /* We're going to put in an addu instruction using
4797                      tempreg, so we may as well insert the nop right
4798                      now.  */
4799                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4800                                "nop", "");
4801                   off = 4;
4802                 }
4803               p = frag_var (rs_machine_dependent, 8 - off, 0,
4804                             RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
4805                                           (breg == 0
4806                                            ? mips_opts.warn_about_macros
4807                                            : 0)),
4808                             offset_expr.X_add_symbol, 0, NULL);
4809               if (breg == 0)
4810                 {
4811                   macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
4812                   p += 4;
4813                 }
4814               macro_build (p, &icnt, &expr1,
4815                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4816                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4817               /* FIXME: If breg == 0, and the next instruction uses
4818                  $tempreg, then if this variant case is used an extra
4819                  nop will be generated.  */
4820             }
4821           else if (expr1.X_add_number >= -0x8000
4822                    && expr1.X_add_number < 0x8000)
4823             {
4824               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4825                            "nop", "");
4826               macro_build ((char *) NULL, &icnt, &expr1,
4827                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4828                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4829               frag_var (rs_machine_dependent, 0, 0,
4830                         RELAX_ENCODE (0, 0, -12, -4, 0, 0),
4831                         offset_expr.X_add_symbol, 0, NULL);
4832             }
4833           else
4834             {
4835               int off1;
4836
4837               /* If we are going to add in a base register, and the
4838                  target register and the base register are the same,
4839                  then we are using AT as a temporary register.  Since
4840                  we want to load the constant into AT, we add our
4841                  current AT (from the global offset table) and the
4842                  register into the register now, and pretend we were
4843                  not using a base register.  */
4844               if (breg != treg)
4845                 off1 = 0;
4846               else
4847                 {
4848                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4849                                "nop", "");
4850                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4851                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
4852                                "d,v,t", treg, AT, breg);
4853                   breg = 0;
4854                   tempreg = treg;
4855                   off1 = -8;
4856                 }
4857
4858               /* Set mips_optimize around the lui instruction to avoid
4859                  inserting an unnecessary nop after the lw.  */
4860               hold_mips_optimize = mips_optimize;
4861               mips_optimize = 2;
4862               macro_build_lui (NULL, &icnt, &expr1, AT);
4863               mips_optimize = hold_mips_optimize;
4864
4865               macro_build ((char *) NULL, &icnt, &expr1,
4866                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4867                            "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
4868               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4869                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
4870                            "d,v,t", tempreg, tempreg, AT);
4871               frag_var (rs_machine_dependent, 0, 0,
4872                         RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
4873                         offset_expr.X_add_symbol, 0, NULL);
4874               used_at = 1;
4875             }
4876         }
4877       else if (mips_pic == SVR4_PIC)
4878         {
4879           int gpdel;
4880           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
4881           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
4882
4883           /* This is the large GOT case.  If this is a reference to an
4884              external symbol, and there is no constant, we want
4885                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
4886                addu     $tempreg,$tempreg,$gp
4887                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
4888              or if tempreg is PIC_CALL_REG
4889                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
4890                addu     $tempreg,$tempreg,$gp
4891                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
4892              For a local symbol, we want
4893                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4894                nop
4895                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4896
4897              If we have a small constant, and this is a reference to
4898              an external symbol, we want
4899                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
4900                addu     $tempreg,$tempreg,$gp
4901                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
4902                nop
4903                addiu    $tempreg,$tempreg,<constant>
4904              For a local symbol, we want
4905                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4906                nop
4907                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
4908
4909              If we have a large constant, and this is a reference to
4910              an external symbol, we want
4911                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
4912                addu     $tempreg,$tempreg,$gp
4913                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
4914                lui      $at,<hiconstant>
4915                addiu    $at,$at,<loconstant>
4916                addu     $tempreg,$tempreg,$at
4917              For a local symbol, we want
4918                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4919                lui      $at,<hiconstant>
4920                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
4921                addu     $tempreg,$tempreg,$at
4922              */
4923           expr1.X_add_number = offset_expr.X_add_number;
4924           offset_expr.X_add_number = 0;
4925           frag_grow (52);
4926           if (reg_needs_delay (GP))
4927             gpdel = 4;
4928           else
4929             gpdel = 0;
4930           if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
4931             {
4932               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
4933               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
4934             }
4935           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4936                        tempreg, lui_reloc_type);
4937           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4938                        HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
4939                        "d,v,t", tempreg, tempreg, GP);
4940           macro_build ((char *) NULL, &icnt, &offset_expr,
4941                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
4942                        "t,o(b)", tempreg, lw_reloc_type, tempreg);
4943           if (expr1.X_add_number == 0)
4944             {
4945               int off;
4946
4947               if (breg == 0)
4948                 off = 0;
4949               else
4950                 {
4951                   /* We're going to put in an addu instruction using
4952                      tempreg, so we may as well insert the nop right
4953                      now.  */
4954                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4955                                "nop", "");
4956                   off = 4;
4957                 }
4958
4959               p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
4960                             RELAX_ENCODE (12 + off, 12 + gpdel, gpdel,
4961                                           8 + gpdel, 0,
4962                                           (breg == 0
4963                                            ? mips_opts.warn_about_macros
4964                                            : 0)),
4965                             offset_expr.X_add_symbol, 0, NULL);
4966             }
4967           else if (expr1.X_add_number >= -0x8000
4968                    && expr1.X_add_number < 0x8000)
4969             {
4970               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4971                            "nop", "");
4972               macro_build ((char *) NULL, &icnt, &expr1,
4973                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4974                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4975
4976               p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
4977                             RELAX_ENCODE (20, 12 + gpdel, gpdel, 8 + gpdel, 0,
4978                                           (breg == 0
4979                                            ? mips_opts.warn_about_macros
4980                                            : 0)),
4981                             offset_expr.X_add_symbol, 0, NULL);
4982             }
4983           else
4984             {
4985               int adj, dreg;
4986
4987               /* If we are going to add in a base register, and the
4988                  target register and the base register are the same,
4989                  then we are using AT as a temporary register.  Since
4990                  we want to load the constant into AT, we add our
4991                  current AT (from the global offset table) and the
4992                  register into the register now, and pretend we were
4993                  not using a base register.  */
4994               if (breg != treg)
4995                 {
4996                   adj = 0;
4997                   dreg = tempreg;
4998                 }
4999               else
5000                 {
5001                   assert (tempreg == AT);
5002                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5003                                "nop", "");
5004                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5005                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5006                                "d,v,t", treg, AT, breg);
5007                   dreg = treg;
5008                   adj = 8;
5009                 }
5010
5011               /* Set mips_optimize around the lui instruction to avoid
5012                  inserting an unnecessary nop after the lw.  */
5013               hold_mips_optimize = mips_optimize;
5014               mips_optimize = 2;
5015               macro_build_lui (NULL, &icnt, &expr1, AT);
5016               mips_optimize = hold_mips_optimize;
5017
5018               macro_build ((char *) NULL, &icnt, &expr1,
5019                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5020                            "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5021               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5022                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5023                            "d,v,t", dreg, dreg, AT);
5024
5025               p = frag_var (rs_machine_dependent, 16 + gpdel + adj, 0,
5026                             RELAX_ENCODE (24 + adj, 16 + gpdel + adj, gpdel,
5027                                           8 + gpdel, 0,
5028                                           (breg == 0
5029                                            ? mips_opts.warn_about_macros
5030                                            : 0)),
5031                             offset_expr.X_add_symbol, 0, NULL);
5032
5033               used_at = 1;
5034             }
5035
5036           if (gpdel > 0)
5037             {
5038               /* This is needed because this instruction uses $gp, but
5039                  the first instruction on the main stream does not.  */
5040               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5041               p += 4;
5042             }
5043           macro_build (p, &icnt, &offset_expr,
5044                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5045                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
5046           p += 4;
5047           if (expr1.X_add_number >= -0x8000
5048               && expr1.X_add_number < 0x8000)
5049             {
5050               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5051               p += 4;
5052               macro_build (p, &icnt, &expr1,
5053                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5054                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5055               /* FIXME: If add_number is 0, and there was no base
5056                  register, the external symbol case ended with a load,
5057                  so if the symbol turns out to not be external, and
5058                  the next instruction uses tempreg, an unnecessary nop
5059                  will be inserted.  */
5060             }
5061           else
5062             {
5063               if (breg == treg)
5064                 {
5065                   /* We must add in the base register now, as in the
5066                      external symbol case.  */
5067                   assert (tempreg == AT);
5068                   macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5069                   p += 4;
5070                   macro_build (p, &icnt, (expressionS *) NULL,
5071                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5072                                "d,v,t", treg, AT, breg);
5073                   p += 4;
5074                   tempreg = treg;
5075                   /* We set breg to 0 because we have arranged to add
5076                      it in in both cases.  */
5077                   breg = 0;
5078                 }
5079
5080               macro_build_lui (p, &icnt, &expr1, AT);
5081               p += 4;
5082               macro_build (p, &icnt, &expr1,
5083                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5084                            "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5085               p += 4;
5086               macro_build (p, &icnt, (expressionS *) NULL,
5087                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5088                            "d,v,t", tempreg, tempreg, AT);
5089               p += 4;
5090             }
5091         }
5092       else if (mips_pic == EMBEDDED_PIC)
5093         {
5094           /* We use
5095                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5096              */
5097           macro_build ((char *) NULL, &icnt, &offset_expr,
5098                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5099                        "t,r,j", tempreg, GP, (int) BFD_RELOC_GPREL16);
5100         }
5101       else
5102         abort ();
5103
5104       if (breg != 0)
5105         {
5106           char *s;
5107
5108           if (mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
5109             s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu";
5110           else
5111             s = HAVE_64BIT_ADDRESSES ? "daddu" : "addu";
5112
5113           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s,
5114                        "d,v,t", treg, tempreg, breg);
5115         }
5116
5117       if (! used_at)
5118         return;
5119
5120       break;
5121
5122     case M_J_A:
5123       /* The j instruction may not be used in PIC code, since it
5124          requires an absolute address.  We convert it to a b
5125          instruction.  */
5126       if (mips_pic == NO_PIC)
5127         macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
5128       else
5129         macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
5130       return;
5131
5132       /* The jal instructions must be handled as macros because when
5133          generating PIC code they expand to multi-instruction
5134          sequences.  Normally they are simple instructions.  */
5135     case M_JAL_1:
5136       dreg = RA;
5137       /* Fall through.  */
5138     case M_JAL_2:
5139       if (mips_pic == NO_PIC
5140           || mips_pic == EMBEDDED_PIC)
5141         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5142                      "d,s", dreg, sreg);
5143       else if (mips_pic == SVR4_PIC)
5144         {
5145           if (sreg != PIC_CALL_REG)
5146             as_warn (_("MIPS PIC call to register other than $25"));
5147
5148           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5149                        "d,s", dreg, sreg);
5150           if (! HAVE_NEWABI)
5151             {
5152               if (mips_cprestore_offset < 0)
5153                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5154               else
5155                 {
5156                   if (! mips_frame_reg_valid)
5157                     {
5158                       as_warn (_("No .frame pseudo-op used in PIC code"));
5159                       /* Quiet this warning.  */
5160                       mips_frame_reg_valid = 1;
5161                     }
5162                   if (! mips_cprestore_valid)
5163                     {
5164                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5165                       /* Quiet this warning.  */
5166                       mips_cprestore_valid = 1;
5167                     }
5168                   expr1.X_add_number = mips_cprestore_offset;
5169                   macro_build ((char *) NULL, &icnt, &expr1,
5170                                HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
5171                                GP, (int) BFD_RELOC_LO16, mips_frame_reg);
5172                 }
5173             }
5174         }
5175       else
5176         abort ();
5177
5178       return;
5179
5180     case M_JAL_A:
5181       if (mips_pic == NO_PIC)
5182         macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
5183       else if (mips_pic == SVR4_PIC)
5184         {
5185           /* If this is a reference to an external symbol, and we are
5186              using a small GOT, we want
5187                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5188                nop
5189                jalr     $25
5190                nop
5191                lw       $gp,cprestore($sp)
5192              The cprestore value is set using the .cprestore
5193              pseudo-op.  If we are using a big GOT, we want
5194                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5195                addu     $25,$25,$gp
5196                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5197                nop
5198                jalr     $25
5199                nop
5200                lw       $gp,cprestore($sp)
5201              If the symbol is not external, we want
5202                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5203                nop
5204                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5205                jalr     $25
5206                nop
5207                lw $gp,cprestore($sp) */
5208           frag_grow (40);
5209           if (! mips_big_got)
5210             {
5211               macro_build ((char *) NULL, &icnt, &offset_expr,
5212                            HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5213                            "t,o(b)", PIC_CALL_REG,
5214                            (int) BFD_RELOC_MIPS_CALL16, GP);
5215               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5216                            "nop", "");
5217               p = frag_var (rs_machine_dependent, 4, 0,
5218                             RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5219                             offset_expr.X_add_symbol, 0, NULL);
5220             }
5221           else
5222             {
5223               int gpdel;
5224
5225               if (reg_needs_delay (GP))
5226                 gpdel = 4;
5227               else
5228                 gpdel = 0;
5229               macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5230                            PIC_CALL_REG, (int) BFD_RELOC_MIPS_CALL_HI16);
5231               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5232                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5233                            "d,v,t", PIC_CALL_REG, PIC_CALL_REG, GP);
5234               macro_build ((char *) NULL, &icnt, &offset_expr,
5235                            HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5236                            "t,o(b)", PIC_CALL_REG,
5237                            (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
5238               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5239                            "nop", "");
5240               p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5241                             RELAX_ENCODE (16, 12 + gpdel, gpdel, 8 + gpdel,
5242                                           0, 0),
5243                             offset_expr.X_add_symbol, 0, NULL);
5244               if (gpdel > 0)
5245                 {
5246                   macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5247                   p += 4;
5248                 }
5249               macro_build (p, &icnt, &offset_expr,
5250                            HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5251                            "t,o(b)", PIC_CALL_REG,
5252                            (int) BFD_RELOC_MIPS_GOT16, GP);
5253               p += 4;
5254               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5255               p += 4;
5256             }
5257           macro_build (p, &icnt, &offset_expr,
5258                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5259                        "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
5260                        (int) BFD_RELOC_LO16);
5261           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5262                        "jalr", "s", PIC_CALL_REG);
5263           if (! HAVE_NEWABI)
5264             {
5265               if (mips_cprestore_offset < 0)
5266                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5267               else
5268                 {
5269                   if (! mips_frame_reg_valid)
5270                     {
5271                       as_warn (_("No .frame pseudo-op used in PIC code"));
5272                       /* Quiet this warning.  */
5273                       mips_frame_reg_valid = 1;
5274                     }
5275                   if (! mips_cprestore_valid)
5276                     {
5277                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5278                       /* Quiet this warning.  */
5279                       mips_cprestore_valid = 1;
5280                     }
5281                   if (mips_opts.noreorder)
5282                     macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5283                              "nop", "");
5284                   expr1.X_add_number = mips_cprestore_offset;
5285                   macro_build ((char *) NULL, &icnt, &expr1,
5286                                HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
5287                                GP, (int) BFD_RELOC_LO16, mips_frame_reg);
5288                 }
5289             }
5290         }
5291       else if (mips_pic == EMBEDDED_PIC)
5292         {
5293           macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
5294           /* The linker may expand the call to a longer sequence which
5295              uses $at, so we must break rather than return.  */
5296           break;
5297         }
5298       else
5299         abort ();
5300
5301       return;
5302
5303     case M_LB_AB:
5304       s = "lb";
5305       goto ld;
5306     case M_LBU_AB:
5307       s = "lbu";
5308       goto ld;
5309     case M_LH_AB:
5310       s = "lh";
5311       goto ld;
5312     case M_LHU_AB:
5313       s = "lhu";
5314       goto ld;
5315     case M_LW_AB:
5316       s = "lw";
5317       goto ld;
5318     case M_LWC0_AB:
5319       s = "lwc0";
5320       /* Itbl support may require additional care here.  */
5321       coproc = 1;
5322       goto ld;
5323     case M_LWC1_AB:
5324       s = "lwc1";
5325       /* Itbl support may require additional care here.  */
5326       coproc = 1;
5327       goto ld;
5328     case M_LWC2_AB:
5329       s = "lwc2";
5330       /* Itbl support may require additional care here.  */
5331       coproc = 1;
5332       goto ld;
5333     case M_LWC3_AB:
5334       s = "lwc3";
5335       /* Itbl support may require additional care here.  */
5336       coproc = 1;
5337       goto ld;
5338     case M_LWL_AB:
5339       s = "lwl";
5340       lr = 1;
5341       goto ld;
5342     case M_LWR_AB:
5343       s = "lwr";
5344       lr = 1;
5345       goto ld;
5346     case M_LDC1_AB:
5347       if (mips_arch == CPU_R4650)
5348         {
5349           as_bad (_("opcode not supported on this processor"));
5350           return;
5351         }
5352       s = "ldc1";
5353       /* Itbl support may require additional care here.  */
5354       coproc = 1;
5355       goto ld;
5356     case M_LDC2_AB:
5357       s = "ldc2";
5358       /* Itbl support may require additional care here.  */
5359       coproc = 1;
5360       goto ld;
5361     case M_LDC3_AB:
5362       s = "ldc3";
5363       /* Itbl support may require additional care here.  */
5364       coproc = 1;
5365       goto ld;
5366     case M_LDL_AB:
5367       s = "ldl";
5368       lr = 1;
5369       goto ld;
5370     case M_LDR_AB:
5371       s = "ldr";
5372       lr = 1;
5373       goto ld;
5374     case M_LL_AB:
5375       s = "ll";
5376       goto ld;
5377     case M_LLD_AB:
5378       s = "lld";
5379       goto ld;
5380     case M_LWU_AB:
5381       s = "lwu";
5382     ld:
5383       if (breg == treg || coproc || lr)
5384         {
5385           tempreg = AT;
5386           used_at = 1;
5387         }
5388       else
5389         {
5390           tempreg = treg;
5391           used_at = 0;
5392         }
5393       goto ld_st;
5394     case M_SB_AB:
5395       s = "sb";
5396       goto st;
5397     case M_SH_AB:
5398       s = "sh";
5399       goto st;
5400     case M_SW_AB:
5401       s = "sw";
5402       goto st;
5403     case M_SWC0_AB:
5404       s = "swc0";
5405       /* Itbl support may require additional care here.  */
5406       coproc = 1;
5407       goto st;
5408     case M_SWC1_AB:
5409       s = "swc1";
5410       /* Itbl support may require additional care here.  */
5411       coproc = 1;
5412       goto st;
5413     case M_SWC2_AB:
5414       s = "swc2";
5415       /* Itbl support may require additional care here.  */
5416       coproc = 1;
5417       goto st;
5418     case M_SWC3_AB:
5419       s = "swc3";
5420       /* Itbl support may require additional care here.  */
5421       coproc = 1;
5422       goto st;
5423     case M_SWL_AB:
5424       s = "swl";
5425       goto st;
5426     case M_SWR_AB:
5427       s = "swr";
5428       goto st;
5429     case M_SC_AB:
5430       s = "sc";
5431       goto st;
5432     case M_SCD_AB:
5433       s = "scd";
5434       goto st;
5435     case M_SDC1_AB:
5436       if (mips_arch == CPU_R4650)
5437         {
5438           as_bad (_("opcode not supported on this processor"));
5439           return;
5440         }
5441       s = "sdc1";
5442       coproc = 1;
5443       /* Itbl support may require additional care here.  */
5444       goto st;
5445     case M_SDC2_AB:
5446       s = "sdc2";
5447       /* Itbl support may require additional care here.  */
5448       coproc = 1;
5449       goto st;
5450     case M_SDC3_AB:
5451       s = "sdc3";
5452       /* Itbl support may require additional care here.  */
5453       coproc = 1;
5454       goto st;
5455     case M_SDL_AB:
5456       s = "sdl";
5457       goto st;
5458     case M_SDR_AB:
5459       s = "sdr";
5460     st:
5461       tempreg = AT;
5462       used_at = 1;
5463     ld_st:
5464       /* Itbl support may require additional care here.  */
5465       if (mask == M_LWC1_AB
5466           || mask == M_SWC1_AB
5467           || mask == M_LDC1_AB
5468           || mask == M_SDC1_AB
5469           || mask == M_L_DAB
5470           || mask == M_S_DAB)
5471         fmt = "T,o(b)";
5472       else if (coproc)
5473         fmt = "E,o(b)";
5474       else
5475         fmt = "t,o(b)";
5476
5477       /* For embedded PIC, we allow loads where the offset is calculated
5478          by subtracting a symbol in the current segment from an unknown
5479          symbol, relative to a base register, e.g.:
5480                 <op>    $treg, <sym>-<localsym>($breg)
5481          This is used by the compiler for switch statements.  */
5482       if (mips_pic == EMBEDDED_PIC
5483           && offset_expr.X_op == O_subtract
5484           && (symbol_constant_p (offset_expr.X_op_symbol)
5485               ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
5486               : (symbol_equated_p (offset_expr.X_op_symbol)
5487                  && (S_GET_SEGMENT
5488                      (symbol_get_value_expression (offset_expr.X_op_symbol)
5489                       ->X_add_symbol)
5490                      == now_seg)))
5491           && breg != 0
5492           && (offset_expr.X_add_number == 0
5493               || OUTPUT_FLAVOR == bfd_target_elf_flavour))
5494         {
5495           /* For this case, we output the instructions:
5496                 lui     $tempreg,<sym>          (BFD_RELOC_PCREL_HI16_S)
5497                 addiu   $tempreg,$tempreg,$breg
5498                 <op>    $treg,<sym>($tempreg)   (BFD_RELOC_PCREL_LO16)
5499              If the relocation would fit entirely in 16 bits, it would be
5500              nice to emit:
5501                 <op>    $treg,<sym>($breg)      (BFD_RELOC_PCREL_LO16)
5502              instead, but that seems quite difficult.  */
5503           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5504                        tempreg, (int) BFD_RELOC_PCREL_HI16_S);
5505           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5506                        ((bfd_arch_bits_per_address (stdoutput) == 32
5507                          || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
5508                         ? "addu" : "daddu"),
5509                        "d,v,t", tempreg, tempreg, breg);
5510           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, treg,
5511                        (int) BFD_RELOC_PCREL_LO16, tempreg);
5512           if (! used_at)
5513             return;
5514           break;
5515         }
5516
5517       if (offset_expr.X_op != O_constant
5518           && offset_expr.X_op != O_symbol)
5519         {
5520           as_bad (_("expression too complex"));
5521           offset_expr.X_op = O_constant;
5522         }
5523
5524       /* A constant expression in PIC code can be handled just as it
5525          is in non PIC code.  */
5526       if (mips_pic == NO_PIC
5527           || offset_expr.X_op == O_constant)
5528         {
5529           /* If this is a reference to a GP relative symbol, and there
5530              is no base register, we want
5531                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
5532              Otherwise, if there is no base register, we want
5533                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5534                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5535              If we have a constant, we need two instructions anyhow,
5536              so we always use the latter form.
5537
5538              If we have a base register, and this is a reference to a
5539              GP relative symbol, we want
5540                addu     $tempreg,$breg,$gp
5541                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
5542              Otherwise we want
5543                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5544                addu     $tempreg,$tempreg,$breg
5545                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5546              With a constant we always use the latter case.
5547
5548              With 64bit address space and no base register and $at usable,
5549              we want
5550                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5551                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5552                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5553                dsll32   $tempreg,0
5554                daddu    $tempreg,$at
5555                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5556              If we have a base register, we want
5557                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5558                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5559                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5560                daddu    $at,$breg
5561                dsll32   $tempreg,0
5562                daddu    $tempreg,$at
5563                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5564
5565              Without $at we can't generate the optimal path for superscalar
5566              processors here since this would require two temporary registers.
5567                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5568                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5569                dsll     $tempreg,16
5570                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5571                dsll     $tempreg,16
5572                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5573              If we have a base register, we want
5574                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5575                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5576                dsll     $tempreg,16
5577                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5578                dsll     $tempreg,16
5579                daddu    $tempreg,$tempreg,$breg
5580                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5581
5582              If we have 64-bit addresses, as an optimization, for
5583              addresses which are 32-bit constants (e.g. kseg0/kseg1
5584              addresses) we fall back to the 32-bit address generation
5585              mechanism since it is more efficient.  This code should
5586              probably attempt to generate 64-bit constants more
5587              efficiently in general.
5588            */
5589           if (HAVE_64BIT_ADDRESSES
5590               && !(offset_expr.X_op == O_constant
5591                    && IS_SEXT_32BIT_NUM (offset_expr.X_add_number)))
5592             {
5593               p = NULL;
5594
5595               /* We don't do GP optimization for now because RELAX_ENCODE can't
5596                  hold the data for such large chunks.  */
5597
5598               if (used_at == 0)
5599                 {
5600                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5601                                tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5602                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5603                                AT, (int) BFD_RELOC_HI16_S);
5604                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5605                                tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5606                   if (breg != 0)
5607                     macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5608                                  "d,v,t", AT, AT, breg);
5609                   macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
5610                                "d,w,<", tempreg, tempreg, 0);
5611                   macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5612                                "d,v,t", tempreg, tempreg, AT);
5613                   macro_build (p, &icnt, &offset_expr, s,
5614                                fmt, treg, (int) BFD_RELOC_LO16, tempreg);
5615                   used_at = 1;
5616                 }
5617               else
5618                 {
5619                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5620                                tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5621                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5622                                tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5623                   macro_build (p, &icnt, (expressionS *) NULL, "dsll",
5624                                "d,w,<", tempreg, tempreg, 16);
5625                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5626                                tempreg, tempreg, (int) BFD_RELOC_HI16_S);
5627                   macro_build (p, &icnt, (expressionS *) NULL, "dsll",
5628                                "d,w,<", tempreg, tempreg, 16);
5629                   if (breg != 0)
5630                     macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5631                                  "d,v,t", tempreg, tempreg, breg);
5632                   macro_build (p, &icnt, &offset_expr, s,
5633                                fmt, treg, (int) BFD_RELOC_LO16, tempreg);
5634                 }
5635
5636               return;
5637             }
5638
5639           if (breg == 0)
5640             {
5641               if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
5642                   || nopic_need_relax (offset_expr.X_add_symbol, 1))
5643                 p = NULL;
5644               else
5645                 {
5646                   frag_grow (20);
5647                   macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5648                                treg, (int) BFD_RELOC_GPREL16, GP);
5649                   p = frag_var (rs_machine_dependent, 8, 0,
5650                                 RELAX_ENCODE (4, 8, 0, 4, 0,
5651                                               (mips_opts.warn_about_macros
5652                                                || (used_at
5653                                                    && mips_opts.noat))),
5654                                 offset_expr.X_add_symbol, 0, NULL);
5655                   used_at = 0;
5656                 }
5657               macro_build_lui (p, &icnt, &offset_expr, tempreg);
5658               if (p != NULL)
5659                 p += 4;
5660               macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5661                            (int) BFD_RELOC_LO16, tempreg);
5662             }
5663           else
5664             {
5665               if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
5666                   || nopic_need_relax (offset_expr.X_add_symbol, 1))
5667                 p = NULL;
5668               else
5669                 {
5670                   frag_grow (28);
5671                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5672                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5673                                "d,v,t", tempreg, breg, GP);
5674                   macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5675                                treg, (int) BFD_RELOC_GPREL16, tempreg);
5676                   p = frag_var (rs_machine_dependent, 12, 0,
5677                                 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
5678                                 offset_expr.X_add_symbol, 0, NULL);
5679                 }
5680               macro_build_lui (p, &icnt, &offset_expr, tempreg);
5681               if (p != NULL)
5682                 p += 4;
5683               macro_build (p, &icnt, (expressionS *) NULL,
5684                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5685                            "d,v,t", tempreg, tempreg, breg);
5686               if (p != NULL)
5687                 p += 4;
5688               macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5689                            (int) BFD_RELOC_LO16, tempreg);
5690             }
5691         }
5692       else if (mips_pic == SVR4_PIC && ! mips_big_got)
5693         {
5694           /* If this is a reference to an external symbol, we want
5695                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5696                nop
5697                <op>     $treg,0($tempreg)
5698              Otherwise we want
5699                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5700                nop
5701                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5702                <op>     $treg,0($tempreg)
5703              If there is a base register, we add it to $tempreg before
5704              the <op>.  If there is a constant, we stick it in the
5705              <op> instruction.  We don't handle constants larger than
5706              16 bits, because we have no way to load the upper 16 bits
5707              (actually, we could handle them for the subset of cases
5708              in which we are not using $at).  */
5709           assert (offset_expr.X_op == O_symbol);
5710           expr1.X_add_number = offset_expr.X_add_number;
5711           offset_expr.X_add_number = 0;
5712           if (expr1.X_add_number < -0x8000
5713               || expr1.X_add_number >= 0x8000)
5714             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5715           frag_grow (20);
5716           macro_build ((char *) NULL, &icnt, &offset_expr,
5717                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5718                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
5719           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
5720           p = frag_var (rs_machine_dependent, 4, 0,
5721                         RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5722                         offset_expr.X_add_symbol, 0, NULL);
5723           macro_build (p, &icnt, &offset_expr,
5724                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5725                        "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5726           if (breg != 0)
5727             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5728                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5729                          "d,v,t", tempreg, tempreg, breg);
5730           macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
5731                        (int) BFD_RELOC_LO16, tempreg);
5732         }
5733       else if (mips_pic == SVR4_PIC)
5734         {
5735           int gpdel;
5736
5737           /* If this is a reference to an external symbol, we want
5738                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5739                addu     $tempreg,$tempreg,$gp
5740                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5741                <op>     $treg,0($tempreg)
5742              Otherwise we want
5743                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5744                nop
5745                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5746                <op>     $treg,0($tempreg)
5747              If there is a base register, we add it to $tempreg before
5748              the <op>.  If there is a constant, we stick it in the
5749              <op> instruction.  We don't handle constants larger than
5750              16 bits, because we have no way to load the upper 16 bits
5751              (actually, we could handle them for the subset of cases
5752              in which we are not using $at).  */
5753           assert (offset_expr.X_op == O_symbol);
5754           expr1.X_add_number = offset_expr.X_add_number;
5755           offset_expr.X_add_number = 0;
5756           if (expr1.X_add_number < -0x8000
5757               || expr1.X_add_number >= 0x8000)
5758             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5759           if (reg_needs_delay (GP))
5760             gpdel = 4;
5761           else
5762             gpdel = 0;
5763           frag_grow (36);
5764           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5765                        tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
5766           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5767                        HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5768                        "d,v,t", tempreg, tempreg, GP);
5769           macro_build ((char *) NULL, &icnt, &offset_expr,
5770                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5771                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
5772                        tempreg);
5773           p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5774                         RELAX_ENCODE (12, 12 + gpdel, gpdel, 8 + gpdel, 0, 0),
5775                         offset_expr.X_add_symbol, 0, NULL);
5776           if (gpdel > 0)
5777             {
5778               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5779               p += 4;
5780             }
5781           macro_build (p, &icnt, &offset_expr,
5782                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5783                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16, GP);
5784           p += 4;
5785           macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5786           p += 4;
5787           macro_build (p, &icnt, &offset_expr,
5788                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5789                        "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5790           if (breg != 0)
5791             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5792                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5793                          "d,v,t", tempreg, tempreg, breg);
5794           macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
5795                        (int) BFD_RELOC_LO16, tempreg);
5796         }
5797       else if (mips_pic == EMBEDDED_PIC)
5798         {
5799           /* If there is no base register, we want
5800                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
5801              If there is a base register, we want
5802                addu     $tempreg,$breg,$gp
5803                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
5804              */
5805           assert (offset_expr.X_op == O_symbol);
5806           if (breg == 0)
5807             {
5808               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5809                            treg, (int) BFD_RELOC_GPREL16, GP);
5810               used_at = 0;
5811             }
5812           else
5813             {
5814               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5815                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5816                            "d,v,t", tempreg, breg, GP);
5817               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5818                            treg, (int) BFD_RELOC_GPREL16, tempreg);
5819             }
5820         }
5821       else
5822         abort ();
5823
5824       if (! used_at)
5825         return;
5826
5827       break;
5828
5829     case M_LI:
5830     case M_LI_S:
5831       load_register (&icnt, treg, &imm_expr, 0);
5832       return;
5833
5834     case M_DLI:
5835       load_register (&icnt, treg, &imm_expr, 1);
5836       return;
5837
5838     case M_LI_SS:
5839       if (imm_expr.X_op == O_constant)
5840         {
5841           load_register (&icnt, AT, &imm_expr, 0);
5842           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5843                        "mtc1", "t,G", AT, treg);
5844           break;
5845         }
5846       else
5847         {
5848           assert (offset_expr.X_op == O_symbol
5849                   && strcmp (segment_name (S_GET_SEGMENT
5850                                            (offset_expr.X_add_symbol)),
5851                              ".lit4") == 0
5852                   && offset_expr.X_add_number == 0);
5853           macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
5854                        treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
5855           return;
5856         }
5857
5858     case M_LI_D:
5859       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
5860          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
5861          order 32 bits of the value and the low order 32 bits are either
5862          zero or in OFFSET_EXPR.  */
5863       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
5864         {
5865           if (HAVE_64BIT_GPRS)
5866             load_register (&icnt, treg, &imm_expr, 1);
5867           else
5868             {
5869               int hreg, lreg;
5870
5871               if (target_big_endian)
5872                 {
5873                   hreg = treg;
5874                   lreg = treg + 1;
5875                 }
5876               else
5877                 {
5878                   hreg = treg + 1;
5879                   lreg = treg;
5880                 }
5881
5882               if (hreg <= 31)
5883                 load_register (&icnt, hreg, &imm_expr, 0);
5884               if (lreg <= 31)
5885                 {
5886                   if (offset_expr.X_op == O_absent)
5887                     move_register (&icnt, lreg, 0);
5888                   else
5889                     {
5890                       assert (offset_expr.X_op == O_constant);
5891                       load_register (&icnt, lreg, &offset_expr, 0);
5892                     }
5893                 }
5894             }
5895           return;
5896         }
5897
5898       /* We know that sym is in the .rdata section.  First we get the
5899          upper 16 bits of the address.  */
5900       if (mips_pic == NO_PIC)
5901         {
5902           macro_build_lui (NULL, &icnt, &offset_expr, AT);
5903         }
5904       else if (mips_pic == SVR4_PIC)
5905         {
5906           macro_build ((char *) NULL, &icnt, &offset_expr,
5907                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5908                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
5909         }
5910       else if (mips_pic == EMBEDDED_PIC)
5911         {
5912           /* For embedded PIC we pick up the entire address off $gp in
5913              a single instruction.  */
5914           macro_build ((char *) NULL, &icnt, &offset_expr,
5915                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5916                        "t,r,j", AT, GP, (int) BFD_RELOC_GPREL16);
5917           offset_expr.X_op = O_constant;
5918           offset_expr.X_add_number = 0;
5919         }
5920       else
5921         abort ();
5922
5923       /* Now we load the register(s).  */
5924       if (HAVE_64BIT_GPRS)
5925         macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
5926                      treg, (int) BFD_RELOC_LO16, AT);
5927       else
5928         {
5929           macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
5930                        treg, (int) BFD_RELOC_LO16, AT);
5931           if (treg != 31)
5932             {
5933               /* FIXME: How in the world do we deal with the possible
5934                  overflow here?  */
5935               offset_expr.X_add_number += 4;
5936               macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
5937                            treg + 1, (int) BFD_RELOC_LO16, AT);
5938             }
5939         }
5940
5941       /* To avoid confusion in tc_gen_reloc, we must ensure that this
5942          does not become a variant frag.  */
5943       frag_wane (frag_now);
5944       frag_new (0);
5945
5946       break;
5947
5948     case M_LI_DD:
5949       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
5950          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
5951          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
5952          the value and the low order 32 bits are either zero or in
5953          OFFSET_EXPR.  */
5954       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
5955         {
5956           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_FPRS);
5957           if (HAVE_64BIT_FPRS)
5958             {
5959               assert (HAVE_64BIT_GPRS);
5960               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5961                            "dmtc1", "t,S", AT, treg);
5962             }
5963           else
5964             {
5965               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5966                            "mtc1", "t,G", AT, treg + 1);
5967               if (offset_expr.X_op == O_absent)
5968                 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5969                              "mtc1", "t,G", 0, treg);
5970               else
5971                 {
5972                   assert (offset_expr.X_op == O_constant);
5973                   load_register (&icnt, AT, &offset_expr, 0);
5974                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5975                                "mtc1", "t,G", AT, treg);
5976                 }
5977             }
5978           break;
5979         }
5980
5981       assert (offset_expr.X_op == O_symbol
5982               && offset_expr.X_add_number == 0);
5983       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
5984       if (strcmp (s, ".lit8") == 0)
5985         {
5986           if (mips_opts.isa != ISA_MIPS1)
5987             {
5988               macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
5989                            "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL, GP);
5990               return;
5991             }
5992           breg = GP;
5993           r = BFD_RELOC_MIPS_LITERAL;
5994           goto dob;
5995         }
5996       else
5997         {
5998           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
5999           if (mips_pic == SVR4_PIC)
6000             macro_build ((char *) NULL, &icnt, &offset_expr,
6001                          HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6002                          "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
6003           else
6004             {
6005               /* FIXME: This won't work for a 64 bit address.  */
6006               macro_build_lui (NULL, &icnt, &offset_expr, AT);
6007             }
6008
6009           if (mips_opts.isa != ISA_MIPS1)
6010             {
6011               macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6012                            "T,o(b)", treg, (int) BFD_RELOC_LO16, AT);
6013
6014               /* To avoid confusion in tc_gen_reloc, we must ensure
6015                  that this does not become a variant frag.  */
6016               frag_wane (frag_now);
6017               frag_new (0);
6018
6019               break;
6020             }
6021           breg = AT;
6022           r = BFD_RELOC_LO16;
6023           goto dob;
6024         }
6025
6026     case M_L_DOB:
6027       if (mips_arch == CPU_R4650)
6028         {
6029           as_bad (_("opcode not supported on this processor"));
6030           return;
6031         }
6032       /* Even on a big endian machine $fn comes before $fn+1.  We have
6033          to adjust when loading from memory.  */
6034       r = BFD_RELOC_LO16;
6035     dob:
6036       assert (mips_opts.isa == ISA_MIPS1);
6037       macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6038                    target_big_endian ? treg + 1 : treg,
6039                    (int) r, breg);
6040       /* FIXME: A possible overflow which I don't know how to deal
6041          with.  */
6042       offset_expr.X_add_number += 4;
6043       macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6044                    target_big_endian ? treg : treg + 1,
6045                    (int) r, breg);
6046
6047       /* To avoid confusion in tc_gen_reloc, we must ensure that this
6048          does not become a variant frag.  */
6049       frag_wane (frag_now);
6050       frag_new (0);
6051
6052       if (breg != AT)
6053         return;
6054       break;
6055
6056     case M_L_DAB:
6057       /*
6058        * The MIPS assembler seems to check for X_add_number not
6059        * being double aligned and generating:
6060        *        lui     at,%hi(foo+1)
6061        *        addu    at,at,v1
6062        *        addiu   at,at,%lo(foo+1)
6063        *        lwc1    f2,0(at)
6064        *        lwc1    f3,4(at)
6065        * But, the resulting address is the same after relocation so why
6066        * generate the extra instruction?
6067        */
6068       if (mips_arch == CPU_R4650)
6069         {
6070           as_bad (_("opcode not supported on this processor"));
6071           return;
6072         }
6073       /* Itbl support may require additional care here.  */
6074       coproc = 1;
6075       if (mips_opts.isa != ISA_MIPS1)
6076         {
6077           s = "ldc1";
6078           goto ld;
6079         }
6080
6081       s = "lwc1";
6082       fmt = "T,o(b)";
6083       goto ldd_std;
6084
6085     case M_S_DAB:
6086       if (mips_arch == CPU_R4650)
6087         {
6088           as_bad (_("opcode not supported on this processor"));
6089           return;
6090         }
6091
6092       if (mips_opts.isa != ISA_MIPS1)
6093         {
6094           s = "sdc1";
6095           goto st;
6096         }
6097
6098       s = "swc1";
6099       fmt = "T,o(b)";
6100       /* Itbl support may require additional care here.  */
6101       coproc = 1;
6102       goto ldd_std;
6103
6104     case M_LD_AB:
6105       if (HAVE_64BIT_GPRS)
6106         {
6107           s = "ld";
6108           goto ld;
6109         }
6110
6111       s = "lw";
6112       fmt = "t,o(b)";
6113       goto ldd_std;
6114
6115     case M_SD_AB:
6116       if (HAVE_64BIT_GPRS)
6117         {
6118           s = "sd";
6119           goto st;
6120         }
6121
6122       s = "sw";
6123       fmt = "t,o(b)";
6124
6125     ldd_std:
6126       /* We do _not_ bother to allow embedded PIC (symbol-local_symbol)
6127          loads for the case of doing a pair of loads to simulate an 'ld'.
6128          This is not currently done by the compiler, and assembly coders
6129          writing embedded-pic code can cope.  */
6130
6131       if (offset_expr.X_op != O_symbol
6132           && offset_expr.X_op != O_constant)
6133         {
6134           as_bad (_("expression too complex"));
6135           offset_expr.X_op = O_constant;
6136         }
6137
6138       /* Even on a big endian machine $fn comes before $fn+1.  We have
6139          to adjust when loading from memory.  We set coproc if we must
6140          load $fn+1 first.  */
6141       /* Itbl support may require additional care here.  */
6142       if (! target_big_endian)
6143         coproc = 0;
6144
6145       if (mips_pic == NO_PIC
6146           || offset_expr.X_op == O_constant)
6147         {
6148           /* If this is a reference to a GP relative symbol, we want
6149                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6150                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6151              If we have a base register, we use this
6152                addu     $at,$breg,$gp
6153                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6154                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6155              If this is not a GP relative symbol, we want
6156                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6157                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6158                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6159              If there is a base register, we add it to $at after the
6160              lui instruction.  If there is a constant, we always use
6161              the last case.  */
6162           if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6163               || nopic_need_relax (offset_expr.X_add_symbol, 1))
6164             {
6165               p = NULL;
6166               used_at = 1;
6167             }
6168           else
6169             {
6170               int off;
6171
6172               if (breg == 0)
6173                 {
6174                   frag_grow (28);
6175                   tempreg = GP;
6176                   off = 0;
6177                   used_at = 0;
6178                 }
6179               else
6180                 {
6181                   frag_grow (36);
6182                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6183                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6184                                "d,v,t", AT, breg, GP);
6185                   tempreg = AT;
6186                   off = 4;
6187                   used_at = 1;
6188                 }
6189
6190               /* Itbl support may require additional care here.  */
6191               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6192                            coproc ? treg + 1 : treg,
6193                            (int) BFD_RELOC_GPREL16, tempreg);
6194               offset_expr.X_add_number += 4;
6195
6196               /* Set mips_optimize to 2 to avoid inserting an
6197                  undesired nop.  */
6198               hold_mips_optimize = mips_optimize;
6199               mips_optimize = 2;
6200               /* Itbl support may require additional care here.  */
6201               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6202                            coproc ? treg : treg + 1,
6203                            (int) BFD_RELOC_GPREL16, tempreg);
6204               mips_optimize = hold_mips_optimize;
6205
6206               p = frag_var (rs_machine_dependent, 12 + off, 0,
6207                             RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
6208                                           used_at && mips_opts.noat),
6209                             offset_expr.X_add_symbol, 0, NULL);
6210
6211               /* We just generated two relocs.  When tc_gen_reloc
6212                  handles this case, it will skip the first reloc and
6213                  handle the second.  The second reloc already has an
6214                  extra addend of 4, which we added above.  We must
6215                  subtract it out, and then subtract another 4 to make
6216                  the first reloc come out right.  The second reloc
6217                  will come out right because we are going to add 4 to
6218                  offset_expr when we build its instruction below.
6219
6220                  If we have a symbol, then we don't want to include
6221                  the offset, because it will wind up being included
6222                  when we generate the reloc.  */
6223
6224               if (offset_expr.X_op == O_constant)
6225                 offset_expr.X_add_number -= 8;
6226               else
6227                 {
6228                   offset_expr.X_add_number = -4;
6229                   offset_expr.X_op = O_constant;
6230                 }
6231             }
6232           macro_build_lui (p, &icnt, &offset_expr, AT);
6233           if (p != NULL)
6234             p += 4;
6235           if (breg != 0)
6236             {
6237               macro_build (p, &icnt, (expressionS *) NULL,
6238                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6239                            "d,v,t", AT, breg, AT);
6240               if (p != NULL)
6241                 p += 4;
6242             }
6243           /* Itbl support may require additional care here.  */
6244           macro_build (p, &icnt, &offset_expr, s, fmt,
6245                        coproc ? treg + 1 : treg,
6246                        (int) BFD_RELOC_LO16, AT);
6247           if (p != NULL)
6248             p += 4;
6249           /* FIXME: How do we handle overflow here?  */
6250           offset_expr.X_add_number += 4;
6251           /* Itbl support may require additional care here.  */
6252           macro_build (p, &icnt, &offset_expr, s, fmt,
6253                        coproc ? treg : treg + 1,
6254                        (int) BFD_RELOC_LO16, AT);
6255         }
6256       else if (mips_pic == SVR4_PIC && ! mips_big_got)
6257         {
6258           int off;
6259
6260           /* If this is a reference to an external symbol, we want
6261                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6262                nop
6263                <op>     $treg,0($at)
6264                <op>     $treg+1,4($at)
6265              Otherwise we want
6266                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6267                nop
6268                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6269                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6270              If there is a base register we add it to $at before the
6271              lwc1 instructions.  If there is a constant we include it
6272              in the lwc1 instructions.  */
6273           used_at = 1;
6274           expr1.X_add_number = offset_expr.X_add_number;
6275           offset_expr.X_add_number = 0;
6276           if (expr1.X_add_number < -0x8000
6277               || expr1.X_add_number >= 0x8000 - 4)
6278             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6279           if (breg == 0)
6280             off = 0;
6281           else
6282             off = 4;
6283           frag_grow (24 + off);
6284           macro_build ((char *) NULL, &icnt, &offset_expr,
6285                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6286                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
6287           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6288           if (breg != 0)
6289             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6290                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6291                          "d,v,t", AT, breg, AT);
6292           /* Itbl support may require additional care here.  */
6293           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6294                        coproc ? treg + 1 : treg,
6295                        (int) BFD_RELOC_LO16, AT);
6296           expr1.X_add_number += 4;
6297
6298           /* Set mips_optimize to 2 to avoid inserting an undesired
6299              nop.  */
6300           hold_mips_optimize = mips_optimize;
6301           mips_optimize = 2;
6302           /* Itbl support may require additional care here.  */
6303           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6304                        coproc ? treg : treg + 1,
6305                        (int) BFD_RELOC_LO16, AT);
6306           mips_optimize = hold_mips_optimize;
6307
6308           (void) frag_var (rs_machine_dependent, 0, 0,
6309                            RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
6310                            offset_expr.X_add_symbol, 0, NULL);
6311         }
6312       else if (mips_pic == SVR4_PIC)
6313         {
6314           int gpdel, off;
6315
6316           /* If this is a reference to an external symbol, we want
6317                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
6318                addu     $at,$at,$gp
6319                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
6320                nop
6321                <op>     $treg,0($at)
6322                <op>     $treg+1,4($at)
6323              Otherwise we want
6324                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6325                nop
6326                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6327                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6328              If there is a base register we add it to $at before the
6329              lwc1 instructions.  If there is a constant we include it
6330              in the lwc1 instructions.  */
6331           used_at = 1;
6332           expr1.X_add_number = offset_expr.X_add_number;
6333           offset_expr.X_add_number = 0;
6334           if (expr1.X_add_number < -0x8000
6335               || expr1.X_add_number >= 0x8000 - 4)
6336             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6337           if (reg_needs_delay (GP))
6338             gpdel = 4;
6339           else
6340             gpdel = 0;
6341           if (breg == 0)
6342             off = 0;
6343           else
6344             off = 4;
6345           frag_grow (56);
6346           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6347                        AT, (int) BFD_RELOC_MIPS_GOT_HI16);
6348           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6349                        HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6350                        "d,v,t", AT, AT, GP);
6351           macro_build ((char *) NULL, &icnt, &offset_expr,
6352                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6353                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
6354           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6355           if (breg != 0)
6356             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6357                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6358                          "d,v,t", AT, breg, AT);
6359           /* Itbl support may require additional care here.  */
6360           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6361                        coproc ? treg + 1 : treg,
6362                        (int) BFD_RELOC_LO16, AT);
6363           expr1.X_add_number += 4;
6364
6365           /* Set mips_optimize to 2 to avoid inserting an undesired
6366              nop.  */
6367           hold_mips_optimize = mips_optimize;
6368           mips_optimize = 2;
6369           /* Itbl support may require additional care here.  */
6370           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6371                        coproc ? treg : treg + 1,
6372                        (int) BFD_RELOC_LO16, AT);
6373           mips_optimize = hold_mips_optimize;
6374           expr1.X_add_number -= 4;
6375
6376           p = frag_var (rs_machine_dependent, 16 + gpdel + off, 0,
6377                         RELAX_ENCODE (24 + off, 16 + gpdel + off, gpdel,
6378                                       8 + gpdel + off, 1, 0),
6379                         offset_expr.X_add_symbol, 0, NULL);
6380           if (gpdel > 0)
6381             {
6382               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6383               p += 4;
6384             }
6385           macro_build (p, &icnt, &offset_expr,
6386                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6387                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16, GP);
6388           p += 4;
6389           macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6390           p += 4;
6391           if (breg != 0)
6392             {
6393               macro_build (p, &icnt, (expressionS *) NULL,
6394                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6395                            "d,v,t", AT, breg, AT);
6396               p += 4;
6397             }
6398           /* Itbl support may require additional care here.  */
6399           macro_build (p, &icnt, &expr1, s, fmt,
6400                        coproc ? treg + 1 : treg,
6401                        (int) BFD_RELOC_LO16, AT);
6402           p += 4;
6403           expr1.X_add_number += 4;
6404
6405           /* Set mips_optimize to 2 to avoid inserting an undesired
6406              nop.  */
6407           hold_mips_optimize = mips_optimize;
6408           mips_optimize = 2;
6409           /* Itbl support may require additional care here.  */
6410           macro_build (p, &icnt, &expr1, s, fmt,
6411                        coproc ? treg : treg + 1,
6412                        (int) BFD_RELOC_LO16, AT);
6413           mips_optimize = hold_mips_optimize;
6414         }
6415       else if (mips_pic == EMBEDDED_PIC)
6416         {
6417           /* If there is no base register, we use
6418                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6419                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6420              If we have a base register, we use
6421                addu     $at,$breg,$gp
6422                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6423                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6424              */
6425           if (breg == 0)
6426             {
6427               tempreg = GP;
6428               used_at = 0;
6429             }
6430           else
6431             {
6432               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6433                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6434                            "d,v,t", AT, breg, GP);
6435               tempreg = AT;
6436               used_at = 1;
6437             }
6438
6439           /* Itbl support may require additional care here.  */
6440           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6441                        coproc ? treg + 1 : treg,
6442                        (int) BFD_RELOC_GPREL16, tempreg);
6443           offset_expr.X_add_number += 4;
6444           /* Itbl support may require additional care here.  */
6445           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6446                        coproc ? treg : treg + 1,
6447                        (int) BFD_RELOC_GPREL16, tempreg);
6448         }
6449       else
6450         abort ();
6451
6452       if (! used_at)
6453         return;
6454
6455       break;
6456
6457     case M_LD_OB:
6458       s = "lw";
6459       goto sd_ob;
6460     case M_SD_OB:
6461       s = "sw";
6462     sd_ob:
6463       assert (HAVE_32BIT_ADDRESSES);
6464       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
6465                    (int) BFD_RELOC_LO16, breg);
6466       offset_expr.X_add_number += 4;
6467       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
6468                    (int) BFD_RELOC_LO16, breg);
6469       return;
6470
6471    /* New code added to support COPZ instructions.
6472       This code builds table entries out of the macros in mip_opcodes.
6473       R4000 uses interlocks to handle coproc delays.
6474       Other chips (like the R3000) require nops to be inserted for delays.
6475
6476       FIXME: Currently, we require that the user handle delays.
6477       In order to fill delay slots for non-interlocked chips,
6478       we must have a way to specify delays based on the coprocessor.
6479       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6480       What are the side-effects of the cop instruction?
6481       What cache support might we have and what are its effects?
6482       Both coprocessor & memory require delays. how long???
6483       What registers are read/set/modified?
6484
6485       If an itbl is provided to interpret cop instructions,
6486       this knowledge can be encoded in the itbl spec.  */
6487
6488     case M_COP0:
6489       s = "c0";
6490       goto copz;
6491     case M_COP1:
6492       s = "c1";
6493       goto copz;
6494     case M_COP2:
6495       s = "c2";
6496       goto copz;
6497     case M_COP3:
6498       s = "c3";
6499     copz:
6500       /* For now we just do C (same as Cz).  The parameter will be
6501          stored in insn_opcode by mips_ip.  */
6502       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "C",
6503                    ip->insn_opcode);
6504       return;
6505
6506     case M_MOVE:
6507       move_register (&icnt, dreg, sreg);
6508       return;
6509
6510 #ifdef LOSING_COMPILER
6511     default:
6512       /* Try and see if this is a new itbl instruction.
6513          This code builds table entries out of the macros in mip_opcodes.
6514          FIXME: For now we just assemble the expression and pass it's
6515          value along as a 32-bit immediate.
6516          We may want to have the assembler assemble this value,
6517          so that we gain the assembler's knowledge of delay slots,
6518          symbols, etc.
6519          Would it be more efficient to use mask (id) here? */
6520       if (itbl_have_entries
6521           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
6522         {
6523           s = ip->insn_mo->name;
6524           s2 = "cop3";
6525           coproc = ITBL_DECODE_PNUM (immed_expr);;
6526           macro_build ((char *) NULL, &icnt, &immed_expr, s, "C");
6527           return;
6528         }
6529       macro2 (ip);
6530       return;
6531     }
6532   if (mips_opts.noat)
6533     as_warn (_("Macro used $at after \".set noat\""));
6534 }
6535
6536 static void
6537 macro2 (ip)
6538      struct mips_cl_insn *ip;
6539 {
6540   register int treg, sreg, dreg, breg;
6541   int tempreg;
6542   int mask;
6543   int icnt = 0;
6544   int used_at;
6545   expressionS expr1;
6546   const char *s;
6547   const char *s2;
6548   const char *fmt;
6549   int likely = 0;
6550   int dbl = 0;
6551   int coproc = 0;
6552   int lr = 0;
6553   int imm = 0;
6554   int off;
6555   offsetT maxnum;
6556   bfd_reloc_code_real_type r;
6557   char *p;
6558
6559   treg = (ip->insn_opcode >> 16) & 0x1f;
6560   dreg = (ip->insn_opcode >> 11) & 0x1f;
6561   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
6562   mask = ip->insn_mo->mask;
6563
6564   expr1.X_op = O_constant;
6565   expr1.X_op_symbol = NULL;
6566   expr1.X_add_symbol = NULL;
6567   expr1.X_add_number = 1;
6568
6569   switch (mask)
6570     {
6571 #endif /* LOSING_COMPILER */
6572
6573     case M_DMUL:
6574       dbl = 1;
6575     case M_MUL:
6576       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6577                    dbl ? "dmultu" : "multu", "s,t", sreg, treg);
6578       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6579                    dreg);
6580       return;
6581
6582     case M_DMUL_I:
6583       dbl = 1;
6584     case M_MUL_I:
6585       /* The MIPS assembler some times generates shifts and adds.  I'm
6586          not trying to be that fancy. GCC should do this for us
6587          anyway.  */
6588       load_register (&icnt, AT, &imm_expr, dbl);
6589       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6590                    dbl ? "dmult" : "mult", "s,t", sreg, AT);
6591       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6592                    dreg);
6593       break;
6594
6595     case M_DMULO_I:
6596       dbl = 1;
6597     case M_MULO_I:
6598       imm = 1;
6599       goto do_mulo;
6600
6601     case M_DMULO:
6602       dbl = 1;
6603     case M_MULO:
6604     do_mulo:
6605       mips_emit_delays (true);
6606       ++mips_opts.noreorder;
6607       mips_any_noreorder = 1;
6608       if (imm)
6609         load_register (&icnt, AT, &imm_expr, dbl);
6610       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6611                    dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
6612       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6613                    dreg);
6614       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6615                    dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, 31);
6616       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
6617                    AT);
6618       if (mips_trap)
6619         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne", "s,t",
6620                      dreg, AT);
6621       else
6622         {
6623           expr1.X_add_number = 8;
6624           macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg,
6625                        AT);
6626           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
6627                        0);
6628           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
6629                        "c", 6);
6630         }
6631       --mips_opts.noreorder;
6632       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d", dreg);
6633       break;
6634
6635     case M_DMULOU_I:
6636       dbl = 1;
6637     case M_MULOU_I:
6638       imm = 1;
6639       goto do_mulou;
6640
6641     case M_DMULOU:
6642       dbl = 1;
6643     case M_MULOU:
6644     do_mulou:
6645       mips_emit_delays (true);
6646       ++mips_opts.noreorder;
6647       mips_any_noreorder = 1;
6648       if (imm)
6649         load_register (&icnt, AT, &imm_expr, dbl);
6650       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6651                    dbl ? "dmultu" : "multu",
6652                    "s,t", sreg, imm ? AT : treg);
6653       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
6654                    AT);
6655       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6656                    dreg);
6657       if (mips_trap)
6658         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne", "s,t",
6659                      AT, 0);
6660       else
6661         {
6662           expr1.X_add_number = 8;
6663           macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
6664           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
6665                        0);
6666           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
6667                        "c", 6);
6668         }
6669       --mips_opts.noreorder;
6670       break;
6671
6672     case M_ROL:
6673       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
6674                    "d,v,t", AT, 0, treg);
6675       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
6676                    "d,t,s", AT, sreg, AT);
6677       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
6678                    "d,t,s", dreg, sreg, treg);
6679       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
6680                    "d,v,t", dreg, dreg, AT);
6681       break;
6682
6683     case M_ROL_I:
6684       if (imm_expr.X_op != O_constant)
6685         as_bad (_("rotate count too large"));
6686       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
6687                    AT, sreg, (int) (imm_expr.X_add_number & 0x1f));
6688       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
6689                    dreg, sreg, (int) ((0 - imm_expr.X_add_number) & 0x1f));
6690       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
6691                    dreg, dreg, AT);
6692       break;
6693
6694     case M_ROR:
6695       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
6696                    "d,v,t", AT, 0, treg);
6697       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
6698                    "d,t,s", AT, sreg, AT);
6699       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
6700                    "d,t,s", dreg, sreg, treg);
6701       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
6702                    "d,v,t", dreg, dreg, AT);
6703       break;
6704
6705     case M_ROR_I:
6706       if (imm_expr.X_op != O_constant)
6707         as_bad (_("rotate count too large"));
6708       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
6709                    AT, sreg, (int) (imm_expr.X_add_number & 0x1f));
6710       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
6711                    dreg, sreg, (int) ((0 - imm_expr.X_add_number) & 0x1f));
6712       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
6713                    dreg, dreg, AT);
6714       break;
6715
6716     case M_S_DOB:
6717       if (mips_arch == CPU_R4650)
6718         {
6719           as_bad (_("opcode not supported on this processor"));
6720           return;
6721         }
6722       assert (mips_opts.isa == ISA_MIPS1);
6723       /* Even on a big endian machine $fn comes before $fn+1.  We have
6724          to adjust when storing to memory.  */
6725       macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
6726                    target_big_endian ? treg + 1 : treg,
6727                    (int) BFD_RELOC_LO16, breg);
6728       offset_expr.X_add_number += 4;
6729       macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
6730                    target_big_endian ? treg : treg + 1,
6731                    (int) BFD_RELOC_LO16, breg);
6732       return;
6733
6734     case M_SEQ:
6735       if (sreg == 0)
6736         macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6737                      treg, (int) BFD_RELOC_LO16);
6738       else if (treg == 0)
6739         macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6740                      sreg, (int) BFD_RELOC_LO16);
6741       else
6742         {
6743           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
6744                        "d,v,t", dreg, sreg, treg);
6745           macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6746                        dreg, (int) BFD_RELOC_LO16);
6747         }
6748       return;
6749
6750     case M_SEQ_I:
6751       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6752         {
6753           macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
6754                        sreg, (int) BFD_RELOC_LO16);
6755           return;
6756         }
6757       if (sreg == 0)
6758         {
6759           as_warn (_("Instruction %s: result is always false"),
6760                    ip->insn_mo->name);
6761           move_register (&icnt, dreg, 0);
6762           return;
6763         }
6764       if (imm_expr.X_op == O_constant
6765           && imm_expr.X_add_number >= 0
6766           && imm_expr.X_add_number < 0x10000)
6767         {
6768           macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
6769                        sreg, (int) BFD_RELOC_LO16);
6770           used_at = 0;
6771         }
6772       else if (imm_expr.X_op == O_constant
6773                && imm_expr.X_add_number > -0x8000
6774                && imm_expr.X_add_number < 0)
6775         {
6776           imm_expr.X_add_number = -imm_expr.X_add_number;
6777           macro_build ((char *) NULL, &icnt, &imm_expr,
6778                        HAVE_32BIT_GPRS ? "addiu" : "daddiu",
6779                        "t,r,j", dreg, sreg,
6780                        (int) BFD_RELOC_LO16);
6781           used_at = 0;
6782         }
6783       else
6784         {
6785           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
6786           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
6787                        "d,v,t", dreg, sreg, AT);
6788           used_at = 1;
6789         }
6790       macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
6791                    (int) BFD_RELOC_LO16);
6792       if (used_at)
6793         break;
6794       return;
6795
6796     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
6797       s = "slt";
6798       goto sge;
6799     case M_SGEU:
6800       s = "sltu";
6801     sge:
6802       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
6803                    dreg, sreg, treg);
6804       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6805                    (int) BFD_RELOC_LO16);
6806       return;
6807
6808     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
6809     case M_SGEU_I:
6810       if (imm_expr.X_op == O_constant
6811           && imm_expr.X_add_number >= -0x8000
6812           && imm_expr.X_add_number < 0x8000)
6813         {
6814           macro_build ((char *) NULL, &icnt, &imm_expr,
6815                        mask == M_SGE_I ? "slti" : "sltiu",
6816                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6817           used_at = 0;
6818         }
6819       else
6820         {
6821           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
6822           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6823                        mask == M_SGE_I ? "slt" : "sltu", "d,v,t", dreg, sreg,
6824                        AT);
6825           used_at = 1;
6826         }
6827       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6828                    (int) BFD_RELOC_LO16);
6829       if (used_at)
6830         break;
6831       return;
6832
6833     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
6834       s = "slt";
6835       goto sgt;
6836     case M_SGTU:
6837       s = "sltu";
6838     sgt:
6839       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
6840                    dreg, treg, sreg);
6841       return;
6842
6843     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
6844       s = "slt";
6845       goto sgti;
6846     case M_SGTU_I:
6847       s = "sltu";
6848     sgti:
6849       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
6850       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
6851                    dreg, AT, sreg);
6852       break;
6853
6854     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
6855       s = "slt";
6856       goto sle;
6857     case M_SLEU:
6858       s = "sltu";
6859     sle:
6860       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
6861                    dreg, treg, sreg);
6862       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6863                    (int) BFD_RELOC_LO16);
6864       return;
6865
6866     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
6867       s = "slt";
6868       goto slei;
6869     case M_SLEU_I:
6870       s = "sltu";
6871     slei:
6872       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
6873       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
6874                    dreg, AT, sreg);
6875       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
6876                    (int) BFD_RELOC_LO16);
6877       break;
6878
6879     case M_SLT_I:
6880       if (imm_expr.X_op == O_constant
6881           && imm_expr.X_add_number >= -0x8000
6882           && imm_expr.X_add_number < 0x8000)
6883         {
6884           macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
6885                        dreg, sreg, (int) BFD_RELOC_LO16);
6886           return;
6887         }
6888       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
6889       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
6890                    dreg, sreg, AT);
6891       break;
6892
6893     case M_SLTU_I:
6894       if (imm_expr.X_op == O_constant
6895           && imm_expr.X_add_number >= -0x8000
6896           && imm_expr.X_add_number < 0x8000)
6897         {
6898           macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
6899                        dreg, sreg, (int) BFD_RELOC_LO16);
6900           return;
6901         }
6902       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
6903       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
6904                    "d,v,t", dreg, sreg, AT);
6905       break;
6906
6907     case M_SNE:
6908       if (sreg == 0)
6909         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
6910                      "d,v,t", dreg, 0, treg);
6911       else if (treg == 0)
6912         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
6913                      "d,v,t", dreg, 0, sreg);
6914       else
6915         {
6916           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
6917                        "d,v,t", dreg, sreg, treg);
6918           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
6919                        "d,v,t", dreg, 0, dreg);
6920         }
6921       return;
6922
6923     case M_SNE_I:
6924       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
6925         {
6926           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
6927                        "d,v,t", dreg, 0, sreg);
6928           return;
6929         }
6930       if (sreg == 0)
6931         {
6932           as_warn (_("Instruction %s: result is always true"),
6933                    ip->insn_mo->name);
6934           macro_build ((char *) NULL, &icnt, &expr1,
6935                        HAVE_32BIT_GPRS ? "addiu" : "daddiu",
6936                        "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
6937           return;
6938         }
6939       if (imm_expr.X_op == O_constant
6940           && imm_expr.X_add_number >= 0
6941           && imm_expr.X_add_number < 0x10000)
6942         {
6943           macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
6944                        dreg, sreg, (int) BFD_RELOC_LO16);
6945           used_at = 0;
6946         }
6947       else if (imm_expr.X_op == O_constant
6948                && imm_expr.X_add_number > -0x8000
6949                && imm_expr.X_add_number < 0)
6950         {
6951           imm_expr.X_add_number = -imm_expr.X_add_number;
6952           macro_build ((char *) NULL, &icnt, &imm_expr,
6953                        HAVE_32BIT_GPRS ? "addiu" : "daddiu",
6954                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6955           used_at = 0;
6956         }
6957       else
6958         {
6959           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
6960           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
6961                        "d,v,t", dreg, sreg, AT);
6962           used_at = 1;
6963         }
6964       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
6965                    "d,v,t", dreg, 0, dreg);
6966       if (used_at)
6967         break;
6968       return;
6969
6970     case M_DSUB_I:
6971       dbl = 1;
6972     case M_SUB_I:
6973       if (imm_expr.X_op == O_constant
6974           && imm_expr.X_add_number > -0x8000
6975           && imm_expr.X_add_number <= 0x8000)
6976         {
6977           imm_expr.X_add_number = -imm_expr.X_add_number;
6978           macro_build ((char *) NULL, &icnt, &imm_expr,
6979                        dbl ? "daddi" : "addi",
6980                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6981           return;
6982         }
6983       load_register (&icnt, AT, &imm_expr, dbl);
6984       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6985                    dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
6986       break;
6987
6988     case M_DSUBU_I:
6989       dbl = 1;
6990     case M_SUBU_I:
6991       if (imm_expr.X_op == O_constant
6992           && imm_expr.X_add_number > -0x8000
6993           && imm_expr.X_add_number <= 0x8000)
6994         {
6995           imm_expr.X_add_number = -imm_expr.X_add_number;
6996           macro_build ((char *) NULL, &icnt, &imm_expr,
6997                        dbl ? "daddiu" : "addiu",
6998                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
6999           return;
7000         }
7001       load_register (&icnt, AT, &imm_expr, dbl);
7002       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7003                    dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7004       break;
7005
7006     case M_TEQ_I:
7007       s = "teq";
7008       goto trap;
7009     case M_TGE_I:
7010       s = "tge";
7011       goto trap;
7012     case M_TGEU_I:
7013       s = "tgeu";
7014       goto trap;
7015     case M_TLT_I:
7016       s = "tlt";
7017       goto trap;
7018     case M_TLTU_I:
7019       s = "tltu";
7020       goto trap;
7021     case M_TNE_I:
7022       s = "tne";
7023     trap:
7024       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7025       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "s,t", sreg,
7026                    AT);
7027       break;
7028
7029     case M_TRUNCWS:
7030     case M_TRUNCWD:
7031       assert (mips_opts.isa == ISA_MIPS1);
7032       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7033       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7034
7035       /*
7036        * Is the double cfc1 instruction a bug in the mips assembler;
7037        * or is there a reason for it?
7038        */
7039       mips_emit_delays (true);
7040       ++mips_opts.noreorder;
7041       mips_any_noreorder = 1;
7042       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7043                    treg, 31);
7044       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7045                    treg, 31);
7046       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7047       expr1.X_add_number = 3;
7048       macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
7049                    (int) BFD_RELOC_LO16);
7050       expr1.X_add_number = 2;
7051       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
7052                      (int) BFD_RELOC_LO16);
7053       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
7054                    AT, 31);
7055       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7056       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7057               mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
7058       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
7059                    treg, 31);
7060       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7061       --mips_opts.noreorder;
7062       break;
7063
7064     case M_ULH:
7065       s = "lb";
7066       goto ulh;
7067     case M_ULHU:
7068       s = "lbu";
7069     ulh:
7070       if (offset_expr.X_add_number >= 0x7fff)
7071         as_bad (_("operand overflow"));
7072       /* avoid load delay */
7073       if (! target_big_endian)
7074         offset_expr.X_add_number += 1;
7075       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7076                    (int) BFD_RELOC_LO16, breg);
7077       if (! target_big_endian)
7078         offset_expr.X_add_number -= 1;
7079       else
7080         offset_expr.X_add_number += 1;
7081       macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", AT,
7082                    (int) BFD_RELOC_LO16, breg);
7083       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7084                    treg, treg, 8);
7085       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7086                    treg, treg, AT);
7087       break;
7088
7089     case M_ULD:
7090       s = "ldl";
7091       s2 = "ldr";
7092       off = 7;
7093       goto ulw;
7094     case M_ULW:
7095       s = "lwl";
7096       s2 = "lwr";
7097       off = 3;
7098     ulw:
7099       if (offset_expr.X_add_number >= 0x8000 - off)
7100         as_bad (_("operand overflow"));
7101       if (! target_big_endian)
7102         offset_expr.X_add_number += off;
7103       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7104                    (int) BFD_RELOC_LO16, breg);
7105       if (! target_big_endian)
7106         offset_expr.X_add_number -= off;
7107       else
7108         offset_expr.X_add_number += off;
7109       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
7110                    (int) BFD_RELOC_LO16, breg);
7111       return;
7112
7113     case M_ULD_A:
7114       s = "ldl";
7115       s2 = "ldr";
7116       off = 7;
7117       goto ulwa;
7118     case M_ULW_A:
7119       s = "lwl";
7120       s2 = "lwr";
7121       off = 3;
7122     ulwa:
7123       used_at = 1;
7124       load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
7125       if (breg != 0)
7126         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7127                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7128                      "d,v,t", AT, AT, breg);
7129       if (! target_big_endian)
7130         expr1.X_add_number = off;
7131       else
7132         expr1.X_add_number = 0;
7133       macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
7134                    (int) BFD_RELOC_LO16, AT);
7135       if (! target_big_endian)
7136         expr1.X_add_number = 0;
7137       else
7138         expr1.X_add_number = off;
7139       macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
7140                    (int) BFD_RELOC_LO16, AT);
7141       break;
7142
7143     case M_ULH_A:
7144     case M_ULHU_A:
7145       used_at = 1;
7146       load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
7147       if (breg != 0)
7148         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7149                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7150                      "d,v,t", AT, AT, breg);
7151       if (target_big_endian)
7152         expr1.X_add_number = 0;
7153       macro_build ((char *) NULL, &icnt, &expr1,
7154                    mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
7155                    (int) BFD_RELOC_LO16, AT);
7156       if (target_big_endian)
7157         expr1.X_add_number = 1;
7158       else
7159         expr1.X_add_number = 0;
7160       macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
7161                    (int) BFD_RELOC_LO16, AT);
7162       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7163                    treg, treg, 8);
7164       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7165                    treg, treg, AT);
7166       break;
7167
7168     case M_USH:
7169       if (offset_expr.X_add_number >= 0x7fff)
7170         as_bad (_("operand overflow"));
7171       if (target_big_endian)
7172         offset_expr.X_add_number += 1;
7173       macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
7174                    (int) BFD_RELOC_LO16, breg);
7175       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
7176                    AT, treg, 8);
7177       if (target_big_endian)
7178         offset_expr.X_add_number -= 1;
7179       else
7180         offset_expr.X_add_number += 1;
7181       macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
7182                    (int) BFD_RELOC_LO16, breg);
7183       break;
7184
7185     case M_USD:
7186       s = "sdl";
7187       s2 = "sdr";
7188       off = 7;
7189       goto usw;
7190     case M_USW:
7191       s = "swl";
7192       s2 = "swr";
7193       off = 3;
7194     usw:
7195       if (offset_expr.X_add_number >= 0x8000 - off)
7196         as_bad (_("operand overflow"));
7197       if (! target_big_endian)
7198         offset_expr.X_add_number += off;
7199       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7200                    (int) BFD_RELOC_LO16, breg);
7201       if (! target_big_endian)
7202         offset_expr.X_add_number -= off;
7203       else
7204         offset_expr.X_add_number += off;
7205       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
7206                    (int) BFD_RELOC_LO16, breg);
7207       return;
7208
7209     case M_USD_A:
7210       s = "sdl";
7211       s2 = "sdr";
7212       off = 7;
7213       goto uswa;
7214     case M_USW_A:
7215       s = "swl";
7216       s2 = "swr";
7217       off = 3;
7218     uswa:
7219       used_at = 1;
7220       load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
7221       if (breg != 0)
7222         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7223                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7224                      "d,v,t", AT, AT, breg);
7225       if (! target_big_endian)
7226         expr1.X_add_number = off;
7227       else
7228         expr1.X_add_number = 0;
7229       macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
7230                    (int) BFD_RELOC_LO16, AT);
7231       if (! target_big_endian)
7232         expr1.X_add_number = 0;
7233       else
7234         expr1.X_add_number = off;
7235       macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
7236                    (int) BFD_RELOC_LO16, AT);
7237       break;
7238
7239     case M_USH_A:
7240       used_at = 1;
7241       load_address (&icnt, AT, &offset_expr, HAVE_64BIT_ADDRESSES, &used_at);
7242       if (breg != 0)
7243         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7244                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7245                      "d,v,t", AT, AT, breg);
7246       if (! target_big_endian)
7247         expr1.X_add_number = 0;
7248       macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
7249                    (int) BFD_RELOC_LO16, AT);
7250       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
7251                    treg, treg, 8);
7252       if (! target_big_endian)
7253         expr1.X_add_number = 1;
7254       else
7255         expr1.X_add_number = 0;
7256       macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
7257                    (int) BFD_RELOC_LO16, AT);
7258       if (! target_big_endian)
7259         expr1.X_add_number = 0;
7260       else
7261         expr1.X_add_number = 1;
7262       macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
7263                    (int) BFD_RELOC_LO16, AT);
7264       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7265                    treg, treg, 8);
7266       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7267                    treg, treg, AT);
7268       break;
7269
7270     default:
7271       /* FIXME: Check if this is one of the itbl macros, since they
7272          are added dynamically.  */
7273       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7274       break;
7275     }
7276   if (mips_opts.noat)
7277     as_warn (_("Macro used $at after \".set noat\""));
7278 }
7279
7280 /* Implement macros in mips16 mode.  */
7281
7282 static void
7283 mips16_macro (ip)
7284      struct mips_cl_insn *ip;
7285 {
7286   int mask;
7287   int xreg, yreg, zreg, tmp;
7288   int icnt;
7289   expressionS expr1;
7290   int dbl;
7291   const char *s, *s2, *s3;
7292
7293   mask = ip->insn_mo->mask;
7294
7295   xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
7296   yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
7297   zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
7298
7299   icnt = 0;
7300
7301   expr1.X_op = O_constant;
7302   expr1.X_op_symbol = NULL;
7303   expr1.X_add_symbol = NULL;
7304   expr1.X_add_number = 1;
7305
7306   dbl = 0;
7307
7308   switch (mask)
7309     {
7310     default:
7311       internalError ();
7312
7313     case M_DDIV_3:
7314       dbl = 1;
7315     case M_DIV_3:
7316       s = "mflo";
7317       goto do_div3;
7318     case M_DREM_3:
7319       dbl = 1;
7320     case M_REM_3:
7321       s = "mfhi";
7322     do_div3:
7323       mips_emit_delays (true);
7324       ++mips_opts.noreorder;
7325       mips_any_noreorder = 1;
7326       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7327                    dbl ? "ddiv" : "div",
7328                    "0,x,y", xreg, yreg);
7329       expr1.X_add_number = 2;
7330       macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
7331       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break", "6",
7332                    7);
7333
7334       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7335          since that causes an overflow.  We should do that as well,
7336          but I don't see how to do the comparisons without a temporary
7337          register.  */
7338       --mips_opts.noreorder;
7339       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x", zreg);
7340       break;
7341
7342     case M_DIVU_3:
7343       s = "divu";
7344       s2 = "mflo";
7345       goto do_divu3;
7346     case M_REMU_3:
7347       s = "divu";
7348       s2 = "mfhi";
7349       goto do_divu3;
7350     case M_DDIVU_3:
7351       s = "ddivu";
7352       s2 = "mflo";
7353       goto do_divu3;
7354     case M_DREMU_3:
7355       s = "ddivu";
7356       s2 = "mfhi";
7357     do_divu3:
7358       mips_emit_delays (true);
7359       ++mips_opts.noreorder;
7360       mips_any_noreorder = 1;
7361       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "0,x,y",
7362                    xreg, yreg);
7363       expr1.X_add_number = 2;
7364       macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
7365         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
7366                      "6", 7);
7367       --mips_opts.noreorder;
7368       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "x", zreg);
7369       break;
7370
7371     case M_DMUL:
7372       dbl = 1;
7373     case M_MUL:
7374       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7375                    dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7376       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "x",
7377                    zreg);
7378       return;
7379
7380     case M_DSUBU_I:
7381       dbl = 1;
7382       goto do_subu;
7383     case M_SUBU_I:
7384     do_subu:
7385       if (imm_expr.X_op != O_constant)
7386         as_bad (_("Unsupported large constant"));
7387       imm_expr.X_add_number = -imm_expr.X_add_number;
7388       macro_build ((char *) NULL, &icnt, &imm_expr,
7389                    dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7390       break;
7391
7392     case M_SUBU_I_2:
7393       if (imm_expr.X_op != O_constant)
7394         as_bad (_("Unsupported large constant"));
7395       imm_expr.X_add_number = -imm_expr.X_add_number;
7396       macro_build ((char *) NULL, &icnt, &imm_expr, "addiu",
7397                    "x,k", xreg);
7398       break;
7399
7400     case M_DSUBU_I_2:
7401       if (imm_expr.X_op != O_constant)
7402         as_bad (_("Unsupported large constant"));
7403       imm_expr.X_add_number = -imm_expr.X_add_number;
7404       macro_build ((char *) NULL, &icnt, &imm_expr, "daddiu",
7405                    "y,j", yreg);
7406       break;
7407
7408     case M_BEQ:
7409       s = "cmp";
7410       s2 = "bteqz";
7411       goto do_branch;
7412     case M_BNE:
7413       s = "cmp";
7414       s2 = "btnez";
7415       goto do_branch;
7416     case M_BLT:
7417       s = "slt";
7418       s2 = "btnez";
7419       goto do_branch;
7420     case M_BLTU:
7421       s = "sltu";
7422       s2 = "btnez";
7423       goto do_branch;
7424     case M_BLE:
7425       s = "slt";
7426       s2 = "bteqz";
7427       goto do_reverse_branch;
7428     case M_BLEU:
7429       s = "sltu";
7430       s2 = "bteqz";
7431       goto do_reverse_branch;
7432     case M_BGE:
7433       s = "slt";
7434       s2 = "bteqz";
7435       goto do_branch;
7436     case M_BGEU:
7437       s = "sltu";
7438       s2 = "bteqz";
7439       goto do_branch;
7440     case M_BGT:
7441       s = "slt";
7442       s2 = "btnez";
7443       goto do_reverse_branch;
7444     case M_BGTU:
7445       s = "sltu";
7446       s2 = "btnez";
7447
7448     do_reverse_branch:
7449       tmp = xreg;
7450       xreg = yreg;
7451       yreg = tmp;
7452
7453     do_branch:
7454       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x,y",
7455                    xreg, yreg);
7456       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
7457       break;
7458
7459     case M_BEQ_I:
7460       s = "cmpi";
7461       s2 = "bteqz";
7462       s3 = "x,U";
7463       goto do_branch_i;
7464     case M_BNE_I:
7465       s = "cmpi";
7466       s2 = "btnez";
7467       s3 = "x,U";
7468       goto do_branch_i;
7469     case M_BLT_I:
7470       s = "slti";
7471       s2 = "btnez";
7472       s3 = "x,8";
7473       goto do_branch_i;
7474     case M_BLTU_I:
7475       s = "sltiu";
7476       s2 = "btnez";
7477       s3 = "x,8";
7478       goto do_branch_i;
7479     case M_BLE_I:
7480       s = "slti";
7481       s2 = "btnez";
7482       s3 = "x,8";
7483       goto do_addone_branch_i;
7484     case M_BLEU_I:
7485       s = "sltiu";
7486       s2 = "btnez";
7487       s3 = "x,8";
7488       goto do_addone_branch_i;
7489     case M_BGE_I:
7490       s = "slti";
7491       s2 = "bteqz";
7492       s3 = "x,8";
7493       goto do_branch_i;
7494     case M_BGEU_I:
7495       s = "sltiu";
7496       s2 = "bteqz";
7497       s3 = "x,8";
7498       goto do_branch_i;
7499     case M_BGT_I:
7500       s = "slti";
7501       s2 = "bteqz";
7502       s3 = "x,8";
7503       goto do_addone_branch_i;
7504     case M_BGTU_I:
7505       s = "sltiu";
7506       s2 = "bteqz";
7507       s3 = "x,8";
7508
7509     do_addone_branch_i:
7510       if (imm_expr.X_op != O_constant)
7511         as_bad (_("Unsupported large constant"));
7512       ++imm_expr.X_add_number;
7513
7514     do_branch_i:
7515       macro_build ((char *) NULL, &icnt, &imm_expr, s, s3, xreg);
7516       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
7517       break;
7518
7519     case M_ABS:
7520       expr1.X_add_number = 0;
7521       macro_build ((char *) NULL, &icnt, &expr1, "slti", "x,8",  yreg);
7522       if (xreg != yreg)
7523         move_register (&icnt, xreg, yreg);
7524       expr1.X_add_number = 2;
7525       macro_build ((char *) NULL, &icnt, &expr1, "bteqz", "p");
7526       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7527                    "neg", "x,w", xreg, xreg);
7528     }
7529 }
7530
7531 /* For consistency checking, verify that all bits are specified either
7532    by the match/mask part of the instruction definition, or by the
7533    operand list.  */
7534 static int
7535 validate_mips_insn (opc)
7536      const struct mips_opcode *opc;
7537 {
7538   const char *p = opc->args;
7539   char c;
7540   unsigned long used_bits = opc->mask;
7541
7542   if ((used_bits & opc->match) != opc->match)
7543     {
7544       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
7545               opc->name, opc->args);
7546       return 0;
7547     }
7548 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
7549   while (*p)
7550     switch (c = *p++)
7551       {
7552       case ',': break;
7553       case '(': break;
7554       case ')': break;
7555       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7556       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7557       case 'A': break;
7558       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
7559       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
7560       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
7561       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7562       case 'F': break;
7563       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7564       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
7565       case 'I': break;
7566       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
7567       case 'L': break;
7568       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
7569       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
7570       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
7571       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7572       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7573       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7574       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7575       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
7576       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7577       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
7578       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7579       case 'f': break;
7580       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
7581       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
7582       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7583       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
7584       case 'l': break;
7585       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7586       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7587       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
7588       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7589       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7590       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7591       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
7592       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7593       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7594       case 'x': break;
7595       case 'z': break;
7596       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
7597       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
7598                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7599       default:
7600         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
7601                 c, opc->name, opc->args);
7602         return 0;
7603       }
7604 #undef USE_BITS
7605   if (used_bits != 0xffffffff)
7606     {
7607       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
7608               ~used_bits & 0xffffffff, opc->name, opc->args);
7609       return 0;
7610     }
7611   return 1;
7612 }
7613
7614 /* This routine assembles an instruction into its binary format.  As a
7615    side effect, it sets one of the global variables imm_reloc or
7616    offset_reloc to the type of relocation to do if one of the operands
7617    is an address expression.  */
7618
7619 static void
7620 mips_ip (str, ip)
7621      char *str;
7622      struct mips_cl_insn *ip;
7623 {
7624   char *s;
7625   const char *args;
7626   char c = 0;
7627   struct mips_opcode *insn;
7628   char *argsStart;
7629   unsigned int regno;
7630   unsigned int lastregno = 0;
7631   char *s_reset;
7632   char save_c = 0;
7633
7634   insn_error = NULL;
7635
7636   /* If the instruction contains a '.', we first try to match an instruction
7637      including the '.'.  Then we try again without the '.'.  */
7638   insn = NULL;
7639   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
7640     continue;
7641
7642   /* If we stopped on whitespace, then replace the whitespace with null for
7643      the call to hash_find.  Save the character we replaced just in case we
7644      have to re-parse the instruction.  */
7645   if (ISSPACE (*s))
7646     {
7647       save_c = *s;
7648       *s++ = '\0';
7649     }
7650
7651   insn = (struct mips_opcode *) hash_find (op_hash, str);
7652
7653   /* If we didn't find the instruction in the opcode table, try again, but
7654      this time with just the instruction up to, but not including the
7655      first '.'.  */
7656   if (insn == NULL)
7657     {
7658       /* Restore the character we overwrite above (if any).  */
7659       if (save_c)
7660         *(--s) = save_c;
7661
7662       /* Scan up to the first '.' or whitespace.  */
7663       for (s = str;
7664            *s != '\0' && *s != '.' && !ISSPACE (*s);
7665            ++s)
7666         continue;
7667
7668       /* If we did not find a '.', then we can quit now.  */
7669       if (*s != '.')
7670         {
7671           insn_error = "unrecognized opcode";
7672           return;
7673         }
7674
7675       /* Lookup the instruction in the hash table.  */
7676       *s++ = '\0';
7677       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
7678         {
7679           insn_error = "unrecognized opcode";
7680           return;
7681         }
7682     }
7683
7684   argsStart = s;
7685   for (;;)
7686     {
7687       boolean ok;
7688
7689       assert (strcmp (insn->name, str) == 0);
7690
7691       if (OPCODE_IS_MEMBER (insn,
7692                             (mips_opts.isa
7693                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
7694                             mips_arch))
7695         ok = true;
7696       else
7697         ok = false;
7698
7699       if (insn->pinfo != INSN_MACRO)
7700         {
7701           if (mips_arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
7702             ok = false;
7703         }
7704
7705       if (! ok)
7706         {
7707           if (insn + 1 < &mips_opcodes[NUMOPCODES]
7708               && strcmp (insn->name, insn[1].name) == 0)
7709             {
7710               ++insn;
7711               continue;
7712             }
7713           else
7714             {
7715               if (!insn_error)
7716                 {
7717                   static char buf[100];
7718                   sprintf (buf,
7719                            _("opcode not supported on this processor: %s (%s)"),
7720                            mips_cpu_to_str (mips_arch),
7721                            mips_isa_to_str (mips_opts.isa));
7722
7723                   insn_error = buf;
7724                 }
7725               if (save_c)
7726                 *(--s) = save_c;
7727               return;
7728             }
7729         }
7730
7731       ip->insn_mo = insn;
7732       ip->insn_opcode = insn->match;
7733       insn_error = NULL;
7734       for (args = insn->args;; ++args)
7735         {
7736           s += strspn (s, " \t");
7737           switch (*args)
7738             {
7739             case '\0':          /* end of args */
7740               if (*s == '\0')
7741                 return;
7742               break;
7743
7744             case ',':
7745               if (*s++ == *args)
7746                 continue;
7747               s--;
7748               switch (*++args)
7749                 {
7750                 case 'r':
7751                 case 'v':
7752                   ip->insn_opcode |= lastregno << OP_SH_RS;
7753                   continue;
7754
7755                 case 'w':
7756                   ip->insn_opcode |= lastregno << OP_SH_RT;
7757                   continue;
7758
7759                 case 'W':
7760                   ip->insn_opcode |= lastregno << OP_SH_FT;
7761                   continue;
7762
7763                 case 'V':
7764                   ip->insn_opcode |= lastregno << OP_SH_FS;
7765                   continue;
7766                 }
7767               break;
7768
7769             case '(':
7770               /* Handle optional base register.
7771                  Either the base register is omitted or
7772                  we must have a left paren.  */
7773               /* This is dependent on the next operand specifier
7774                  is a base register specification.  */
7775               assert (args[1] == 'b' || args[1] == '5'
7776                       || args[1] == '-' || args[1] == '4');
7777               if (*s == '\0')
7778                 return;
7779
7780             case ')':           /* these must match exactly */
7781               if (*s++ == *args)
7782                 continue;
7783               break;
7784
7785             case '<':           /* must be at least one digit */
7786               /*
7787                * According to the manual, if the shift amount is greater
7788                * than 31 or less than 0, then the shift amount should be
7789                * mod 32.  In reality the mips assembler issues an error.
7790                * We issue a warning and mask out all but the low 5 bits.
7791                */
7792               my_getExpression (&imm_expr, s);
7793               check_absolute_expr (ip, &imm_expr);
7794               if ((unsigned long) imm_expr.X_add_number > 31)
7795                 {
7796                   as_warn (_("Improper shift amount (%ld)"),
7797                            (long) imm_expr.X_add_number);
7798                   imm_expr.X_add_number &= OP_MASK_SHAMT;
7799                 }
7800               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
7801               imm_expr.X_op = O_absent;
7802               s = expr_end;
7803               continue;
7804
7805             case '>':           /* shift amount minus 32 */
7806               my_getExpression (&imm_expr, s);
7807               check_absolute_expr (ip, &imm_expr);
7808               if ((unsigned long) imm_expr.X_add_number < 32
7809                   || (unsigned long) imm_expr.X_add_number > 63)
7810                 break;
7811               ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
7812               imm_expr.X_op = O_absent;
7813               s = expr_end;
7814               continue;
7815
7816             case 'k':           /* cache code */
7817             case 'h':           /* prefx code */
7818               my_getExpression (&imm_expr, s);
7819               check_absolute_expr (ip, &imm_expr);
7820               if ((unsigned long) imm_expr.X_add_number > 31)
7821                 {
7822                   as_warn (_("Invalid value for `%s' (%lu)"),
7823                            ip->insn_mo->name,
7824                            (unsigned long) imm_expr.X_add_number);
7825                   imm_expr.X_add_number &= 0x1f;
7826                 }
7827               if (*args == 'k')
7828                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
7829               else
7830                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
7831               imm_expr.X_op = O_absent;
7832               s = expr_end;
7833               continue;
7834
7835             case 'c':           /* break code */
7836               my_getExpression (&imm_expr, s);
7837               check_absolute_expr (ip, &imm_expr);
7838               if ((unsigned) imm_expr.X_add_number > 1023)
7839                 {
7840                   as_warn (_("Illegal break code (%ld)"),
7841                            (long) imm_expr.X_add_number);
7842                   imm_expr.X_add_number &= OP_MASK_CODE;
7843                 }
7844               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
7845               imm_expr.X_op = O_absent;
7846               s = expr_end;
7847               continue;
7848
7849             case 'q':           /* lower break code */
7850               my_getExpression (&imm_expr, s);
7851               check_absolute_expr (ip, &imm_expr);
7852               if ((unsigned) imm_expr.X_add_number > 1023)
7853                 {
7854                   as_warn (_("Illegal lower break code (%ld)"),
7855                            (long) imm_expr.X_add_number);
7856                   imm_expr.X_add_number &= OP_MASK_CODE2;
7857                 }
7858               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
7859               imm_expr.X_op = O_absent;
7860               s = expr_end;
7861               continue;
7862
7863             case 'B':           /* 20-bit syscall/break code.  */
7864               my_getExpression (&imm_expr, s);
7865               check_absolute_expr (ip, &imm_expr);
7866               if ((unsigned) imm_expr.X_add_number > OP_MASK_CODE20)
7867                 as_warn (_("Illegal 20-bit code (%ld)"),
7868                          (long) imm_expr.X_add_number);
7869               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
7870               imm_expr.X_op = O_absent;
7871               s = expr_end;
7872               continue;
7873
7874             case 'C':           /* Coprocessor code */
7875               my_getExpression (&imm_expr, s);
7876               check_absolute_expr (ip, &imm_expr);
7877               if ((unsigned long) imm_expr.X_add_number >= (1<<25))
7878                 {
7879                   as_warn (_("Coproccesor code > 25 bits (%ld)"),
7880                            (long) imm_expr.X_add_number);
7881                   imm_expr.X_add_number &= ((1<<25) - 1);
7882                 }
7883               ip->insn_opcode |= imm_expr.X_add_number;
7884               imm_expr.X_op = O_absent;
7885               s = expr_end;
7886               continue;
7887
7888             case 'J':           /* 19-bit wait code.  */
7889               my_getExpression (&imm_expr, s);
7890               check_absolute_expr (ip, &imm_expr);
7891               if ((unsigned) imm_expr.X_add_number > OP_MASK_CODE19)
7892                 as_warn (_("Illegal 19-bit code (%ld)"),
7893                          (long) imm_expr.X_add_number);
7894               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
7895               imm_expr.X_op = O_absent;
7896               s = expr_end;
7897               continue;
7898
7899             case 'P':           /* Performance register */
7900               my_getExpression (&imm_expr, s);
7901               check_absolute_expr (ip, &imm_expr);
7902               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
7903                 {
7904                   as_warn (_("Invalid performance register (%ld)"),
7905                            (long) imm_expr.X_add_number);
7906                   imm_expr.X_add_number &= OP_MASK_PERFREG;
7907                 }
7908               ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
7909               imm_expr.X_op = O_absent;
7910               s = expr_end;
7911               continue;
7912
7913             case 'b':           /* base register */
7914             case 'd':           /* destination register */
7915             case 's':           /* source register */
7916             case 't':           /* target register */
7917             case 'r':           /* both target and source */
7918             case 'v':           /* both dest and source */
7919             case 'w':           /* both dest and target */
7920             case 'E':           /* coprocessor target register */
7921             case 'G':           /* coprocessor destination register */
7922             case 'x':           /* ignore register name */
7923             case 'z':           /* must be zero register */
7924             case 'U':           /* destination register (clo/clz).  */
7925               s_reset = s;
7926               if (s[0] == '$')
7927                 {
7928
7929                   if (ISDIGIT (s[1]))
7930                     {
7931                       ++s;
7932                       regno = 0;
7933                       do
7934                         {
7935                           regno *= 10;
7936                           regno += *s - '0';
7937                           ++s;
7938                         }
7939                       while (ISDIGIT (*s));
7940                       if (regno > 31)
7941                         as_bad (_("Invalid register number (%d)"), regno);
7942                     }
7943                   else if (*args == 'E' || *args == 'G')
7944                     goto notreg;
7945                   else
7946                     {
7947                       if (s[1] == 'f' && s[2] == 'p')
7948                         {
7949                           s += 3;
7950                           regno = FP;
7951                         }
7952                       else if (s[1] == 's' && s[2] == 'p')
7953                         {
7954                           s += 3;
7955                           regno = SP;
7956                         }
7957                       else if (s[1] == 'g' && s[2] == 'p')
7958                         {
7959                           s += 3;
7960                           regno = GP;
7961                         }
7962                       else if (s[1] == 'a' && s[2] == 't')
7963                         {
7964                           s += 3;
7965                           regno = AT;
7966                         }
7967                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
7968                         {
7969                           s += 4;
7970                           regno = KT0;
7971                         }
7972                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
7973                         {
7974                           s += 4;
7975                           regno = KT1;
7976                         }
7977                       else if (itbl_have_entries)
7978                         {
7979                           char *p, *n;
7980                           unsigned long r;
7981
7982                           p = s + 1;    /* advance past '$' */
7983                           n = itbl_get_field (&p);  /* n is name */
7984
7985                           /* See if this is a register defined in an
7986                              itbl entry.  */
7987                           if (itbl_get_reg_val (n, &r))
7988                             {
7989                               /* Get_field advances to the start of
7990                                  the next field, so we need to back
7991                                  rack to the end of the last field.  */
7992                               if (p)
7993                                 s = p - 1;
7994                               else
7995                                 s = strchr (s, '\0');
7996                               regno = r;
7997                             }
7998                           else
7999                             goto notreg;
8000                         }
8001                       else
8002                         goto notreg;
8003                     }
8004                   if (regno == AT
8005                       && ! mips_opts.noat
8006                       && *args != 'E'
8007                       && *args != 'G')
8008                     as_warn (_("Used $at without \".set noat\""));
8009                   c = *args;
8010                   if (*s == ' ')
8011                     s++;
8012                   if (args[1] != *s)
8013                     {
8014                       if (c == 'r' || c == 'v' || c == 'w')
8015                         {
8016                           regno = lastregno;
8017                           s = s_reset;
8018                           args++;
8019                         }
8020                     }
8021                   /* 'z' only matches $0.  */
8022                   if (c == 'z' && regno != 0)
8023                     break;
8024
8025         /* Now that we have assembled one operand, we use the args string
8026          * to figure out where it goes in the instruction.  */
8027                   switch (c)
8028                     {
8029                     case 'r':
8030                     case 's':
8031                     case 'v':
8032                     case 'b':
8033                       ip->insn_opcode |= regno << OP_SH_RS;
8034                       break;
8035                     case 'd':
8036                     case 'G':
8037                       ip->insn_opcode |= regno << OP_SH_RD;
8038                       break;
8039                     case 'U':
8040                       ip->insn_opcode |= regno << OP_SH_RD;
8041                       ip->insn_opcode |= regno << OP_SH_RT;
8042                       break;
8043                     case 'w':
8044                     case 't':
8045                     case 'E':
8046                       ip->insn_opcode |= regno << OP_SH_RT;
8047                       break;
8048                     case 'x':
8049                       /* This case exists because on the r3000 trunc
8050                          expands into a macro which requires a gp
8051                          register.  On the r6000 or r4000 it is
8052                          assembled into a single instruction which
8053                          ignores the register.  Thus the insn version
8054                          is MIPS_ISA2 and uses 'x', and the macro
8055                          version is MIPS_ISA1 and uses 't'.  */
8056                       break;
8057                     case 'z':
8058                       /* This case is for the div instruction, which
8059                          acts differently if the destination argument
8060                          is $0.  This only matches $0, and is checked
8061                          outside the switch.  */
8062                       break;
8063                     case 'D':
8064                       /* Itbl operand; not yet implemented. FIXME ?? */
8065                       break;
8066                       /* What about all other operands like 'i', which
8067                          can be specified in the opcode table? */
8068                     }
8069                   lastregno = regno;
8070                   continue;
8071                 }
8072             notreg:
8073               switch (*args++)
8074                 {
8075                 case 'r':
8076                 case 'v':
8077                   ip->insn_opcode |= lastregno << OP_SH_RS;
8078                   continue;
8079                 case 'w':
8080                   ip->insn_opcode |= lastregno << OP_SH_RT;
8081                   continue;
8082                 }
8083               break;
8084
8085             case 'D':           /* floating point destination register */
8086             case 'S':           /* floating point source register */
8087             case 'T':           /* floating point target register */
8088             case 'R':           /* floating point source register */
8089             case 'V':
8090             case 'W':
8091               s_reset = s;
8092               if (s[0] == '$' && s[1] == 'f'
8093                   && ISDIGIT (s[2]))
8094                 {
8095                   s += 2;
8096                   regno = 0;
8097                   do
8098                     {
8099                       regno *= 10;
8100                       regno += *s - '0';
8101                       ++s;
8102                     }
8103                   while (ISDIGIT (*s));
8104
8105                   if (regno > 31)
8106                     as_bad (_("Invalid float register number (%d)"), regno);
8107
8108                   if ((regno & 1) != 0
8109                       && HAVE_32BIT_FPRS
8110                       && ! (strcmp (str, "mtc1") == 0
8111                             || strcmp (str, "mfc1") == 0
8112                             || strcmp (str, "lwc1") == 0
8113                             || strcmp (str, "swc1") == 0
8114                             || strcmp (str, "l.s") == 0
8115                             || strcmp (str, "s.s") == 0))
8116                     as_warn (_("Float register should be even, was %d"),
8117                              regno);
8118
8119                   c = *args;
8120                   if (*s == ' ')
8121                     s++;
8122                   if (args[1] != *s)
8123                     {
8124                       if (c == 'V' || c == 'W')
8125                         {
8126                           regno = lastregno;
8127                           s = s_reset;
8128                           args++;
8129                         }
8130                     }
8131                   switch (c)
8132                     {
8133                     case 'D':
8134                       ip->insn_opcode |= regno << OP_SH_FD;
8135                       break;
8136                     case 'V':
8137                     case 'S':
8138                       ip->insn_opcode |= regno << OP_SH_FS;
8139                       break;
8140                     case 'W':
8141                     case 'T':
8142                       ip->insn_opcode |= regno << OP_SH_FT;
8143                       break;
8144                     case 'R':
8145                       ip->insn_opcode |= regno << OP_SH_FR;
8146                       break;
8147                     }
8148                   lastregno = regno;
8149                   continue;
8150                 }
8151
8152               switch (*args++)
8153                 {
8154                 case 'V':
8155                   ip->insn_opcode |= lastregno << OP_SH_FS;
8156                   continue;
8157                 case 'W':
8158                   ip->insn_opcode |= lastregno << OP_SH_FT;
8159                   continue;
8160                 }
8161               break;
8162
8163             case 'I':
8164               my_getExpression (&imm_expr, s);
8165               if (imm_expr.X_op != O_big
8166                   && imm_expr.X_op != O_constant)
8167                 insn_error = _("absolute expression required");
8168               s = expr_end;
8169               continue;
8170
8171             case 'A':
8172               my_getExpression (&offset_expr, s);
8173               *imm_reloc = BFD_RELOC_32;
8174               s = expr_end;
8175               continue;
8176
8177             case 'F':
8178             case 'L':
8179             case 'f':
8180             case 'l':
8181               {
8182                 int f64;
8183                 int using_gprs;
8184                 char *save_in;
8185                 char *err;
8186                 unsigned char temp[8];
8187                 int len;
8188                 unsigned int length;
8189                 segT seg;
8190                 subsegT subseg;
8191                 char *p;
8192
8193                 /* These only appear as the last operand in an
8194                    instruction, and every instruction that accepts
8195                    them in any variant accepts them in all variants.
8196                    This means we don't have to worry about backing out
8197                    any changes if the instruction does not match.
8198
8199                    The difference between them is the size of the
8200                    floating point constant and where it goes.  For 'F'
8201                    and 'L' the constant is 64 bits; for 'f' and 'l' it
8202                    is 32 bits.  Where the constant is placed is based
8203                    on how the MIPS assembler does things:
8204                     F -- .rdata
8205                     L -- .lit8
8206                     f -- immediate value
8207                     l -- .lit4
8208
8209                     The .lit4 and .lit8 sections are only used if
8210                     permitted by the -G argument.
8211
8212                     When generating embedded PIC code, we use the
8213                     .lit8 section but not the .lit4 section (we can do
8214                     .lit4 inline easily; we need to put .lit8
8215                     somewhere in the data segment, and using .lit8
8216                     permits the linker to eventually combine identical
8217                     .lit8 entries).
8218
8219                     The code below needs to know whether the target register
8220                     is 32 or 64 bits wide.  It relies on the fact 'f' and
8221                     'F' are used with GPR-based instructions and 'l' and
8222                     'L' are used with FPR-based instructions.  */
8223
8224                 f64 = *args == 'F' || *args == 'L';
8225                 using_gprs = *args == 'F' || *args == 'f';
8226
8227                 save_in = input_line_pointer;
8228                 input_line_pointer = s;
8229                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
8230                 length = len;
8231                 s = input_line_pointer;
8232                 input_line_pointer = save_in;
8233                 if (err != NULL && *err != '\0')
8234                   {
8235                     as_bad (_("Bad floating point constant: %s"), err);
8236                     memset (temp, '\0', sizeof temp);
8237                     length = f64 ? 8 : 4;
8238                   }
8239
8240                 assert (length == (unsigned) (f64 ? 8 : 4));
8241
8242                 if (*args == 'f'
8243                     || (*args == 'l'
8244                         && (! USE_GLOBAL_POINTER_OPT
8245                             || mips_pic == EMBEDDED_PIC
8246                             || g_switch_value < 4
8247                             || (temp[0] == 0 && temp[1] == 0)
8248                             || (temp[2] == 0 && temp[3] == 0))))
8249                   {
8250                     imm_expr.X_op = O_constant;
8251                     if (! target_big_endian)
8252                       imm_expr.X_add_number = bfd_getl32 (temp);
8253                     else
8254                       imm_expr.X_add_number = bfd_getb32 (temp);
8255                   }
8256                 else if (length > 4
8257                          && ! mips_disable_float_construction
8258                          /* Constants can only be constructed in GPRs and
8259                             copied to FPRs if the GPRs are at least as wide
8260                             as the FPRs.  Force the constant into memory if
8261                             we are using 64-bit FPRs but the GPRs are only
8262                             32 bits wide.  */
8263                          && (using_gprs
8264                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
8265                          && ((temp[0] == 0 && temp[1] == 0)
8266                              || (temp[2] == 0 && temp[3] == 0))
8267                          && ((temp[4] == 0 && temp[5] == 0)
8268                              || (temp[6] == 0 && temp[7] == 0)))
8269                   {
8270                     /* The value is simple enough to load with a couple of
8271                        instructions.  If using 32-bit registers, set
8272                        imm_expr to the high order 32 bits and offset_expr to
8273                        the low order 32 bits.  Otherwise, set imm_expr to
8274                        the entire 64 bit constant.  */
8275                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
8276                       {
8277                         imm_expr.X_op = O_constant;
8278                         offset_expr.X_op = O_constant;
8279                         if (! target_big_endian)
8280                           {
8281                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
8282                             offset_expr.X_add_number = bfd_getl32 (temp);
8283                           }
8284                         else
8285                           {
8286                             imm_expr.X_add_number = bfd_getb32 (temp);
8287                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
8288                           }
8289                         if (offset_expr.X_add_number == 0)
8290                           offset_expr.X_op = O_absent;
8291                       }
8292                     else if (sizeof (imm_expr.X_add_number) > 4)
8293                       {
8294                         imm_expr.X_op = O_constant;
8295                         if (! target_big_endian)
8296                           imm_expr.X_add_number = bfd_getl64 (temp);
8297                         else
8298                           imm_expr.X_add_number = bfd_getb64 (temp);
8299                       }
8300                     else
8301                       {
8302                         imm_expr.X_op = O_big;
8303                         imm_expr.X_add_number = 4;
8304                         if (! target_big_endian)
8305                           {
8306                             generic_bignum[0] = bfd_getl16 (temp);
8307                             generic_bignum[1] = bfd_getl16 (temp + 2);
8308                             generic_bignum[2] = bfd_getl16 (temp + 4);
8309                             generic_bignum[3] = bfd_getl16 (temp + 6);
8310                           }
8311                         else
8312                           {
8313                             generic_bignum[0] = bfd_getb16 (temp + 6);
8314                             generic_bignum[1] = bfd_getb16 (temp + 4);
8315                             generic_bignum[2] = bfd_getb16 (temp + 2);
8316                             generic_bignum[3] = bfd_getb16 (temp);
8317                           }
8318                       }
8319                   }
8320                 else
8321                   {
8322                     const char *newname;
8323                     segT new_seg;
8324
8325                     /* Switch to the right section.  */
8326                     seg = now_seg;
8327                     subseg = now_subseg;
8328                     switch (*args)
8329                       {
8330                       default: /* unused default case avoids warnings.  */
8331                       case 'L':
8332                         newname = RDATA_SECTION_NAME;
8333                         if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
8334                             || mips_pic == EMBEDDED_PIC)
8335                           newname = ".lit8";
8336                         break;
8337                       case 'F':
8338                         if (mips_pic == EMBEDDED_PIC)
8339                           newname = ".lit8";
8340                         else
8341                           newname = RDATA_SECTION_NAME;
8342                         break;
8343                       case 'l':
8344                         assert (!USE_GLOBAL_POINTER_OPT
8345                                 || g_switch_value >= 4);
8346                         newname = ".lit4";
8347                         break;
8348                       }
8349                     new_seg = subseg_new (newname, (subsegT) 0);
8350                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
8351                       bfd_set_section_flags (stdoutput, new_seg,
8352                                              (SEC_ALLOC
8353                                               | SEC_LOAD
8354                                               | SEC_READONLY
8355                                               | SEC_DATA));
8356                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
8357                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour
8358                         && strcmp (TARGET_OS, "elf") != 0)
8359                       record_alignment (new_seg, 4);
8360                     else
8361                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
8362                     if (seg == now_seg)
8363                       as_bad (_("Can't use floating point insn in this section"));
8364
8365                     /* Set the argument to the current address in the
8366                        section.  */
8367                     offset_expr.X_op = O_symbol;
8368                     offset_expr.X_add_symbol =
8369                       symbol_new ("L0\001", now_seg,
8370                                   (valueT) frag_now_fix (), frag_now);
8371                     offset_expr.X_add_number = 0;
8372
8373                     /* Put the floating point number into the section.  */
8374                     p = frag_more ((int) length);
8375                     memcpy (p, temp, length);
8376
8377                     /* Switch back to the original section.  */
8378                     subseg_set (seg, subseg);
8379                   }
8380               }
8381               continue;
8382
8383             case 'i':           /* 16 bit unsigned immediate */
8384             case 'j':           /* 16 bit signed immediate */
8385               *imm_reloc = BFD_RELOC_LO16;
8386               c = my_getSmallExpression (&imm_expr, s);
8387               if (c != S_EX_NONE)
8388                 {
8389                   if (c != S_EX_LO)
8390                     {
8391                       if (imm_expr.X_op == O_constant)
8392                         imm_expr.X_add_number =
8393                           (imm_expr.X_add_number >> 16) & 0xffff;
8394 #ifdef OBJ_ELF
8395                       else if (c == S_EX_HIGHEST)
8396                           *imm_reloc = BFD_RELOC_MIPS_HIGHEST;
8397                       else if (c == S_EX_HIGHER)
8398                           *imm_reloc = BFD_RELOC_MIPS_HIGHER;
8399                       else if (c == S_EX_GP_REL)
8400                         {
8401                           /* This occurs in NewABI only.  */
8402                           c = my_getSmallExpression (&imm_expr, s);
8403                           if (c != S_EX_NEG)
8404                             as_bad (_("bad composition of relocations"));
8405                           else
8406                             {
8407                               c = my_getSmallExpression (&imm_expr, s);
8408                               if (c != S_EX_LO)
8409                                 as_bad (_("bad composition of relocations"));
8410                               else
8411                                 {
8412                                   imm_reloc[0] = BFD_RELOC_GPREL16;
8413                                   imm_reloc[1] = BFD_RELOC_MIPS_SUB;
8414                                   imm_reloc[2] = BFD_RELOC_LO16;
8415                                 }
8416                             }
8417                         }
8418 #endif
8419                       else if (c == S_EX_HI)
8420                         {
8421                           *imm_reloc = BFD_RELOC_HI16_S;
8422                           imm_unmatched_hi = true;
8423                         }
8424                       else
8425                         *imm_reloc = BFD_RELOC_HI16;
8426                     }
8427                   else if (imm_expr.X_op == O_constant)
8428                     imm_expr.X_add_number &= 0xffff;
8429                 }
8430               if (*args == 'i')
8431                 {
8432                   if ((c == S_EX_NONE && imm_expr.X_op != O_constant)
8433                       || ((imm_expr.X_add_number < 0
8434                            || imm_expr.X_add_number >= 0x10000)
8435                           && imm_expr.X_op == O_constant))
8436                     {
8437                       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
8438                           !strcmp (insn->name, insn[1].name))
8439                         break;
8440                       if (imm_expr.X_op == O_constant
8441                           || imm_expr.X_op == O_big)
8442                         as_bad (_("16 bit expression not in range 0..65535"));
8443                     }
8444                 }
8445               else
8446                 {
8447                   int more;
8448                   offsetT max;
8449
8450                   /* The upper bound should be 0x8000, but
8451                      unfortunately the MIPS assembler accepts numbers
8452                      from 0x8000 to 0xffff and sign extends them, and
8453                      we want to be compatible.  We only permit this
8454                      extended range for an instruction which does not
8455                      provide any further alternates, since those
8456                      alternates may handle other cases.  People should
8457                      use the numbers they mean, rather than relying on
8458                      a mysterious sign extension.  */
8459                   more = (insn + 1 < &mips_opcodes[NUMOPCODES] &&
8460                           strcmp (insn->name, insn[1].name) == 0);
8461                   if (more)
8462                     max = 0x8000;
8463                   else
8464                     max = 0x10000;
8465                   if ((c == S_EX_NONE && imm_expr.X_op != O_constant)
8466                       || ((imm_expr.X_add_number < -0x8000
8467                            || imm_expr.X_add_number >= max)
8468                           && imm_expr.X_op == O_constant)
8469                       || (more
8470                           && imm_expr.X_add_number < 0
8471                           && HAVE_64BIT_GPRS
8472                           && imm_expr.X_unsigned
8473                           && sizeof (imm_expr.X_add_number) <= 4))
8474                     {
8475                       if (more)
8476                         break;
8477                       if (imm_expr.X_op == O_constant
8478                           || imm_expr.X_op == O_big)
8479                         as_bad (_("16 bit expression not in range -32768..32767"));
8480                     }
8481                 }
8482               s = expr_end;
8483               continue;
8484
8485             case 'o':           /* 16 bit offset */
8486               c = my_getSmallExpression (&offset_expr, s);
8487
8488               /* If this value won't fit into a 16 bit offset, then go
8489                  find a macro that will generate the 32 bit offset
8490                  code pattern.  */
8491               if (c == S_EX_NONE
8492                   && (offset_expr.X_op != O_constant
8493                       || offset_expr.X_add_number >= 0x8000
8494                       || offset_expr.X_add_number < -0x8000))
8495                 break;
8496
8497               if (c == S_EX_HI)
8498                 {
8499                   if (offset_expr.X_op != O_constant)
8500                     break;
8501                   offset_expr.X_add_number =
8502                     (offset_expr.X_add_number >> 16) & 0xffff;
8503                 }
8504               *offset_reloc = BFD_RELOC_LO16;
8505               s = expr_end;
8506               continue;
8507
8508             case 'p':           /* pc relative offset */
8509               if (mips_pic == EMBEDDED_PIC)
8510                 *offset_reloc = BFD_RELOC_16_PCREL_S2;
8511               else
8512                 *offset_reloc = BFD_RELOC_16_PCREL;
8513               my_getExpression (&offset_expr, s);
8514               s = expr_end;
8515               continue;
8516
8517             case 'u':           /* upper 16 bits */
8518               c = my_getSmallExpression (&imm_expr, s);
8519               *imm_reloc = BFD_RELOC_LO16;
8520               if (c != S_EX_NONE)
8521                 {
8522                   if (c != S_EX_LO)
8523                     {
8524                       if (imm_expr.X_op == O_constant)
8525                         imm_expr.X_add_number =
8526                           (imm_expr.X_add_number >> 16) & 0xffff;
8527                       else if (c == S_EX_HI)
8528                         {
8529                           *imm_reloc = BFD_RELOC_HI16_S;
8530                           imm_unmatched_hi = true;
8531                         }
8532 #ifdef OBJ_ELF
8533                       else if (c == S_EX_HIGHEST)
8534                           *imm_reloc = BFD_RELOC_MIPS_HIGHEST;
8535                       else if (c == S_EX_GP_REL)
8536                         {
8537                           /* This occurs in NewABI only.  */
8538                           c = my_getSmallExpression (&imm_expr, s);
8539                           if (c != S_EX_NEG)
8540                             as_bad (_("bad composition of relocations"));
8541                           else
8542                             {
8543                               c = my_getSmallExpression (&imm_expr, s);
8544                               if (c != S_EX_HI)
8545                                 as_bad (_("bad composition of relocations"));
8546                               else
8547                                 {
8548                                   imm_reloc[0] = BFD_RELOC_GPREL16;
8549                                   imm_reloc[1] = BFD_RELOC_MIPS_SUB;
8550                                   imm_reloc[2] = BFD_RELOC_HI16_S;
8551                                 }
8552                             }
8553                         }
8554 #endif
8555                       else
8556                         *imm_reloc = BFD_RELOC_HI16;
8557                     }
8558                   else if (imm_expr.X_op == O_constant)
8559                     imm_expr.X_add_number &= 0xffff;
8560                 }
8561               if (imm_expr.X_op == O_constant
8562                   && (imm_expr.X_add_number < 0
8563                       || imm_expr.X_add_number >= 0x10000))
8564                 as_bad (_("lui expression not in range 0..65535"));
8565               s = expr_end;
8566               continue;
8567
8568             case 'a':           /* 26 bit address */
8569               my_getExpression (&offset_expr, s);
8570               s = expr_end;
8571               *offset_reloc = BFD_RELOC_MIPS_JMP;
8572               continue;
8573
8574             case 'N':           /* 3 bit branch condition code */
8575             case 'M':           /* 3 bit compare condition code */
8576               if (strncmp (s, "$fcc", 4) != 0)
8577                 break;
8578               s += 4;
8579               regno = 0;
8580               do
8581                 {
8582                   regno *= 10;
8583                   regno += *s - '0';
8584                   ++s;
8585                 }
8586               while (ISDIGIT (*s));
8587               if (regno > 7)
8588                 as_bad (_("invalid condition code register $fcc%d"), regno);
8589               if (*args == 'N')
8590                 ip->insn_opcode |= regno << OP_SH_BCC;
8591               else
8592                 ip->insn_opcode |= regno << OP_SH_CCC;
8593               continue;
8594
8595             case 'H':
8596               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
8597                 s += 2;
8598               if (ISDIGIT (*s))
8599                 {
8600                   c = 0;
8601                   do
8602                     {
8603                       c *= 10;
8604                       c += *s - '0';
8605                       ++s;
8606                     }
8607                   while (ISDIGIT (*s));
8608                 }
8609               else
8610                 c = 8; /* Invalid sel value.  */
8611
8612               if (c > 7)
8613                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
8614               ip->insn_opcode |= c;
8615               continue;
8616
8617             default:
8618               as_bad (_("bad char = '%c'\n"), *args);
8619               internalError ();
8620             }
8621           break;
8622         }
8623       /* Args don't match.  */
8624       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
8625           !strcmp (insn->name, insn[1].name))
8626         {
8627           ++insn;
8628           s = argsStart;
8629           insn_error = _("illegal operands");
8630           continue;
8631         }
8632       if (save_c)
8633         *(--s) = save_c;
8634       insn_error = _("illegal operands");
8635       return;
8636     }
8637 }
8638
8639 /* This routine assembles an instruction into its binary format when
8640    assembling for the mips16.  As a side effect, it sets one of the
8641    global variables imm_reloc or offset_reloc to the type of
8642    relocation to do if one of the operands is an address expression.
8643    It also sets mips16_small and mips16_ext if the user explicitly
8644    requested a small or extended instruction.  */
8645
8646 static void
8647 mips16_ip (str, ip)
8648      char *str;
8649      struct mips_cl_insn *ip;
8650 {
8651   char *s;
8652   const char *args;
8653   struct mips_opcode *insn;
8654   char *argsstart;
8655   unsigned int regno;
8656   unsigned int lastregno = 0;
8657   char *s_reset;
8658
8659   insn_error = NULL;
8660
8661   mips16_small = false;
8662   mips16_ext = false;
8663
8664   for (s = str; ISLOWER (*s); ++s)
8665     ;
8666   switch (*s)
8667     {
8668     case '\0':
8669       break;
8670
8671     case ' ':
8672       *s++ = '\0';
8673       break;
8674
8675     case '.':
8676       if (s[1] == 't' && s[2] == ' ')
8677         {
8678           *s = '\0';
8679           mips16_small = true;
8680           s += 3;
8681           break;
8682         }
8683       else if (s[1] == 'e' && s[2] == ' ')
8684         {
8685           *s = '\0';
8686           mips16_ext = true;
8687           s += 3;
8688           break;
8689         }
8690       /* Fall through.  */
8691     default:
8692       insn_error = _("unknown opcode");
8693       return;
8694     }
8695
8696   if (mips_opts.noautoextend && ! mips16_ext)
8697     mips16_small = true;
8698
8699   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
8700     {
8701       insn_error = _("unrecognized opcode");
8702       return;
8703     }
8704
8705   argsstart = s;
8706   for (;;)
8707     {
8708       assert (strcmp (insn->name, str) == 0);
8709
8710       ip->insn_mo = insn;
8711       ip->insn_opcode = insn->match;
8712       ip->use_extend = false;
8713       imm_expr.X_op = O_absent;
8714       imm_reloc[0] = BFD_RELOC_UNUSED;
8715       imm_reloc[1] = BFD_RELOC_UNUSED;
8716       imm_reloc[2] = BFD_RELOC_UNUSED;
8717       offset_expr.X_op = O_absent;
8718       offset_reloc[0] = BFD_RELOC_UNUSED;
8719       offset_reloc[1] = BFD_RELOC_UNUSED;
8720       offset_reloc[2] = BFD_RELOC_UNUSED;
8721       for (args = insn->args; 1; ++args)
8722         {
8723           int c;
8724
8725           if (*s == ' ')
8726             ++s;
8727
8728           /* In this switch statement we call break if we did not find
8729              a match, continue if we did find a match, or return if we
8730              are done.  */
8731
8732           c = *args;
8733           switch (c)
8734             {
8735             case '\0':
8736               if (*s == '\0')
8737                 {
8738                   /* Stuff the immediate value in now, if we can.  */
8739                   if (imm_expr.X_op == O_constant
8740                       && *imm_reloc > BFD_RELOC_UNUSED
8741                       && insn->pinfo != INSN_MACRO)
8742                     {
8743                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
8744                                     imm_expr.X_add_number, true, mips16_small,
8745                                     mips16_ext, &ip->insn_opcode,
8746                                     &ip->use_extend, &ip->extend);
8747                       imm_expr.X_op = O_absent;
8748                       *imm_reloc = BFD_RELOC_UNUSED;
8749                     }
8750
8751                   return;
8752                 }
8753               break;
8754
8755             case ',':
8756               if (*s++ == c)
8757                 continue;
8758               s--;
8759               switch (*++args)
8760                 {
8761                 case 'v':
8762                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
8763                   continue;
8764                 case 'w':
8765                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
8766                   continue;
8767                 }
8768               break;
8769
8770             case '(':
8771             case ')':
8772               if (*s++ == c)
8773                 continue;
8774               break;
8775
8776             case 'v':
8777             case 'w':
8778               if (s[0] != '$')
8779                 {
8780                   if (c == 'v')
8781                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
8782                   else
8783                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
8784                   ++args;
8785                   continue;
8786                 }
8787               /* Fall through.  */
8788             case 'x':
8789             case 'y':
8790             case 'z':
8791             case 'Z':
8792             case '0':
8793             case 'S':
8794             case 'R':
8795             case 'X':
8796             case 'Y':
8797               if (s[0] != '$')
8798                 break;
8799               s_reset = s;
8800               if (ISDIGIT (s[1]))
8801                 {
8802                   ++s;
8803                   regno = 0;
8804                   do
8805                     {
8806                       regno *= 10;
8807                       regno += *s - '0';
8808                       ++s;
8809                     }
8810                   while (ISDIGIT (*s));
8811                   if (regno > 31)
8812                     {
8813                       as_bad (_("invalid register number (%d)"), regno);
8814                       regno = 2;
8815                     }
8816                 }
8817               else
8818                 {
8819                   if (s[1] == 'f' && s[2] == 'p')
8820                     {
8821                       s += 3;
8822                       regno = FP;
8823                     }
8824                   else if (s[1] == 's' && s[2] == 'p')
8825                     {
8826                       s += 3;
8827                       regno = SP;
8828                     }
8829                   else if (s[1] == 'g' && s[2] == 'p')
8830                     {
8831                       s += 3;
8832                       regno = GP;
8833                     }
8834                   else if (s[1] == 'a' && s[2] == 't')
8835                     {
8836                       s += 3;
8837                       regno = AT;
8838                     }
8839                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8840                     {
8841                       s += 4;
8842                       regno = KT0;
8843                     }
8844                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8845                     {
8846                       s += 4;
8847                       regno = KT1;
8848                     }
8849                   else
8850                     break;
8851                 }
8852
8853               if (*s == ' ')
8854                 ++s;
8855               if (args[1] != *s)
8856                 {
8857                   if (c == 'v' || c == 'w')
8858                     {
8859                       regno = mips16_to_32_reg_map[lastregno];
8860                       s = s_reset;
8861                       args++;
8862                     }
8863                 }
8864
8865               switch (c)
8866                 {
8867                 case 'x':
8868                 case 'y':
8869                 case 'z':
8870                 case 'v':
8871                 case 'w':
8872                 case 'Z':
8873                   regno = mips32_to_16_reg_map[regno];
8874                   break;
8875
8876                 case '0':
8877                   if (regno != 0)
8878                     regno = ILLEGAL_REG;
8879                   break;
8880
8881                 case 'S':
8882                   if (regno != SP)
8883                     regno = ILLEGAL_REG;
8884                   break;
8885
8886                 case 'R':
8887                   if (regno != RA)
8888                     regno = ILLEGAL_REG;
8889                   break;
8890
8891                 case 'X':
8892                 case 'Y':
8893                   if (regno == AT && ! mips_opts.noat)
8894                     as_warn (_("used $at without \".set noat\""));
8895                   break;
8896
8897                 default:
8898                   internalError ();
8899                 }
8900
8901               if (regno == ILLEGAL_REG)
8902                 break;
8903
8904               switch (c)
8905                 {
8906                 case 'x':
8907                 case 'v':
8908                   ip->insn_opcode |= regno << MIPS16OP_SH_RX;
8909                   break;
8910                 case 'y':
8911                 case 'w':
8912                   ip->insn_opcode |= regno << MIPS16OP_SH_RY;
8913                   break;
8914                 case 'z':
8915                   ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
8916                   break;
8917                 case 'Z':
8918                   ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
8919                 case '0':
8920                 case 'S':
8921                 case 'R':
8922                   break;
8923                 case 'X':
8924                   ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
8925                   break;
8926                 case 'Y':
8927                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
8928                   ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
8929                   break;
8930                 default:
8931                   internalError ();
8932                 }
8933
8934               lastregno = regno;
8935               continue;
8936
8937             case 'P':
8938               if (strncmp (s, "$pc", 3) == 0)
8939                 {
8940                   s += 3;
8941                   continue;
8942                 }
8943               break;
8944
8945             case '<':
8946             case '>':
8947             case '[':
8948             case ']':
8949             case '4':
8950             case '5':
8951             case 'H':
8952             case 'W':
8953             case 'D':
8954             case 'j':
8955             case '8':
8956             case 'V':
8957             case 'C':
8958             case 'U':
8959             case 'k':
8960             case 'K':
8961               if (s[0] == '%'
8962                   && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
8963                 {
8964                   /* This is %gprel(SYMBOL).  We need to read SYMBOL,
8965                      and generate the appropriate reloc.  If the text
8966                      inside %gprel is not a symbol name with an
8967                      optional offset, then we generate a normal reloc
8968                      and will probably fail later.  */
8969                   my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
8970                   if (imm_expr.X_op == O_symbol)
8971                     {
8972                       mips16_ext = true;
8973                       *imm_reloc = BFD_RELOC_MIPS16_GPREL;
8974                       s = expr_end;
8975                       ip->use_extend = true;
8976                       ip->extend = 0;
8977                       continue;
8978                     }
8979                 }
8980               else
8981                 {
8982                   /* Just pick up a normal expression.  */
8983                   my_getExpression (&imm_expr, s);
8984                 }
8985
8986               if (imm_expr.X_op == O_register)
8987                 {
8988                   /* What we thought was an expression turned out to
8989                      be a register.  */
8990
8991                   if (s[0] == '(' && args[1] == '(')
8992                     {
8993                       /* It looks like the expression was omitted
8994                          before a register indirection, which means
8995                          that the expression is implicitly zero.  We
8996                          still set up imm_expr, so that we handle
8997                          explicit extensions correctly.  */
8998                       imm_expr.X_op = O_constant;
8999                       imm_expr.X_add_number = 0;
9000                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9001                       continue;
9002                     }
9003
9004                   break;
9005                 }
9006
9007               /* We need to relax this instruction.  */
9008               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9009               s = expr_end;
9010               continue;
9011
9012             case 'p':
9013             case 'q':
9014             case 'A':
9015             case 'B':
9016             case 'E':
9017               /* We use offset_reloc rather than imm_reloc for the PC
9018                  relative operands.  This lets macros with both
9019                  immediate and address operands work correctly.  */
9020               my_getExpression (&offset_expr, s);
9021
9022               if (offset_expr.X_op == O_register)
9023                 break;
9024
9025               /* We need to relax this instruction.  */
9026               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
9027               s = expr_end;
9028               continue;
9029
9030             case '6':           /* break code */
9031               my_getExpression (&imm_expr, s);
9032               check_absolute_expr (ip, &imm_expr);
9033               if ((unsigned long) imm_expr.X_add_number > 63)
9034                 {
9035                   as_warn (_("Invalid value for `%s' (%lu)"),
9036                            ip->insn_mo->name,
9037                            (unsigned long) imm_expr.X_add_number);
9038                   imm_expr.X_add_number &= 0x3f;
9039                 }
9040               ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
9041               imm_expr.X_op = O_absent;
9042               s = expr_end;
9043               continue;
9044
9045             case 'a':           /* 26 bit address */
9046               my_getExpression (&offset_expr, s);
9047               s = expr_end;
9048               *offset_reloc = BFD_RELOC_MIPS16_JMP;
9049               ip->insn_opcode <<= 16;
9050               continue;
9051
9052             case 'l':           /* register list for entry macro */
9053             case 'L':           /* register list for exit macro */
9054               {
9055                 int mask;
9056
9057                 if (c == 'l')
9058                   mask = 0;
9059                 else
9060                   mask = 7 << 3;
9061                 while (*s != '\0')
9062                   {
9063                     int freg, reg1, reg2;
9064
9065                     while (*s == ' ' || *s == ',')
9066                       ++s;
9067                     if (*s != '$')
9068                       {
9069                         as_bad (_("can't parse register list"));
9070                         break;
9071                       }
9072                     ++s;
9073                     if (*s != 'f')
9074                       freg = 0;
9075                     else
9076                       {
9077                         freg = 1;
9078                         ++s;
9079                       }
9080                     reg1 = 0;
9081                     while (ISDIGIT (*s))
9082                       {
9083                         reg1 *= 10;
9084                         reg1 += *s - '0';
9085                         ++s;
9086                       }
9087                     if (*s == ' ')
9088                       ++s;
9089                     if (*s != '-')
9090                       reg2 = reg1;
9091                     else
9092                       {
9093                         ++s;
9094                         if (*s != '$')
9095                           break;
9096                         ++s;
9097                         if (freg)
9098                           {
9099                             if (*s == 'f')
9100                               ++s;
9101                             else
9102                               {
9103                                 as_bad (_("invalid register list"));
9104                                 break;
9105                               }
9106                           }
9107                         reg2 = 0;
9108                         while (ISDIGIT (*s))
9109                           {
9110                             reg2 *= 10;
9111                             reg2 += *s - '0';
9112                             ++s;
9113                           }
9114                       }
9115                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
9116                       {
9117                         mask &= ~ (7 << 3);
9118                         mask |= 5 << 3;
9119                       }
9120                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
9121                       {
9122                         mask &= ~ (7 << 3);
9123                         mask |= 6 << 3;
9124                       }
9125                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
9126                       mask |= (reg2 - 3) << 3;
9127                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
9128                       mask |= (reg2 - 15) << 1;
9129                     else if (reg1 == 31 && reg2 == 31)
9130                       mask |= 1;
9131                     else
9132                       {
9133                         as_bad (_("invalid register list"));
9134                         break;
9135                       }
9136                   }
9137                 /* The mask is filled in in the opcode table for the
9138                    benefit of the disassembler.  We remove it before
9139                    applying the actual mask.  */
9140                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
9141                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
9142               }
9143             continue;
9144
9145             case 'e':           /* extend code */
9146               my_getExpression (&imm_expr, s);
9147               check_absolute_expr (ip, &imm_expr);
9148               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
9149                 {
9150                   as_warn (_("Invalid value for `%s' (%lu)"),
9151                            ip->insn_mo->name,
9152                            (unsigned long) imm_expr.X_add_number);
9153                   imm_expr.X_add_number &= 0x7ff;
9154                 }
9155               ip->insn_opcode |= imm_expr.X_add_number;
9156               imm_expr.X_op = O_absent;
9157               s = expr_end;
9158               continue;
9159
9160             default:
9161               internalError ();
9162             }
9163           break;
9164         }
9165
9166       /* Args don't match.  */
9167       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
9168           strcmp (insn->name, insn[1].name) == 0)
9169         {
9170           ++insn;
9171           s = argsstart;
9172           continue;
9173         }
9174
9175       insn_error = _("illegal operands");
9176
9177       return;
9178     }
9179 }
9180
9181 /* This structure holds information we know about a mips16 immediate
9182    argument type.  */
9183
9184 struct mips16_immed_operand
9185 {
9186   /* The type code used in the argument string in the opcode table.  */
9187   int type;
9188   /* The number of bits in the short form of the opcode.  */
9189   int nbits;
9190   /* The number of bits in the extended form of the opcode.  */
9191   int extbits;
9192   /* The amount by which the short form is shifted when it is used;
9193      for example, the sw instruction has a shift count of 2.  */
9194   int shift;
9195   /* The amount by which the short form is shifted when it is stored
9196      into the instruction code.  */
9197   int op_shift;
9198   /* Non-zero if the short form is unsigned.  */
9199   int unsp;
9200   /* Non-zero if the extended form is unsigned.  */
9201   int extu;
9202   /* Non-zero if the value is PC relative.  */
9203   int pcrel;
9204 };
9205
9206 /* The mips16 immediate operand types.  */
9207
9208 static const struct mips16_immed_operand mips16_immed_operands[] =
9209 {
9210   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9211   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9212   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9213   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9214   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
9215   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
9216   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
9217   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
9218   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
9219   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
9220   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
9221   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
9222   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
9223   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
9224   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
9225   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
9226   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9227   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9228   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
9229   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
9230   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
9231 };
9232
9233 #define MIPS16_NUM_IMMED \
9234   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
9235
9236 /* Handle a mips16 instruction with an immediate value.  This or's the
9237    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
9238    whether an extended value is needed; if one is needed, it sets
9239    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
9240    If SMALL is true, an unextended opcode was explicitly requested.
9241    If EXT is true, an extended opcode was explicitly requested.  If
9242    WARN is true, warn if EXT does not match reality.  */
9243
9244 static void
9245 mips16_immed (file, line, type, val, warn, small, ext, insn, use_extend,
9246               extend)
9247      char *file;
9248      unsigned int line;
9249      int type;
9250      offsetT val;
9251      boolean warn;
9252      boolean small;
9253      boolean ext;
9254      unsigned long *insn;
9255      boolean *use_extend;
9256      unsigned short *extend;
9257 {
9258   register const struct mips16_immed_operand *op;
9259   int mintiny, maxtiny;
9260   boolean needext;
9261
9262   op = mips16_immed_operands;
9263   while (op->type != type)
9264     {
9265       ++op;
9266       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
9267     }
9268
9269   if (op->unsp)
9270     {
9271       if (type == '<' || type == '>' || type == '[' || type == ']')
9272         {
9273           mintiny = 1;
9274           maxtiny = 1 << op->nbits;
9275         }
9276       else
9277         {
9278           mintiny = 0;
9279           maxtiny = (1 << op->nbits) - 1;
9280         }
9281     }
9282   else
9283     {
9284       mintiny = - (1 << (op->nbits - 1));
9285       maxtiny = (1 << (op->nbits - 1)) - 1;
9286     }
9287
9288   /* Branch offsets have an implicit 0 in the lowest bit.  */
9289   if (type == 'p' || type == 'q')
9290     val /= 2;
9291
9292   if ((val & ((1 << op->shift) - 1)) != 0
9293       || val < (mintiny << op->shift)
9294       || val > (maxtiny << op->shift))
9295     needext = true;
9296   else
9297     needext = false;
9298
9299   if (warn && ext && ! needext)
9300     as_warn_where (file, line,
9301                    _("extended operand requested but not required"));
9302   if (small && needext)
9303     as_bad_where (file, line, _("invalid unextended operand value"));
9304
9305   if (small || (! ext && ! needext))
9306     {
9307       int insnval;
9308
9309       *use_extend = false;
9310       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
9311       insnval <<= op->op_shift;
9312       *insn |= insnval;
9313     }
9314   else
9315     {
9316       long minext, maxext;
9317       int extval;
9318
9319       if (op->extu)
9320         {
9321           minext = 0;
9322           maxext = (1 << op->extbits) - 1;
9323         }
9324       else
9325         {
9326           minext = - (1 << (op->extbits - 1));
9327           maxext = (1 << (op->extbits - 1)) - 1;
9328         }
9329       if (val < minext || val > maxext)
9330         as_bad_where (file, line,
9331                       _("operand value out of range for instruction"));
9332
9333       *use_extend = true;
9334       if (op->extbits == 16)
9335         {
9336           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
9337           val &= 0x1f;
9338         }
9339       else if (op->extbits == 15)
9340         {
9341           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
9342           val &= 0xf;
9343         }
9344       else
9345         {
9346           extval = ((val & 0x1f) << 6) | (val & 0x20);
9347           val = 0;
9348         }
9349
9350       *extend = (unsigned short) extval;
9351       *insn |= val;
9352     }
9353 }
9354 \f
9355 static struct percent_op_match
9356 {
9357    const char *str;
9358    const enum small_ex_type type;
9359 } percent_op[] =
9360 {
9361   {"%lo", S_EX_LO},
9362 #ifdef OBJ_ELF
9363   {"%call_hi", S_EX_CALL_HI},
9364   {"%call_lo", S_EX_CALL_LO},
9365   {"%call16", S_EX_CALL16},
9366   {"%got_disp", S_EX_GOT_DISP},
9367   {"%got_page", S_EX_GOT_PAGE},
9368   {"%got_ofst", S_EX_GOT_OFST},
9369   {"%got_hi", S_EX_GOT_HI},
9370   {"%got_lo", S_EX_GOT_LO},
9371   {"%got", S_EX_GOT},
9372   {"%gp_rel", S_EX_GP_REL},
9373   {"%half", S_EX_HALF},
9374   {"%highest", S_EX_HIGHEST},
9375   {"%higher", S_EX_HIGHER},
9376   {"%neg", S_EX_NEG},
9377 #endif
9378   {"%hi", S_EX_HI}
9379 };
9380
9381 /* Parse small expression input.  STR gets adjusted to eat up whitespace.
9382    It detects valid "%percent_op(...)" and "($reg)" strings.  Percent_op's
9383    can be nested, this is handled by blanking the innermost, parsing the
9384    rest by subsequent calls.  */
9385
9386 static int
9387 my_getSmallParser (str, len, nestlevel)
9388      char **str;
9389      unsigned int *len;
9390      int *nestlevel;
9391 {
9392   *len = 0;
9393   *str += strspn (*str, " \t");
9394   /* Check for expression in parentheses.  */
9395   if (**str == '(')
9396     {
9397       char *b = *str + 1 + strspn (*str + 1, " \t");
9398       char *e;
9399
9400       /* Check for base register.  */
9401       if (b[0] == '$')
9402         {
9403           if (strchr (b, ')')
9404               && (e = b + strcspn (b, ") \t"))
9405               && e - b > 1 && e - b < 4)
9406             {
9407                if ((e - b == 3
9408                     && ((b[1] == 'f' && b[2] == 'p')
9409                         || (b[1] == 's' && b[2] == 'p')
9410                         || (b[1] == 'g' && b[2] == 'p')
9411                         || (b[1] == 'a' && b[2] == 't')
9412                         || (ISDIGIT (b[1])
9413                             && ISDIGIT (b[2]))))
9414                    || (ISDIGIT (b[1])))
9415                  {
9416                    *len = strcspn (*str, ")") + 1;
9417                    return S_EX_REGISTER;
9418                  }
9419             }
9420         }
9421       /* Check for percent_op (in parentheses).  */
9422       else if (b[0] == '%')
9423         {
9424           *str = b;
9425           return my_getPercentOp (str, len, nestlevel);
9426         }
9427
9428       /* Some other expression in the parentheses, which can contain
9429          parentheses itself. Attempt to find the matching one.  */
9430       {
9431         int pcnt = 1;
9432         char *s;
9433
9434         *len = 1;
9435         for (s = *str + 1; *s && pcnt; s++, (*len)++)
9436           {
9437             if (*s == '(')
9438               pcnt++;
9439             else if (*s == ')')
9440               pcnt--;
9441           }
9442       }
9443     }
9444   /* Check for percent_op (outside of parentheses).  */
9445   else if (*str[0] == '%')
9446     return my_getPercentOp (str, len, nestlevel);
9447
9448   /* Any other expression.  */
9449   return S_EX_NONE;
9450 }
9451
9452 static int
9453 my_getPercentOp (str, len, nestlevel)
9454      char **str;
9455      unsigned int *len;
9456      int *nestlevel;
9457 {
9458   char *tmp = *str + 1;
9459   unsigned int i = 0;
9460
9461   while (ISALPHA (*tmp) || *tmp == '_')
9462     {
9463       *tmp = TOLOWER (*tmp);
9464       tmp++;
9465     }
9466   while (i < (sizeof (percent_op) / sizeof (struct percent_op_match)))
9467     {
9468       if (strncmp (*str, percent_op[i].str, strlen (percent_op[i].str)))
9469           i++;
9470       else
9471         {
9472           int type = percent_op[i].type;
9473
9474           /* Only %hi and %lo are allowed for OldABI.  */
9475           if (! HAVE_NEWABI && type != S_EX_HI && type != S_EX_LO)
9476             return S_EX_NONE;
9477
9478           *len = strlen (percent_op[i].str);
9479           (*nestlevel)++;
9480           return type;
9481         }
9482     }
9483   return S_EX_NONE;
9484 }
9485
9486 static int
9487 my_getSmallExpression (ep, str)
9488      expressionS *ep;
9489      char *str;
9490 {
9491   static char *oldstr = NULL;
9492   int c = S_EX_NONE;
9493   int oldc;
9494   int nestlevel = -1;
9495   unsigned int len;
9496
9497   /* Don't update oldstr if the last call had nested percent_op's. We need
9498      it to parse the outer ones later.  */
9499   if (! oldstr)
9500     oldstr = str;
9501
9502   do
9503     {
9504       oldc = c;
9505       c = my_getSmallParser (&str, &len, &nestlevel);
9506       if (c != S_EX_NONE && c != S_EX_REGISTER)
9507         str += len;
9508     }
9509   while (c != S_EX_NONE && c != S_EX_REGISTER);
9510
9511   if (nestlevel >= 0)
9512     {
9513       /* A percent_op was encountered.  Don't try to get an expression if
9514          it is already blanked out.  */
9515       if (*(str + strspn (str + 1, " )")) != ')')
9516         {
9517           char save;
9518
9519           /* Let my_getExpression() stop at the closing parenthesis.  */
9520           save = *(str + len);
9521           *(str + len) = '\0';
9522           my_getExpression (ep, str);
9523           *(str + len) = save;
9524         }
9525       if (nestlevel > 0)
9526         {
9527           /* Blank out including the % sign and the proper matching
9528              parenthesis.  */
9529           int pcnt = 1;
9530           char *s = strrchr (oldstr, '%');
9531           char *end;
9532
9533           for (end = strchr (s, '(') + 1; *end && pcnt; end++)
9534             {
9535               if (*end == '(')
9536                 pcnt++;
9537               else if (*end == ')')
9538                 pcnt--;
9539             }
9540
9541           memset (s, ' ', end - s);
9542           str = oldstr;
9543         }
9544       else
9545         expr_end = str + len;
9546
9547       c = oldc;
9548     }
9549   else if (c == S_EX_NONE)
9550     {
9551       my_getExpression (ep, str);
9552     }
9553   else if (c == S_EX_REGISTER)
9554     {
9555       ep->X_op = O_constant;
9556       expr_end = str;
9557       ep->X_add_symbol = NULL;
9558       ep->X_op_symbol = NULL;
9559       ep->X_add_number = 0;
9560     }
9561   else
9562     {
9563       as_fatal(_("internal error"));
9564     }
9565
9566   if (nestlevel <= 0)
9567     /* All percent_op's have been handled.  */
9568     oldstr = NULL;
9569
9570   return c;
9571 }
9572
9573 static void
9574 my_getExpression (ep, str)
9575      expressionS *ep;
9576      char *str;
9577 {
9578   char *save_in;
9579   valueT val;
9580
9581   save_in = input_line_pointer;
9582   input_line_pointer = str;
9583   expression (ep);
9584   expr_end = input_line_pointer;
9585   input_line_pointer = save_in;
9586
9587   /* If we are in mips16 mode, and this is an expression based on `.',
9588      then we bump the value of the symbol by 1 since that is how other
9589      text symbols are handled.  We don't bother to handle complex
9590      expressions, just `.' plus or minus a constant.  */
9591   if (mips_opts.mips16
9592       && ep->X_op == O_symbol
9593       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
9594       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
9595       && symbol_get_frag (ep->X_add_symbol) == frag_now
9596       && symbol_constant_p (ep->X_add_symbol)
9597       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
9598     S_SET_VALUE (ep->X_add_symbol, val + 1);
9599 }
9600
9601 /* Turn a string in input_line_pointer into a floating point constant
9602    of type TYPE, and store the appropriate bytes in *LITP.  The number
9603    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
9604    returned, or NULL on OK.  */
9605
9606 char *
9607 md_atof (type, litP, sizeP)
9608      int type;
9609      char *litP;
9610      int *sizeP;
9611 {
9612   int prec;
9613   LITTLENUM_TYPE words[4];
9614   char *t;
9615   int i;
9616
9617   switch (type)
9618     {
9619     case 'f':
9620       prec = 2;
9621       break;
9622
9623     case 'd':
9624       prec = 4;
9625       break;
9626
9627     default:
9628       *sizeP = 0;
9629       return _("bad call to md_atof");
9630     }
9631
9632   t = atof_ieee (input_line_pointer, type, words);
9633   if (t)
9634     input_line_pointer = t;
9635
9636   *sizeP = prec * 2;
9637
9638   if (! target_big_endian)
9639     {
9640       for (i = prec - 1; i >= 0; i--)
9641         {
9642           md_number_to_chars (litP, (valueT) words[i], 2);
9643           litP += 2;
9644         }
9645     }
9646   else
9647     {
9648       for (i = 0; i < prec; i++)
9649         {
9650           md_number_to_chars (litP, (valueT) words[i], 2);
9651           litP += 2;
9652         }
9653     }
9654
9655   return NULL;
9656 }
9657
9658 void
9659 md_number_to_chars (buf, val, n)
9660      char *buf;
9661      valueT val;
9662      int n;
9663 {
9664   if (target_big_endian)
9665     number_to_chars_bigendian (buf, val, n);
9666   else
9667     number_to_chars_littleendian (buf, val, n);
9668 }
9669 \f
9670 #ifdef OBJ_ELF
9671 static int support_64bit_objects(void)
9672 {
9673   const char **list, **l;
9674
9675   list = bfd_target_list ();
9676   for (l = list; *l != NULL; l++)
9677 #ifdef TE_TMIPS
9678     /* This is traditional mips */
9679     if (strcmp (*l, "elf64-tradbigmips") == 0
9680         || strcmp (*l, "elf64-tradlittlemips") == 0)
9681 #else
9682     if (strcmp (*l, "elf64-bigmips") == 0
9683         || strcmp (*l, "elf64-littlemips") == 0)
9684 #endif
9685       break;
9686   free (list);
9687   return (*l != NULL);
9688 }
9689 #endif /* OBJ_ELF */
9690
9691 CONST char *md_shortopts = "nO::g::G:";
9692
9693 struct option md_longopts[] =
9694 {
9695 #define OPTION_MIPS1 (OPTION_MD_BASE + 1)
9696   {"mips0", no_argument, NULL, OPTION_MIPS1},
9697   {"mips1", no_argument, NULL, OPTION_MIPS1},
9698 #define OPTION_MIPS2 (OPTION_MD_BASE + 2)
9699   {"mips2", no_argument, NULL, OPTION_MIPS2},
9700 #define OPTION_MIPS3 (OPTION_MD_BASE + 3)
9701   {"mips3", no_argument, NULL, OPTION_MIPS3},
9702 #define OPTION_MIPS4 (OPTION_MD_BASE + 4)
9703   {"mips4", no_argument, NULL, OPTION_MIPS4},
9704 #define OPTION_MIPS5 (OPTION_MD_BASE + 5)
9705   {"mips5", no_argument, NULL, OPTION_MIPS5},
9706 #define OPTION_MIPS32 (OPTION_MD_BASE + 6)
9707   {"mips32", no_argument, NULL, OPTION_MIPS32},
9708 #define OPTION_MIPS64 (OPTION_MD_BASE + 7)
9709   {"mips64", no_argument, NULL, OPTION_MIPS64},
9710 #define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 8)
9711   {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
9712 #define OPTION_TRAP (OPTION_MD_BASE + 9)
9713   {"trap", no_argument, NULL, OPTION_TRAP},
9714   {"no-break", no_argument, NULL, OPTION_TRAP},
9715 #define OPTION_BREAK (OPTION_MD_BASE + 10)
9716   {"break", no_argument, NULL, OPTION_BREAK},
9717   {"no-trap", no_argument, NULL, OPTION_BREAK},
9718 #define OPTION_EB (OPTION_MD_BASE + 11)
9719   {"EB", no_argument, NULL, OPTION_EB},
9720 #define OPTION_EL (OPTION_MD_BASE + 12)
9721   {"EL", no_argument, NULL, OPTION_EL},
9722 #define OPTION_MIPS16 (OPTION_MD_BASE + 13)
9723   {"mips16", no_argument, NULL, OPTION_MIPS16},
9724 #define OPTION_NO_MIPS16 (OPTION_MD_BASE + 14)
9725   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
9726 #define OPTION_M7000_HILO_FIX (OPTION_MD_BASE + 15)
9727   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
9728 #define OPTION_NO_M7000_HILO_FIX (OPTION_MD_BASE + 16)
9729   {"no-fix-7000", no_argument, NULL, OPTION_NO_M7000_HILO_FIX},
9730 #define OPTION_FP32 (OPTION_MD_BASE + 17)
9731   {"mfp32", no_argument, NULL, OPTION_FP32},
9732 #define OPTION_GP32 (OPTION_MD_BASE + 18)
9733   {"mgp32", no_argument, NULL, OPTION_GP32},
9734 #define OPTION_CONSTRUCT_FLOATS (OPTION_MD_BASE + 19)
9735   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
9736 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MD_BASE + 20)
9737   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
9738 #define OPTION_MARCH (OPTION_MD_BASE + 21)
9739   {"march", required_argument, NULL, OPTION_MARCH},
9740 #define OPTION_MTUNE (OPTION_MD_BASE + 22)
9741   {"mtune", required_argument, NULL, OPTION_MTUNE},
9742 #define OPTION_MCPU (OPTION_MD_BASE + 23)
9743   {"mcpu", required_argument, NULL, OPTION_MCPU},
9744 #define OPTION_M4650 (OPTION_MD_BASE + 24)
9745   {"m4650", no_argument, NULL, OPTION_M4650},
9746 #define OPTION_NO_M4650 (OPTION_MD_BASE + 25)
9747   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
9748 #define OPTION_M4010 (OPTION_MD_BASE + 26)
9749   {"m4010", no_argument, NULL, OPTION_M4010},
9750 #define OPTION_NO_M4010 (OPTION_MD_BASE + 27)
9751   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
9752 #define OPTION_M4100 (OPTION_MD_BASE + 28)
9753   {"m4100", no_argument, NULL, OPTION_M4100},
9754 #define OPTION_NO_M4100 (OPTION_MD_BASE + 29)
9755   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
9756 #define OPTION_M3900 (OPTION_MD_BASE + 30)
9757   {"m3900", no_argument, NULL, OPTION_M3900},
9758 #define OPTION_NO_M3900 (OPTION_MD_BASE + 31)
9759   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
9760 #define OPTION_GP64 (OPTION_MD_BASE + 32)
9761   {"mgp64", no_argument, NULL, OPTION_GP64},
9762 #define OPTION_MIPS3D (OPTION_MD_BASE + 33)
9763   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
9764 #define OPTION_NO_MIPS3D (OPTION_MD_BASE + 34)
9765   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
9766 #ifdef OBJ_ELF
9767 #define OPTION_ELF_BASE    (OPTION_MD_BASE + 35)
9768 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
9769   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
9770   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
9771 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
9772   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
9773 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
9774   {"xgot",        no_argument, NULL, OPTION_XGOT},
9775 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
9776   {"mabi", required_argument, NULL, OPTION_MABI},
9777 #define OPTION_32          (OPTION_ELF_BASE + 4)
9778   {"32",          no_argument, NULL, OPTION_32},
9779 #define OPTION_N32         (OPTION_ELF_BASE + 5)
9780   {"n32",         no_argument, NULL, OPTION_N32},
9781 #define OPTION_64          (OPTION_ELF_BASE + 6)
9782   {"64",          no_argument, NULL, OPTION_64},
9783 #endif /* OBJ_ELF */
9784   {NULL, no_argument, NULL, 0}
9785 };
9786 size_t md_longopts_size = sizeof (md_longopts);
9787
9788 int
9789 md_parse_option (c, arg)
9790      int c;
9791      char *arg;
9792 {
9793   switch (c)
9794     {
9795     case OPTION_CONSTRUCT_FLOATS:
9796       mips_disable_float_construction = 0;
9797       break;
9798
9799     case OPTION_NO_CONSTRUCT_FLOATS:
9800       mips_disable_float_construction = 1;
9801       break;
9802
9803     case OPTION_TRAP:
9804       mips_trap = 1;
9805       break;
9806
9807     case OPTION_BREAK:
9808       mips_trap = 0;
9809       break;
9810
9811     case OPTION_EB:
9812       target_big_endian = 1;
9813       break;
9814
9815     case OPTION_EL:
9816       target_big_endian = 0;
9817       break;
9818
9819     case 'n':
9820       warn_nops = 1;
9821       break;
9822
9823     case 'O':
9824       if (arg && arg[1] == '0')
9825         mips_optimize = 1;
9826       else
9827         mips_optimize = 2;
9828       break;
9829
9830     case 'g':
9831       if (arg == NULL)
9832         mips_debug = 2;
9833       else
9834         mips_debug = atoi (arg);
9835       /* When the MIPS assembler sees -g or -g2, it does not do
9836          optimizations which limit full symbolic debugging.  We take
9837          that to be equivalent to -O0.  */
9838       if (mips_debug == 2)
9839         mips_optimize = 1;
9840       break;
9841
9842     case OPTION_MIPS1:
9843       mips_opts.isa = ISA_MIPS1;
9844       break;
9845
9846     case OPTION_MIPS2:
9847       mips_opts.isa = ISA_MIPS2;
9848       break;
9849
9850     case OPTION_MIPS3:
9851       mips_opts.isa = ISA_MIPS3;
9852       break;
9853
9854     case OPTION_MIPS4:
9855       mips_opts.isa = ISA_MIPS4;
9856       break;
9857
9858     case OPTION_MIPS5:
9859       mips_opts.isa = ISA_MIPS5;
9860       break;
9861
9862     case OPTION_MIPS32:
9863       mips_opts.isa = ISA_MIPS32;
9864       break;
9865
9866     case OPTION_MIPS64:
9867       mips_opts.isa = ISA_MIPS64;
9868       break;
9869
9870     case OPTION_MTUNE:
9871     case OPTION_MARCH:
9872     case OPTION_MCPU:
9873       {
9874         int cpu = CPU_UNKNOWN;
9875
9876         /* Identify the processor type.  */
9877         if (strcasecmp (arg, "default") != 0)
9878           {
9879             const struct mips_cpu_info *ci;
9880
9881             ci = mips_cpu_info_from_name (arg);
9882             if (ci == NULL || ci->is_isa)
9883               {
9884                 switch (c)
9885                   {
9886                   case OPTION_MTUNE:
9887                     as_fatal (_("invalid architecture -mtune=%s"), arg);
9888                     break;
9889                   case OPTION_MARCH:
9890                     as_fatal (_("invalid architecture -march=%s"), arg);
9891                     break;
9892                   case OPTION_MCPU:
9893                     as_fatal (_("invalid architecture -mcpu=%s"), arg);
9894                     break;
9895                   }
9896               }
9897             else
9898                 cpu = ci->cpu;
9899           }
9900
9901         switch (c)
9902           {
9903           case OPTION_MTUNE:
9904             if (mips_tune != CPU_UNKNOWN && mips_tune != cpu)
9905               as_warn(_("A different -mtune= was already specified, is now "
9906                         "-mtune=%s"), arg);
9907             mips_tune = cpu;
9908             break;
9909           case OPTION_MARCH:
9910             if (mips_arch != CPU_UNKNOWN && mips_arch != cpu)
9911               as_warn(_("A different -march= was already specified, is now "
9912                         "-march=%s"), arg);
9913             mips_arch = cpu;
9914             break;
9915           case OPTION_MCPU:
9916             if (mips_cpu != CPU_UNKNOWN && mips_cpu != cpu)
9917               as_warn(_("A different -mcpu= was already specified, is now "
9918                         "-mcpu=%s"), arg);
9919             mips_cpu = cpu;
9920           }
9921       }
9922       break;
9923
9924     case OPTION_M4650:
9925       if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_R4650)
9926           || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_R4650))
9927         as_warn(_("A different -march= or -mtune= was already specified, "
9928                   "is now -m4650"));
9929       mips_arch = CPU_R4650;
9930       mips_tune = CPU_R4650;
9931       break;
9932
9933     case OPTION_NO_M4650:
9934       break;
9935
9936     case OPTION_M4010:
9937       if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_R4010)
9938           || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_R4010))
9939         as_warn(_("A different -march= or -mtune= was already specified, "
9940                   "is now -m4010"));
9941       mips_arch = CPU_R4010;
9942       mips_tune = CPU_R4010;
9943       break;
9944
9945     case OPTION_NO_M4010:
9946       break;
9947
9948     case OPTION_M4100:
9949       if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_VR4100)
9950           || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_VR4100))
9951         as_warn(_("A different -march= or -mtune= was already specified, "
9952                   "is now -m4100"));
9953       mips_arch = CPU_VR4100;
9954       mips_tune = CPU_VR4100;
9955       break;
9956
9957     case OPTION_NO_M4100:
9958       break;
9959
9960     case OPTION_M3900:
9961       if ((mips_arch != CPU_UNKNOWN && mips_arch != CPU_R3900)
9962           || (mips_tune != CPU_UNKNOWN && mips_tune != CPU_R3900))
9963         as_warn(_("A different -march= or -mtune= was already specified, "
9964                   "is now -m3900"));
9965       mips_arch = CPU_R3900;
9966       mips_tune = CPU_R3900;
9967       break;
9968
9969     case OPTION_NO_M3900:
9970       break;
9971
9972     case OPTION_MIPS16:
9973       mips_opts.mips16 = 1;
9974       mips_no_prev_insn (false);
9975       break;
9976
9977     case OPTION_NO_MIPS16:
9978       mips_opts.mips16 = 0;
9979       mips_no_prev_insn (false);
9980       break;
9981
9982     case OPTION_MIPS3D:
9983       mips_opts.ase_mips3d = 1;
9984       break;
9985
9986     case OPTION_NO_MIPS3D:
9987       mips_opts.ase_mips3d = 0;
9988       break;
9989
9990     case OPTION_MEMBEDDED_PIC:
9991       mips_pic = EMBEDDED_PIC;
9992       if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
9993         {
9994           as_bad (_("-G may not be used with embedded PIC code"));
9995           return 0;
9996         }
9997       g_switch_value = 0x7fffffff;
9998       break;
9999
10000 #ifdef OBJ_ELF
10001       /* When generating ELF code, we permit -KPIC and -call_shared to
10002          select SVR4_PIC, and -non_shared to select no PIC.  This is
10003          intended to be compatible with Irix 5.  */
10004     case OPTION_CALL_SHARED:
10005       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10006         {
10007           as_bad (_("-call_shared is supported only for ELF format"));
10008           return 0;
10009         }
10010       mips_pic = SVR4_PIC;
10011       if (g_switch_seen && g_switch_value != 0)
10012         {
10013           as_bad (_("-G may not be used with SVR4 PIC code"));
10014           return 0;
10015         }
10016       g_switch_value = 0;
10017       break;
10018
10019     case OPTION_NON_SHARED:
10020       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10021         {
10022           as_bad (_("-non_shared is supported only for ELF format"));
10023           return 0;
10024         }
10025       mips_pic = NO_PIC;
10026       break;
10027
10028       /* The -xgot option tells the assembler to use 32 offsets when
10029          accessing the got in SVR4_PIC mode.  It is for Irix
10030          compatibility.  */
10031     case OPTION_XGOT:
10032       mips_big_got = 1;
10033       break;
10034 #endif /* OBJ_ELF */
10035
10036     case 'G':
10037       if (! USE_GLOBAL_POINTER_OPT)
10038         {
10039           as_bad (_("-G is not supported for this configuration"));
10040           return 0;
10041         }
10042       else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
10043         {
10044           as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
10045           return 0;
10046         }
10047       else
10048         g_switch_value = atoi (arg);
10049       g_switch_seen = 1;
10050       break;
10051
10052 #ifdef OBJ_ELF
10053       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
10054          and -mabi=64.  */
10055     case OPTION_32:
10056       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10057         {
10058           as_bad (_("-32 is supported for ELF format only"));
10059           return 0;
10060         }
10061       mips_opts.abi = O32_ABI;
10062       break;
10063
10064     case OPTION_N32:
10065       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10066         {
10067           as_bad (_("-n32 is supported for ELF format only"));
10068           return 0;
10069         }
10070       mips_opts.abi = N32_ABI;
10071       break;
10072
10073     case OPTION_64:
10074       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10075         {
10076           as_bad (_("-64 is supported for ELF format only"));
10077           return 0;
10078         }
10079       mips_opts.abi = N64_ABI;
10080       if (! support_64bit_objects())
10081         as_fatal (_("No compiled in support for 64 bit object file format"));
10082       break;
10083 #endif /* OBJ_ELF */
10084
10085     case OPTION_GP32:
10086       file_mips_gp32 = 1;
10087       if (mips_opts.abi != O32_ABI)
10088         mips_opts.abi = NO_ABI;
10089       break;
10090
10091     case OPTION_GP64:
10092       file_mips_gp32 = 0;
10093       if (mips_opts.abi == O32_ABI)
10094         mips_opts.abi = NO_ABI;
10095       break;
10096
10097     case OPTION_FP32:
10098       file_mips_fp32 = 1;
10099       if (mips_opts.abi != O32_ABI)
10100         mips_opts.abi = NO_ABI;
10101       break;
10102
10103 #ifdef OBJ_ELF
10104     case OPTION_MABI:
10105       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10106         {
10107           as_bad (_("-mabi is supported for ELF format only"));
10108           return 0;
10109         }
10110       if (strcmp (arg, "32") == 0)
10111         mips_opts.abi = O32_ABI;
10112       else if (strcmp (arg, "o64") == 0)
10113         mips_opts.abi = O64_ABI;
10114       else if (strcmp (arg, "n32") == 0)
10115         mips_opts.abi = N32_ABI;
10116       else if (strcmp (arg, "64") == 0)
10117         {
10118           mips_opts.abi = N64_ABI;
10119           if (! support_64bit_objects())
10120             as_fatal (_("No compiled in support for 64 bit object file "
10121                         "format"));
10122         }
10123       else if (strcmp (arg, "eabi") == 0)
10124         mips_opts.abi = EABI_ABI;
10125       else
10126         {
10127           as_fatal (_("invalid abi -mabi=%s"), arg);
10128           return 0;
10129         }
10130       break;
10131 #endif /* OBJ_ELF */
10132
10133     case OPTION_M7000_HILO_FIX:
10134       mips_7000_hilo_fix = true;
10135       break;
10136
10137     case OPTION_NO_M7000_HILO_FIX:
10138       mips_7000_hilo_fix = false;
10139       break;
10140
10141     default:
10142       return 0;
10143     }
10144
10145   return 1;
10146 }
10147
10148 static void
10149 show (stream, string, col_p, first_p)
10150      FILE *stream;
10151      char *string;
10152      int *col_p;
10153      int *first_p;
10154 {
10155   if (*first_p)
10156     {
10157       fprintf (stream, "%24s", "");
10158       *col_p = 24;
10159     }
10160   else
10161     {
10162       fprintf (stream, ", ");
10163       *col_p += 2;
10164     }
10165
10166   if (*col_p + strlen (string) > 72)
10167     {
10168       fprintf (stream, "\n%24s", "");
10169       *col_p = 24;
10170     }
10171
10172   fprintf (stream, "%s", string);
10173   *col_p += strlen (string);
10174
10175   *first_p = 0;
10176 }
10177
10178 void
10179 md_show_usage (stream)
10180      FILE *stream;
10181 {
10182   int column, first;
10183
10184   fprintf (stream, _("\
10185 MIPS options:\n\
10186 -membedded-pic          generate embedded position independent code\n\
10187 -EB                     generate big endian output\n\
10188 -EL                     generate little endian output\n\
10189 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
10190 -G NUM                  allow referencing objects up to NUM bytes\n\
10191                         implicitly with the gp register [default 8]\n"));
10192   fprintf (stream, _("\
10193 -mips1                  generate MIPS ISA I instructions\n\
10194 -mips2                  generate MIPS ISA II instructions\n\
10195 -mips3                  generate MIPS ISA III instructions\n\
10196 -mips4                  generate MIPS ISA IV instructions\n\
10197 -mips5                  generate MIPS ISA V instructions\n\
10198 -mips32                 generate MIPS32 ISA instructions\n\
10199 -mips64                 generate MIPS64 ISA instructions\n\
10200 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
10201
10202   first = 1;
10203
10204   show (stream, "2000", &column, &first);
10205   show (stream, "3000", &column, &first);
10206   show (stream, "3900", &column, &first);
10207   show (stream, "4000", &column, &first);
10208   show (stream, "4010", &column, &first);
10209   show (stream, "4100", &column, &first);
10210   show (stream, "4111", &column, &first);
10211   show (stream, "4300", &column, &first);
10212   show (stream, "4400", &column, &first);
10213   show (stream, "4600", &column, &first);
10214   show (stream, "4650", &column, &first);
10215   show (stream, "5000", &column, &first);
10216   show (stream, "5200", &column, &first);
10217   show (stream, "5230", &column, &first);
10218   show (stream, "5231", &column, &first);
10219   show (stream, "5261", &column, &first);
10220   show (stream, "5721", &column, &first);
10221   show (stream, "6000", &column, &first);
10222   show (stream, "8000", &column, &first);
10223   show (stream, "10000", &column, &first);
10224   show (stream, "12000", &column, &first);
10225   show (stream, "sb1", &column, &first);
10226   fputc ('\n', stream);
10227
10228   fprintf (stream, _("\
10229 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
10230 -no-mCPU                don't generate code specific to CPU.\n\
10231                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
10232
10233   first = 1;
10234
10235   show (stream, "3900", &column, &first);
10236   show (stream, "4010", &column, &first);
10237   show (stream, "4100", &column, &first);
10238   show (stream, "4650", &column, &first);
10239   fputc ('\n', stream);
10240
10241   fprintf (stream, _("\
10242 -mips16                 generate mips16 instructions\n\
10243 -no-mips16              do not generate mips16 instructions\n"));
10244   fprintf (stream, _("\
10245 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
10246 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
10247 -O0                     remove unneeded NOPs, do not swap branches\n\
10248 -O                      remove unneeded NOPs and swap branches\n\
10249 -n                      warn about NOPs generated from macros\n\
10250 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
10251 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
10252 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
10253 #ifdef OBJ_ELF
10254   fprintf (stream, _("\
10255 -KPIC, -call_shared     generate SVR4 position independent code\n\
10256 -non_shared             do not generate position independent code\n\
10257 -xgot                   assume a 32 bit GOT\n\
10258 -mabi=ABI               create ABI conformant object file for:\n"));
10259
10260   first = 1;
10261
10262   show (stream, "32", &column, &first);
10263   show (stream, "o64", &column, &first);
10264   show (stream, "n32", &column, &first);
10265   show (stream, "64", &column, &first);
10266   show (stream, "eabi", &column, &first);
10267                              
10268   fputc ('\n', stream);
10269
10270   fprintf (stream, _("\
10271 -32                     create o32 ABI object file (default)\n\
10272 -n32                    create n32 ABI object file\n\
10273 -64                     create 64 ABI object file\n"));
10274 #endif
10275 }
10276 \f
10277 void
10278 mips_init_after_args ()
10279 {
10280   /* initialize opcodes */
10281   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
10282   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
10283 }
10284
10285 long
10286 md_pcrel_from (fixP)
10287      fixS *fixP;
10288 {
10289   if (OUTPUT_FLAVOR != bfd_target_aout_flavour
10290       && fixP->fx_addsy != (symbolS *) NULL
10291       && ! S_IS_DEFINED (fixP->fx_addsy))
10292     {
10293       /* This makes a branch to an undefined symbol be a branch to the
10294          current location.  */
10295       if (mips_pic == EMBEDDED_PIC)
10296         return 4;
10297       else
10298         return 1;
10299     }
10300
10301   /* return the address of the delay slot */
10302   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
10303 }
10304
10305 /* This is called before the symbol table is processed.  In order to
10306    work with gcc when using mips-tfile, we must keep all local labels.
10307    However, in other cases, we want to discard them.  If we were
10308    called with -g, but we didn't see any debugging information, it may
10309    mean that gcc is smuggling debugging information through to
10310    mips-tfile, in which case we must generate all local labels.  */
10311
10312 void
10313 mips_frob_file_before_adjust ()
10314 {
10315 #ifndef NO_ECOFF_DEBUGGING
10316   if (ECOFF_DEBUGGING
10317       && mips_debug != 0
10318       && ! ecoff_debugging_seen)
10319     flag_keep_locals = 1;
10320 #endif
10321 }
10322
10323 /* Sort any unmatched HI16_S relocs so that they immediately precede
10324    the corresponding LO reloc.  This is called before md_apply_fix3 and
10325    tc_gen_reloc.  Unmatched HI16_S relocs can only be generated by
10326    explicit use of the %hi modifier.  */
10327
10328 void
10329 mips_frob_file ()
10330 {
10331   struct mips_hi_fixup *l;
10332
10333   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
10334     {
10335       segment_info_type *seginfo;
10336       int pass;
10337
10338       assert (l->fixp->fx_r_type == BFD_RELOC_HI16_S);
10339
10340       /* Check quickly whether the next fixup happens to be a matching
10341          %lo.  */
10342       if (l->fixp->fx_next != NULL
10343           && l->fixp->fx_next->fx_r_type == BFD_RELOC_LO16
10344           && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
10345           && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
10346         continue;
10347
10348       /* Look through the fixups for this segment for a matching %lo.
10349          When we find one, move the %hi just in front of it.  We do
10350          this in two passes.  In the first pass, we try to find a
10351          unique %lo.  In the second pass, we permit multiple %hi
10352          relocs for a single %lo (this is a GNU extension).  */
10353       seginfo = seg_info (l->seg);
10354       for (pass = 0; pass < 2; pass++)
10355         {
10356           fixS *f, *prev;
10357
10358           prev = NULL;
10359           for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
10360             {
10361               /* Check whether this is a %lo fixup which matches l->fixp.  */
10362               if (f->fx_r_type == BFD_RELOC_LO16
10363                   && f->fx_addsy == l->fixp->fx_addsy
10364                   && f->fx_offset == l->fixp->fx_offset
10365                   && (pass == 1
10366                       || prev == NULL
10367                       || prev->fx_r_type != BFD_RELOC_HI16_S
10368                       || prev->fx_addsy != f->fx_addsy
10369                       || prev->fx_offset !=  f->fx_offset))
10370                 {
10371                   fixS **pf;
10372
10373                   /* Move l->fixp before f.  */
10374                   for (pf = &seginfo->fix_root;
10375                        *pf != l->fixp;
10376                        pf = &(*pf)->fx_next)
10377                     assert (*pf != NULL);
10378
10379                   *pf = l->fixp->fx_next;
10380
10381                   l->fixp->fx_next = f;
10382                   if (prev == NULL)
10383                     seginfo->fix_root = l->fixp;
10384                   else
10385                     prev->fx_next = l->fixp;
10386
10387                   break;
10388                 }
10389
10390               prev = f;
10391             }
10392
10393           if (f != NULL)
10394             break;
10395
10396 #if 0 /* GCC code motion plus incomplete dead code elimination
10397          can leave a %hi without a %lo.  */
10398           if (pass == 1)
10399             as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
10400                            _("Unmatched %%hi reloc"));
10401 #endif
10402         }
10403     }
10404 }
10405
10406 /* When generating embedded PIC code we need to use a special
10407    relocation to represent the difference of two symbols in the .text
10408    section (switch tables use a difference of this sort).  See
10409    include/coff/mips.h for details.  This macro checks whether this
10410    fixup requires the special reloc.  */
10411 #define SWITCH_TABLE(fixp) \
10412   ((fixp)->fx_r_type == BFD_RELOC_32 \
10413    && OUTPUT_FLAVOR != bfd_target_elf_flavour \
10414    && (fixp)->fx_addsy != NULL \
10415    && (fixp)->fx_subsy != NULL \
10416    && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
10417    && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
10418
10419 /* When generating embedded PIC code we must keep all PC relative
10420    relocations, in case the linker has to relax a call.  We also need
10421    to keep relocations for switch table entries.
10422
10423    We may have combined relocations without symbols in the N32/N64 ABI.
10424    We have to prevent gas from dropping them.  */
10425
10426 int
10427 mips_force_relocation (fixp)
10428      fixS *fixp;
10429 {
10430   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
10431       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
10432     return 1;
10433
10434   if (HAVE_NEWABI
10435       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
10436       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
10437           || fixp->fx_r_type == BFD_RELOC_HI16_S
10438           || fixp->fx_r_type == BFD_RELOC_LO16))
10439     return 1;
10440
10441   return (mips_pic == EMBEDDED_PIC
10442           && (fixp->fx_pcrel
10443               || SWITCH_TABLE (fixp)
10444               || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
10445               || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
10446 }
10447
10448 #ifdef OBJ_ELF
10449 static int
10450 mips_need_elf_addend_fixup (fixP)
10451      fixS *fixP;
10452 {
10453   if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16)
10454     return 1;
10455   if (mips_pic == EMBEDDED_PIC
10456       && S_IS_WEAK (fixP->fx_addsy))
10457     return 1;
10458   if (mips_pic != EMBEDDED_PIC
10459       && (S_IS_WEAK (fixP->fx_addsy)
10460           || S_IS_EXTERN (fixP->fx_addsy))
10461       && !S_IS_COMMON (fixP->fx_addsy))
10462     return 1;
10463   if (symbol_used_in_reloc_p (fixP->fx_addsy)
10464       && (((bfd_get_section_flags (stdoutput,
10465                                    S_GET_SEGMENT (fixP->fx_addsy))
10466             & SEC_LINK_ONCE) != 0)
10467           || !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
10468                        ".gnu.linkonce",
10469                        sizeof (".gnu.linkonce") - 1)))
10470     return 1;
10471   return 0;
10472 }
10473 #endif
10474
10475 /* Apply a fixup to the object file.  */
10476
10477 void
10478 md_apply_fix3 (fixP, valP, seg)
10479      fixS *fixP;
10480      valueT * valP;
10481      segT seg ATTRIBUTE_UNUSED;
10482 {
10483   bfd_byte *buf;
10484   long insn;
10485   valueT value;
10486
10487   assert (fixP->fx_size == 4
10488           || fixP->fx_r_type == BFD_RELOC_16
10489           || fixP->fx_r_type == BFD_RELOC_32
10490           || fixP->fx_r_type == BFD_RELOC_MIPS_JMP
10491           || fixP->fx_r_type == BFD_RELOC_HI16_S
10492           || fixP->fx_r_type == BFD_RELOC_LO16
10493           || fixP->fx_r_type == BFD_RELOC_GPREL16
10494           || fixP->fx_r_type == BFD_RELOC_MIPS_LITERAL
10495           || fixP->fx_r_type == BFD_RELOC_GPREL32
10496           || fixP->fx_r_type == BFD_RELOC_64
10497           || fixP->fx_r_type == BFD_RELOC_CTOR
10498           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
10499           || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHEST
10500           || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHER
10501           || fixP->fx_r_type == BFD_RELOC_MIPS_SCN_DISP
10502           || fixP->fx_r_type == BFD_RELOC_MIPS_REL16
10503           || fixP->fx_r_type == BFD_RELOC_MIPS_RELGOT
10504           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
10505           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
10506
10507   value = * valP;
10508
10509   /* If we aren't adjusting this fixup to be against the section
10510      symbol, we need to adjust the value.  */
10511 #ifdef OBJ_ELF
10512   if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
10513     {
10514       if (mips_need_elf_addend_fixup (fixP))
10515         {
10516           valueT symval = S_GET_VALUE (fixP->fx_addsy);
10517
10518           value -= symval;
10519           if (value != 0 && ! fixP->fx_pcrel)
10520             {
10521               /* In this case, the bfd_install_relocation routine will
10522                  incorrectly add the symbol value back in.  We just want
10523                  the addend to appear in the object file.  */
10524               value -= symval;
10525
10526               /* Make sure the addend is still non-zero.  If it became zero
10527                  after the last operation, set it to a spurious value and
10528                  subtract the same value from the object file's contents.  */
10529               if (value == 0)
10530                 {
10531                   value = 8;
10532
10533                   /* The in-place addends for LO16 relocations are signed;
10534                      leave the matching HI16 in-place addends as zero.  */
10535                   if (fixP->fx_r_type != BFD_RELOC_HI16_S)
10536                     {
10537                       reloc_howto_type *howto;
10538                       bfd_vma contents, mask, field;
10539
10540                       howto = bfd_reloc_type_lookup (stdoutput,
10541                                                      fixP->fx_r_type);
10542
10543                       contents = bfd_get_bits (fixP->fx_frag->fr_literal
10544                                                + fixP->fx_where,
10545                                                fixP->fx_size * 8,
10546                                                target_big_endian);
10547
10548                       /* MASK has bits set where the relocation should go.
10549                          FIELD is -value, shifted into the appropriate place
10550                          for this relocation.  */
10551                       mask = 1 << (howto->bitsize - 1);
10552                       mask = (((mask - 1) << 1) | 1) << howto->bitpos;
10553                       field = (-value >> howto->rightshift) << howto->bitpos;
10554
10555                       bfd_put_bits ((field & mask) | (contents & ~mask),
10556                                     fixP->fx_frag->fr_literal + fixP->fx_where,
10557                                     fixP->fx_size * 8,
10558                                     target_big_endian);
10559                     }
10560                 }
10561             }
10562         }
10563
10564       /* This code was generated using trial and error and so is
10565          fragile and not trustworthy.  If you change it, you should
10566          rerun the elf-rel, elf-rel2, and empic testcases and ensure
10567          they still pass.  */
10568       if (fixP->fx_pcrel || fixP->fx_subsy != NULL)
10569         {
10570           value += fixP->fx_frag->fr_address + fixP->fx_where;
10571
10572           /* BFD's REL handling, for MIPS, is _very_ weird.
10573              This gives the right results, but it can't possibly
10574              be the way things are supposed to work.  */
10575           if ((fixP->fx_r_type != BFD_RELOC_16_PCREL
10576                && fixP->fx_r_type != BFD_RELOC_16_PCREL_S2)
10577               || S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
10578             value += fixP->fx_frag->fr_address + fixP->fx_where;
10579         }
10580     }
10581 #endif
10582
10583   fixP->fx_addnumber = value;   /* Remember value for tc_gen_reloc.  */
10584
10585   if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel)
10586     fixP->fx_done = 1;
10587
10588   switch (fixP->fx_r_type)
10589     {
10590     case BFD_RELOC_MIPS_JMP:
10591     case BFD_RELOC_MIPS_SHIFT5:
10592     case BFD_RELOC_MIPS_SHIFT6:
10593     case BFD_RELOC_MIPS_GOT_DISP:
10594     case BFD_RELOC_MIPS_GOT_PAGE:
10595     case BFD_RELOC_MIPS_GOT_OFST:
10596     case BFD_RELOC_MIPS_SUB:
10597     case BFD_RELOC_MIPS_INSERT_A:
10598     case BFD_RELOC_MIPS_INSERT_B:
10599     case BFD_RELOC_MIPS_DELETE:
10600     case BFD_RELOC_MIPS_HIGHEST:
10601     case BFD_RELOC_MIPS_HIGHER:
10602     case BFD_RELOC_MIPS_SCN_DISP:
10603     case BFD_RELOC_MIPS_REL16:
10604     case BFD_RELOC_MIPS_RELGOT:
10605     case BFD_RELOC_MIPS_JALR:
10606     case BFD_RELOC_HI16:
10607     case BFD_RELOC_HI16_S:
10608     case BFD_RELOC_GPREL16:
10609     case BFD_RELOC_MIPS_LITERAL:
10610     case BFD_RELOC_MIPS_CALL16:
10611     case BFD_RELOC_MIPS_GOT16:
10612     case BFD_RELOC_GPREL32:
10613     case BFD_RELOC_MIPS_GOT_HI16:
10614     case BFD_RELOC_MIPS_GOT_LO16:
10615     case BFD_RELOC_MIPS_CALL_HI16:
10616     case BFD_RELOC_MIPS_CALL_LO16:
10617     case BFD_RELOC_MIPS16_GPREL:
10618       if (fixP->fx_pcrel)
10619         as_bad_where (fixP->fx_file, fixP->fx_line,
10620                       _("Invalid PC relative reloc"));
10621       /* Nothing needed to do. The value comes from the reloc entry */
10622       break;
10623
10624     case BFD_RELOC_MIPS16_JMP:
10625       /* We currently always generate a reloc against a symbol, which
10626          means that we don't want an addend even if the symbol is
10627          defined.  */
10628       fixP->fx_addnumber = 0;
10629       break;
10630
10631     case BFD_RELOC_PCREL_HI16_S:
10632       /* The addend for this is tricky if it is internal, so we just
10633          do everything here rather than in bfd_install_relocation.  */
10634       if (OUTPUT_FLAVOR == bfd_target_elf_flavour
10635           && !fixP->fx_done
10636           && value != 0)
10637         break;
10638       if (fixP->fx_addsy
10639           && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
10640         {
10641           /* For an external symbol adjust by the address to make it
10642              pcrel_offset.  We use the address of the RELLO reloc
10643              which follows this one.  */
10644           value += (fixP->fx_next->fx_frag->fr_address
10645                     + fixP->fx_next->fx_where);
10646         }
10647       value = ((value + 0x8000) >> 16) & 0xffff;
10648       buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
10649       if (target_big_endian)
10650         buf += 2;
10651       md_number_to_chars ((char *) buf, value, 2);
10652       break;
10653
10654     case BFD_RELOC_PCREL_LO16:
10655       /* The addend for this is tricky if it is internal, so we just
10656          do everything here rather than in bfd_install_relocation.  */
10657       if (OUTPUT_FLAVOR == bfd_target_elf_flavour
10658           && !fixP->fx_done
10659           && value != 0)
10660         break;
10661       if (fixP->fx_addsy
10662           && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
10663         value += fixP->fx_frag->fr_address + fixP->fx_where;
10664       buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
10665       if (target_big_endian)
10666         buf += 2;
10667       md_number_to_chars ((char *) buf, value, 2);
10668       break;
10669
10670     case BFD_RELOC_64:
10671       /* This is handled like BFD_RELOC_32, but we output a sign
10672          extended value if we are only 32 bits.  */
10673       if (fixP->fx_done
10674           || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
10675         {
10676           if (8 <= sizeof (valueT))
10677             md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
10678                                 value, 8);
10679           else
10680             {
10681               long w1, w2;
10682               long hiv;
10683
10684               w1 = w2 = fixP->fx_where;
10685               if (target_big_endian)
10686                 w1 += 4;
10687               else
10688                 w2 += 4;
10689               md_number_to_chars (fixP->fx_frag->fr_literal + w1, value, 4);
10690               if ((value & 0x80000000) != 0)
10691                 hiv = 0xffffffff;
10692               else
10693                 hiv = 0;
10694               md_number_to_chars (fixP->fx_frag->fr_literal + w2, hiv, 4);
10695             }
10696         }
10697       break;
10698
10699     case BFD_RELOC_RVA:
10700     case BFD_RELOC_32:
10701       /* If we are deleting this reloc entry, we must fill in the
10702          value now.  This can happen if we have a .word which is not
10703          resolved when it appears but is later defined.  We also need
10704          to fill in the value if this is an embedded PIC switch table
10705          entry.  */
10706       if (fixP->fx_done
10707           || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
10708         md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
10709                             value, 4);
10710       break;
10711
10712     case BFD_RELOC_16:
10713       /* If we are deleting this reloc entry, we must fill in the
10714          value now.  */
10715       assert (fixP->fx_size == 2);
10716       if (fixP->fx_done)
10717         md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
10718                             value, 2);
10719       break;
10720
10721     case BFD_RELOC_LO16:
10722       /* When handling an embedded PIC switch statement, we can wind
10723          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
10724       if (fixP->fx_done)
10725         {
10726           if (value + 0x8000 > 0xffff)
10727             as_bad_where (fixP->fx_file, fixP->fx_line,
10728                           _("relocation overflow"));
10729           buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
10730           if (target_big_endian)
10731             buf += 2;
10732           md_number_to_chars ((char *) buf, value, 2);
10733         }
10734       break;
10735
10736     case BFD_RELOC_16_PCREL_S2:
10737       if ((value & 0x3) != 0)
10738         as_bad_where (fixP->fx_file, fixP->fx_line,
10739                       _("Branch to odd address (%lx)"), (long) value);
10740
10741       /* Fall through.  */
10742
10743     case BFD_RELOC_16_PCREL:
10744       /*
10745        * We need to save the bits in the instruction since fixup_segment()
10746        * might be deleting the relocation entry (i.e., a branch within
10747        * the current segment).
10748        */
10749       if (!fixP->fx_done && value != 0)
10750         break;
10751       /* If 'value' is zero, the remaining reloc code won't actually
10752          do the store, so it must be done here.  This is probably
10753          a bug somewhere.  */
10754       if (!fixP->fx_done
10755           && (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
10756               || fixP->fx_addsy == NULL                 /* ??? */
10757               || ! S_IS_DEFINED (fixP->fx_addsy)))
10758         value -= fixP->fx_frag->fr_address + fixP->fx_where;
10759
10760       value = (offsetT) value >> 2;
10761
10762       /* update old instruction data */
10763       buf = (bfd_byte *) (fixP->fx_where + fixP->fx_frag->fr_literal);
10764       if (target_big_endian)
10765         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
10766       else
10767         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
10768
10769       if (value + 0x8000 <= 0xffff)
10770         insn |= value & 0xffff;
10771       else
10772         {
10773           /* The branch offset is too large.  If this is an
10774              unconditional branch, and we are not generating PIC code,
10775              we can convert it to an absolute jump instruction.  */
10776           if (mips_pic == NO_PIC
10777               && fixP->fx_done
10778               && fixP->fx_frag->fr_address >= text_section->vma
10779               && (fixP->fx_frag->fr_address
10780                   < text_section->vma + text_section->_raw_size)
10781               && ((insn & 0xffff0000) == 0x10000000      /* beq $0,$0 */
10782                   || (insn & 0xffff0000) == 0x04010000   /* bgez $0 */
10783                   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
10784             {
10785               if ((insn & 0xffff0000) == 0x04110000)     /* bgezal $0 */
10786                 insn = 0x0c000000;      /* jal */
10787               else
10788                 insn = 0x08000000;      /* j */
10789               fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
10790               fixP->fx_done = 0;
10791               fixP->fx_addsy = section_symbol (text_section);
10792               fixP->fx_addnumber = (value << 2) + md_pcrel_from (fixP);
10793             }
10794           else
10795             {
10796               /* FIXME.  It would be possible in principle to handle
10797                  conditional branches which overflow.  They could be
10798                  transformed into a branch around a jump.  This would
10799                  require setting up variant frags for each different
10800                  branch type.  The native MIPS assembler attempts to
10801                  handle these cases, but it appears to do it
10802                  incorrectly.  */
10803               as_bad_where (fixP->fx_file, fixP->fx_line,
10804                             _("Branch out of range"));
10805             }
10806         }
10807
10808       md_number_to_chars ((char *) buf, (valueT) insn, 4);
10809       break;
10810
10811     case BFD_RELOC_VTABLE_INHERIT:
10812       fixP->fx_done = 0;
10813       if (fixP->fx_addsy
10814           && !S_IS_DEFINED (fixP->fx_addsy)
10815           && !S_IS_WEAK (fixP->fx_addsy))
10816         S_SET_WEAK (fixP->fx_addsy);
10817       break;
10818
10819     case BFD_RELOC_VTABLE_ENTRY:
10820       fixP->fx_done = 0;
10821       break;
10822
10823     default:
10824       internalError ();
10825     }
10826 }
10827
10828 #if 0
10829 void
10830 printInsn (oc)
10831      unsigned long oc;
10832 {
10833   const struct mips_opcode *p;
10834   int treg, sreg, dreg, shamt;
10835   short imm;
10836   const char *args;
10837   int i;
10838
10839   for (i = 0; i < NUMOPCODES; ++i)
10840     {
10841       p = &mips_opcodes[i];
10842       if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
10843         {
10844           printf ("%08lx %s\t", oc, p->name);
10845           treg = (oc >> 16) & 0x1f;
10846           sreg = (oc >> 21) & 0x1f;
10847           dreg = (oc >> 11) & 0x1f;
10848           shamt = (oc >> 6) & 0x1f;
10849           imm = oc;
10850           for (args = p->args;; ++args)
10851             {
10852               switch (*args)
10853                 {
10854                 case '\0':
10855                   printf ("\n");
10856                   break;
10857
10858                 case ',':
10859                 case '(':
10860                 case ')':
10861                   printf ("%c", *args);
10862                   continue;
10863
10864                 case 'r':
10865                   assert (treg == sreg);
10866                   printf ("$%d,$%d", treg, sreg);
10867                   continue;
10868
10869                 case 'd':
10870                 case 'G':
10871                   printf ("$%d", dreg);
10872                   continue;
10873
10874                 case 't':
10875                 case 'E':
10876                   printf ("$%d", treg);
10877                   continue;
10878
10879                 case 'k':
10880                   printf ("0x%x", treg);
10881                   continue;
10882
10883                 case 'b':
10884                 case 's':
10885                   printf ("$%d", sreg);
10886                   continue;
10887
10888                 case 'a':
10889                   printf ("0x%08lx", oc & 0x1ffffff);
10890                   continue;
10891
10892                 case 'i':
10893                 case 'j':
10894                 case 'o':
10895                 case 'u':
10896                   printf ("%d", imm);
10897                   continue;
10898
10899                 case '<':
10900                 case '>':
10901                   printf ("$%d", shamt);
10902                   continue;
10903
10904                 default:
10905                   internalError ();
10906                 }
10907               break;
10908             }
10909           return;
10910         }
10911     }
10912   printf (_("%08lx  UNDEFINED\n"), oc);
10913 }
10914 #endif
10915
10916 static symbolS *
10917 get_symbol ()
10918 {
10919   int c;
10920   char *name;
10921   symbolS *p;
10922
10923   name = input_line_pointer;
10924   c = get_symbol_end ();
10925   p = (symbolS *) symbol_find_or_make (name);
10926   *input_line_pointer = c;
10927   return p;
10928 }
10929
10930 /* Align the current frag to a given power of two.  The MIPS assembler
10931    also automatically adjusts any preceding label.  */
10932
10933 static void
10934 mips_align (to, fill, label)
10935      int to;
10936      int fill;
10937      symbolS *label;
10938 {
10939   mips_emit_delays (false);
10940   frag_align (to, fill, 0);
10941   record_alignment (now_seg, to);
10942   if (label != NULL)
10943     {
10944       assert (S_GET_SEGMENT (label) == now_seg);
10945       symbol_set_frag (label, frag_now);
10946       S_SET_VALUE (label, (valueT) frag_now_fix ());
10947     }
10948 }
10949
10950 /* Align to a given power of two.  .align 0 turns off the automatic
10951    alignment used by the data creating pseudo-ops.  */
10952
10953 static void
10954 s_align (x)
10955      int x ATTRIBUTE_UNUSED;
10956 {
10957   register int temp;
10958   register long temp_fill;
10959   long max_alignment = 15;
10960
10961   /*
10962
10963     o  Note that the assembler pulls down any immediately preceeding label
10964        to the aligned address.
10965     o  It's not documented but auto alignment is reinstated by
10966        a .align pseudo instruction.
10967     o  Note also that after auto alignment is turned off the mips assembler
10968        issues an error on attempt to assemble an improperly aligned data item.
10969        We don't.
10970
10971     */
10972
10973   temp = get_absolute_expression ();
10974   if (temp > max_alignment)
10975     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
10976   else if (temp < 0)
10977     {
10978       as_warn (_("Alignment negative: 0 assumed."));
10979       temp = 0;
10980     }
10981   if (*input_line_pointer == ',')
10982     {
10983       input_line_pointer++;
10984       temp_fill = get_absolute_expression ();
10985     }
10986   else
10987     temp_fill = 0;
10988   if (temp)
10989     {
10990       auto_align = 1;
10991       mips_align (temp, (int) temp_fill,
10992                   insn_labels != NULL ? insn_labels->label : NULL);
10993     }
10994   else
10995     {
10996       auto_align = 0;
10997     }
10998
10999   demand_empty_rest_of_line ();
11000 }
11001
11002 void
11003 mips_flush_pending_output ()
11004 {
11005   mips_emit_delays (false);
11006   mips_clear_insn_labels ();
11007 }
11008
11009 static void
11010 s_change_sec (sec)
11011      int sec;
11012 {
11013   segT seg;
11014
11015   /* When generating embedded PIC code, we only use the .text, .lit8,
11016      .sdata and .sbss sections.  We change the .data and .rdata
11017      pseudo-ops to use .sdata.  */
11018   if (mips_pic == EMBEDDED_PIC
11019       && (sec == 'd' || sec == 'r'))
11020     sec = 's';
11021
11022 #ifdef OBJ_ELF
11023   /* The ELF backend needs to know that we are changing sections, so
11024      that .previous works correctly.  We could do something like check
11025      for an obj_section_change_hook macro, but that might be confusing
11026      as it would not be appropriate to use it in the section changing
11027      functions in read.c, since obj-elf.c intercepts those.  FIXME:
11028      This should be cleaner, somehow.  */
11029   obj_elf_section_change_hook ();
11030 #endif
11031
11032   mips_emit_delays (false);
11033   switch (sec)
11034     {
11035     case 't':
11036       s_text (0);
11037       break;
11038     case 'd':
11039       s_data (0);
11040       break;
11041     case 'b':
11042       subseg_set (bss_section, (subsegT) get_absolute_expression ());
11043       demand_empty_rest_of_line ();
11044       break;
11045
11046     case 'r':
11047       if (USE_GLOBAL_POINTER_OPT)
11048         {
11049           seg = subseg_new (RDATA_SECTION_NAME,
11050                             (subsegT) get_absolute_expression ());
11051           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11052             {
11053               bfd_set_section_flags (stdoutput, seg,
11054                                      (SEC_ALLOC
11055                                       | SEC_LOAD
11056                                       | SEC_READONLY
11057                                       | SEC_RELOC
11058                                       | SEC_DATA));
11059               if (strcmp (TARGET_OS, "elf") != 0)
11060                 record_alignment (seg, 4);
11061             }
11062           demand_empty_rest_of_line ();
11063         }
11064       else
11065         {
11066           as_bad (_("No read only data section in this object file format"));
11067           demand_empty_rest_of_line ();
11068           return;
11069         }
11070       break;
11071
11072     case 's':
11073       if (USE_GLOBAL_POINTER_OPT)
11074         {
11075           seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11076           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11077             {
11078               bfd_set_section_flags (stdoutput, seg,
11079                                      SEC_ALLOC | SEC_LOAD | SEC_RELOC
11080                                      | SEC_DATA);
11081               if (strcmp (TARGET_OS, "elf") != 0)
11082                 record_alignment (seg, 4);
11083             }
11084           demand_empty_rest_of_line ();
11085           break;
11086         }
11087       else
11088         {
11089           as_bad (_("Global pointers not supported; recompile -G 0"));
11090           demand_empty_rest_of_line ();
11091           return;
11092         }
11093     }
11094
11095   auto_align = 1;
11096 }
11097
11098 void
11099 mips_enable_auto_align ()
11100 {
11101   auto_align = 1;
11102 }
11103
11104 static void
11105 s_cons (log_size)
11106      int log_size;
11107 {
11108   symbolS *label;
11109
11110   label = insn_labels != NULL ? insn_labels->label : NULL;
11111   mips_emit_delays (false);
11112   if (log_size > 0 && auto_align)
11113     mips_align (log_size, 0, label);
11114   mips_clear_insn_labels ();
11115   cons (1 << log_size);
11116 }
11117
11118 static void
11119 s_float_cons (type)
11120      int type;
11121 {
11122   symbolS *label;
11123
11124   label = insn_labels != NULL ? insn_labels->label : NULL;
11125
11126   mips_emit_delays (false);
11127
11128   if (auto_align)
11129     {
11130       if (type == 'd')
11131         mips_align (3, 0, label);
11132       else
11133         mips_align (2, 0, label);
11134     }
11135
11136   mips_clear_insn_labels ();
11137
11138   float_cons (type);
11139 }
11140
11141 /* Handle .globl.  We need to override it because on Irix 5 you are
11142    permitted to say
11143        .globl foo .text
11144    where foo is an undefined symbol, to mean that foo should be
11145    considered to be the address of a function.  */
11146
11147 static void
11148 s_mips_globl (x)
11149      int x ATTRIBUTE_UNUSED;
11150 {
11151   char *name;
11152   int c;
11153   symbolS *symbolP;
11154   flagword flag;
11155
11156   name = input_line_pointer;
11157   c = get_symbol_end ();
11158   symbolP = symbol_find_or_make (name);
11159   *input_line_pointer = c;
11160   SKIP_WHITESPACE ();
11161
11162   /* On Irix 5, every global symbol that is not explicitly labelled as
11163      being a function is apparently labelled as being an object.  */
11164   flag = BSF_OBJECT;
11165
11166   if (! is_end_of_line[(unsigned char) *input_line_pointer])
11167     {
11168       char *secname;
11169       asection *sec;
11170
11171       secname = input_line_pointer;
11172       c = get_symbol_end ();
11173       sec = bfd_get_section_by_name (stdoutput, secname);
11174       if (sec == NULL)
11175         as_bad (_("%s: no such section"), secname);
11176       *input_line_pointer = c;
11177
11178       if (sec != NULL && (sec->flags & SEC_CODE) != 0)
11179         flag = BSF_FUNCTION;
11180     }
11181
11182   symbol_get_bfdsym (symbolP)->flags |= flag;
11183
11184   S_SET_EXTERNAL (symbolP);
11185   demand_empty_rest_of_line ();
11186 }
11187
11188 static void
11189 s_option (x)
11190      int x ATTRIBUTE_UNUSED;
11191 {
11192   char *opt;
11193   char c;
11194
11195   opt = input_line_pointer;
11196   c = get_symbol_end ();
11197
11198   if (*opt == 'O')
11199     {
11200       /* FIXME: What does this mean?  */
11201     }
11202   else if (strncmp (opt, "pic", 3) == 0)
11203     {
11204       int i;
11205
11206       i = atoi (opt + 3);
11207       if (i == 0)
11208         mips_pic = NO_PIC;
11209       else if (i == 2)
11210         mips_pic = SVR4_PIC;
11211       else
11212         as_bad (_(".option pic%d not supported"), i);
11213
11214       if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
11215         {
11216           if (g_switch_seen && g_switch_value != 0)
11217             as_warn (_("-G may not be used with SVR4 PIC code"));
11218           g_switch_value = 0;
11219           bfd_set_gp_size (stdoutput, 0);
11220         }
11221     }
11222   else
11223     as_warn (_("Unrecognized option \"%s\""), opt);
11224
11225   *input_line_pointer = c;
11226   demand_empty_rest_of_line ();
11227 }
11228
11229 /* This structure is used to hold a stack of .set values.  */
11230
11231 struct mips_option_stack
11232 {
11233   struct mips_option_stack *next;
11234   struct mips_set_options options;
11235 };
11236
11237 static struct mips_option_stack *mips_opts_stack;
11238
11239 /* Handle the .set pseudo-op.  */
11240
11241 static void
11242 s_mipsset (x)
11243      int x ATTRIBUTE_UNUSED;
11244 {
11245   char *name = input_line_pointer, ch;
11246
11247   while (!is_end_of_line[(unsigned char) *input_line_pointer])
11248     input_line_pointer++;
11249   ch = *input_line_pointer;
11250   *input_line_pointer = '\0';
11251
11252   if (strcmp (name, "reorder") == 0)
11253     {
11254       if (mips_opts.noreorder && prev_nop_frag != NULL)
11255         {
11256           /* If we still have pending nops, we can discard them.  The
11257              usual nop handling will insert any that are still
11258              needed.  */
11259           prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11260                                     * (mips_opts.mips16 ? 2 : 4));
11261           prev_nop_frag = NULL;
11262         }
11263       mips_opts.noreorder = 0;
11264     }
11265   else if (strcmp (name, "noreorder") == 0)
11266     {
11267       mips_emit_delays (true);
11268       mips_opts.noreorder = 1;
11269       mips_any_noreorder = 1;
11270     }
11271   else if (strcmp (name, "at") == 0)
11272     {
11273       mips_opts.noat = 0;
11274     }
11275   else if (strcmp (name, "noat") == 0)
11276     {
11277       mips_opts.noat = 1;
11278     }
11279   else if (strcmp (name, "macro") == 0)
11280     {
11281       mips_opts.warn_about_macros = 0;
11282     }
11283   else if (strcmp (name, "nomacro") == 0)
11284     {
11285       if (mips_opts.noreorder == 0)
11286         as_bad (_("`noreorder' must be set before `nomacro'"));
11287       mips_opts.warn_about_macros = 1;
11288     }
11289   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
11290     {
11291       mips_opts.nomove = 0;
11292     }
11293   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
11294     {
11295       mips_opts.nomove = 1;
11296     }
11297   else if (strcmp (name, "bopt") == 0)
11298     {
11299       mips_opts.nobopt = 0;
11300     }
11301   else if (strcmp (name, "nobopt") == 0)
11302     {
11303       mips_opts.nobopt = 1;
11304     }
11305   else if (strcmp (name, "mips16") == 0
11306            || strcmp (name, "MIPS-16") == 0)
11307     mips_opts.mips16 = 1;
11308   else if (strcmp (name, "nomips16") == 0
11309            || strcmp (name, "noMIPS-16") == 0)
11310     mips_opts.mips16 = 0;
11311   else if (strcmp (name, "mips3d") == 0)
11312     mips_opts.ase_mips3d = 1;
11313   else if (strcmp (name, "nomips3d") == 0)
11314     mips_opts.ase_mips3d = 0;
11315   else if (strncmp (name, "mips", 4) == 0)
11316     {
11317       int isa;
11318
11319       /* Permit the user to change the ISA on the fly.  Needless to
11320          say, misuse can cause serious problems.  */
11321       isa = atoi (name + 4);
11322       switch (isa)
11323       {
11324       case  0:
11325         mips_opts.gp32 = file_mips_gp32;
11326         mips_opts.fp32 = file_mips_fp32;
11327         mips_opts.abi = file_mips_abi;
11328         break;
11329       case  1:
11330       case  2:
11331       case 32:
11332         mips_opts.gp32 = 1;
11333         mips_opts.fp32 = 1;
11334         break;
11335       case  3:
11336       case  4:
11337       case  5:
11338       case 64:
11339         /* Loosen ABI register width restriction.  */
11340         if (mips_opts.abi == O32_ABI)
11341           mips_opts.abi = NO_ABI;
11342         mips_opts.gp32 = 0;
11343         mips_opts.fp32 = 0;
11344         break;
11345       default:
11346         as_bad (_("unknown ISA level %s"), name + 4);
11347         break;
11348       }
11349
11350       switch (isa)
11351       {
11352       case  0: mips_opts.isa = file_mips_isa;   break;
11353       case  1: mips_opts.isa = ISA_MIPS1;       break;
11354       case  2: mips_opts.isa = ISA_MIPS2;       break;
11355       case  3: mips_opts.isa = ISA_MIPS3;       break;
11356       case  4: mips_opts.isa = ISA_MIPS4;       break;
11357       case  5: mips_opts.isa = ISA_MIPS5;       break;
11358       case 32: mips_opts.isa = ISA_MIPS32;      break;
11359       case 64: mips_opts.isa = ISA_MIPS64;      break;
11360       default: as_bad (_("unknown ISA level %s"), name + 4); break;
11361       }
11362     }
11363   else if (strcmp (name, "autoextend") == 0)
11364     mips_opts.noautoextend = 0;
11365   else if (strcmp (name, "noautoextend") == 0)
11366     mips_opts.noautoextend = 1;
11367   else if (strcmp (name, "push") == 0)
11368     {
11369       struct mips_option_stack *s;
11370
11371       s = (struct mips_option_stack *) xmalloc (sizeof *s);
11372       s->next = mips_opts_stack;
11373       s->options = mips_opts;
11374       mips_opts_stack = s;
11375     }
11376   else if (strcmp (name, "pop") == 0)
11377     {
11378       struct mips_option_stack *s;
11379
11380       s = mips_opts_stack;
11381       if (s == NULL)
11382         as_bad (_(".set pop with no .set push"));
11383       else
11384         {
11385           /* If we're changing the reorder mode we need to handle
11386              delay slots correctly.  */
11387           if (s->options.noreorder && ! mips_opts.noreorder)
11388             mips_emit_delays (true);
11389           else if (! s->options.noreorder && mips_opts.noreorder)
11390             {
11391               if (prev_nop_frag != NULL)
11392                 {
11393                   prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11394                                             * (mips_opts.mips16 ? 2 : 4));
11395                   prev_nop_frag = NULL;
11396                 }
11397             }
11398
11399           mips_opts = s->options;
11400           mips_opts_stack = s->next;
11401           free (s);
11402         }
11403     }
11404   else
11405     {
11406       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
11407     }
11408   *input_line_pointer = ch;
11409   demand_empty_rest_of_line ();
11410 }
11411
11412 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
11413    .option pic2.  It means to generate SVR4 PIC calls.  */
11414
11415 static void
11416 s_abicalls (ignore)
11417      int ignore ATTRIBUTE_UNUSED;
11418 {
11419   mips_pic = SVR4_PIC;
11420   if (USE_GLOBAL_POINTER_OPT)
11421     {
11422       if (g_switch_seen && g_switch_value != 0)
11423         as_warn (_("-G may not be used with SVR4 PIC code"));
11424       g_switch_value = 0;
11425     }
11426   bfd_set_gp_size (stdoutput, 0);
11427   demand_empty_rest_of_line ();
11428 }
11429
11430 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
11431    PIC code.  It sets the $gp register for the function based on the
11432    function address, which is in the register named in the argument.
11433    This uses a relocation against _gp_disp, which is handled specially
11434    by the linker.  The result is:
11435         lui     $gp,%hi(_gp_disp)
11436         addiu   $gp,$gp,%lo(_gp_disp)
11437         addu    $gp,$gp,.cpload argument
11438    The .cpload argument is normally $25 == $t9.  */
11439
11440 static void
11441 s_cpload (ignore)
11442      int ignore ATTRIBUTE_UNUSED;
11443 {
11444   expressionS ex;
11445   int icnt = 0;
11446
11447   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
11448      .cpload is ignored.  */
11449   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
11450     {
11451       s_ignore (0);
11452       return;
11453     }
11454
11455   /* .cpload should be in a .set noreorder section.  */
11456   if (mips_opts.noreorder == 0)
11457     as_warn (_(".cpload not in noreorder section"));
11458
11459   ex.X_op = O_symbol;
11460   ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
11461   ex.X_op_symbol = NULL;
11462   ex.X_add_number = 0;
11463
11464   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
11465   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
11466
11467   macro_build_lui (NULL, &icnt, &ex, GP);
11468   macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j", GP, GP,
11469                (int) BFD_RELOC_LO16);
11470
11471   macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
11472                GP, GP, tc_get_register (0));
11473
11474   demand_empty_rest_of_line ();
11475 }
11476
11477 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
11478      .cpsetup $reg1, offset|$reg2, label
11479
11480    If offset is given, this results in:
11481      sd         $gp, offset($sp)
11482      lui        $gp, %hi(%neg(%gp_rel(label)))
11483      daddiu     $gp, $gp, %lo(%neg(%gp_rel(label)))
11484      addu       $gp, $gp, $reg1
11485
11486    If $reg2 is given, this results in:
11487      daddu      $reg2, $gp, $0
11488      lui        $gp, %hi(%neg(%gp_rel(label)))
11489      daddiu     $gp, $gp, %lo(%neg(%gp_rel(label)))
11490      addu       $gp, $gp, $reg1
11491  */
11492 static void
11493 s_cpsetup (ignore)
11494      int ignore ATTRIBUTE_UNUSED;
11495 {
11496   expressionS ex_off;
11497   expressionS ex_sym;
11498   int reg1;
11499   int icnt = 0;
11500   char *sym;
11501
11502   /* If we are not generating SVR4 PIC code, .cpload is ignored.
11503      We also need NewABI support.  */
11504   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
11505     {
11506       s_ignore (0);
11507       return;
11508     }
11509
11510   reg1 = tc_get_register (0);
11511   SKIP_WHITESPACE ();
11512   if (*input_line_pointer != ',')
11513     {
11514       as_bad (_("missing argument separator ',' for .cpsetup"));
11515       return;
11516     }
11517   else
11518     input_line_pointer++;
11519   SKIP_WHITESPACE ();
11520   if (*input_line_pointer == '$')
11521     mips_cpreturn_register = tc_get_register (0);
11522   else
11523     mips_cpreturn_offset = get_absolute_expression ();
11524   SKIP_WHITESPACE ();
11525   if (*input_line_pointer != ',')
11526     {
11527       as_bad (_("missing argument separator ',' for .cpsetup"));
11528       return;
11529     }
11530   else
11531     input_line_pointer++;
11532   SKIP_WHITESPACE ();
11533   sym = input_line_pointer;
11534   while (ISALNUM (*input_line_pointer))
11535     input_line_pointer++;
11536   *input_line_pointer = 0;
11537
11538   ex_sym.X_op = O_symbol;
11539   ex_sym.X_add_symbol = symbol_find_or_make (sym);
11540   ex_sym.X_op_symbol = NULL;
11541   ex_sym.X_add_number = 0;
11542
11543   if (mips_cpreturn_register == -1)
11544     {
11545       ex_off.X_op = O_constant;
11546       ex_off.X_add_symbol = NULL;
11547       ex_off.X_op_symbol = NULL;
11548       ex_off.X_add_number = mips_cpreturn_offset;
11549
11550       macro_build ((char *) NULL, &icnt, &ex_off, "sd", "t,o(b)",
11551                    mips_gp_register, (int) BFD_RELOC_LO16, SP);
11552     }
11553   else
11554     macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
11555                  "d,v,t", mips_cpreturn_register, mips_gp_register, 0);
11556
11557   macro_build ((char *) NULL, &icnt, &ex_sym, "lui", "t,u", mips_gp_register,
11558                (int) BFD_RELOC_GPREL16);
11559   fix_new (frag_now, (char *) prev_insn_fixp - 4 - frag_now->fr_literal, 0,
11560            NULL, 0, 0, BFD_RELOC_MIPS_SUB);
11561   fix_new (frag_now, (char *) prev_insn_fixp - 4 - frag_now->fr_literal, 0,
11562            NULL, 0, 0, BFD_RELOC_HI16_S);
11563   macro_build ((char *) NULL, &icnt, &ex_sym, "addiu", "t,r,j",
11564                mips_gp_register, mips_gp_register, (int) BFD_RELOC_GPREL16);
11565   fix_new (frag_now, (char *) prev_insn_fixp - 4 - frag_now->fr_literal, 0,
11566            NULL, 0, 0, BFD_RELOC_MIPS_SUB);
11567   fix_new (frag_now, (char *) prev_insn_fixp - 4 - frag_now->fr_literal, 0,
11568            NULL, 0, 0, BFD_RELOC_LO16);
11569   macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
11570                "d,v,t", mips_gp_register, mips_gp_register, reg1);
11571
11572   demand_empty_rest_of_line ();
11573 }
11574
11575 static void
11576 s_cplocal (ignore)
11577      int ignore ATTRIBUTE_UNUSED;
11578 {
11579   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
11580    .cplocal is ignored.  */
11581   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
11582     {
11583       s_ignore (0);
11584       return;
11585     }
11586
11587   mips_gp_register = tc_get_register (0);
11588 }
11589
11590 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
11591    offset from $sp.  The offset is remembered, and after making a PIC
11592    call $gp is restored from that location.  */
11593
11594 static void
11595 s_cprestore (ignore)
11596      int ignore ATTRIBUTE_UNUSED;
11597 {
11598   expressionS ex;
11599   int icnt = 0;
11600
11601   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
11602    .cprestore is ignored.  */
11603   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
11604     {
11605       s_ignore (0);
11606       return;
11607     }
11608
11609   mips_cprestore_offset = get_absolute_expression ();
11610   mips_cprestore_valid = 1;
11611
11612   ex.X_op = O_constant;
11613   ex.X_add_symbol = NULL;
11614   ex.X_op_symbol = NULL;
11615   ex.X_add_number = mips_cprestore_offset;
11616
11617   macro_build ((char *) NULL, &icnt, &ex,
11618                HAVE_32BIT_ADDRESSES ? "sw" : "sd",
11619                "t,o(b)", GP, (int) BFD_RELOC_LO16, SP);
11620
11621   demand_empty_rest_of_line ();
11622 }
11623
11624 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
11625    was given in the preceeding .gpsetup, it results in:
11626      ld         $gp, offset($sp)
11627
11628    If a register $reg2 was given there, it results in:
11629      daddiu     $gp, $gp, $reg2
11630  */
11631 static void
11632 s_cpreturn (ignore)
11633      int ignore ATTRIBUTE_UNUSED;
11634 {
11635   expressionS ex;
11636   int icnt = 0;
11637
11638   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
11639      We also need NewABI support.  */
11640   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
11641     {
11642       s_ignore (0);
11643       return;
11644     }
11645
11646   if (mips_cpreturn_register == -1)
11647     {
11648       ex.X_op = O_constant;
11649       ex.X_add_symbol = NULL;
11650       ex.X_op_symbol = NULL;
11651       ex.X_add_number = mips_cpreturn_offset;
11652
11653       macro_build ((char *) NULL, &icnt, &ex, "ld", "t,o(b)",
11654                    mips_gp_register, (int) BFD_RELOC_LO16, SP);
11655     }
11656   else
11657     macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
11658                  "d,v,t", mips_gp_register, mips_cpreturn_register, 0);
11659
11660   demand_empty_rest_of_line ();
11661 }
11662
11663 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
11664    code.  It sets the offset to use in gp_rel relocations.  */
11665
11666 static void
11667 s_gpvalue (ignore)
11668      int ignore ATTRIBUTE_UNUSED;
11669 {
11670   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
11671      We also need NewABI support.  */
11672   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
11673     {
11674       s_ignore (0);
11675       return;
11676     }
11677
11678   mips_cpreturn_offset = get_absolute_expression ();
11679
11680   demand_empty_rest_of_line ();
11681 }
11682
11683 /* Handle the .gpword pseudo-op.  This is used when generating PIC
11684    code.  It generates a 32 bit GP relative reloc.  */
11685
11686 static void
11687 s_gpword (ignore)
11688      int ignore ATTRIBUTE_UNUSED;
11689 {
11690   symbolS *label;
11691   expressionS ex;
11692   char *p;
11693
11694   /* When not generating PIC code, this is treated as .word.  */
11695   if (mips_pic != SVR4_PIC)
11696     {
11697       s_cons (2);
11698       return;
11699     }
11700
11701   label = insn_labels != NULL ? insn_labels->label : NULL;
11702   mips_emit_delays (true);
11703   if (auto_align)
11704     mips_align (2, 0, label);
11705   mips_clear_insn_labels ();
11706
11707   expression (&ex);
11708
11709   if (ex.X_op != O_symbol || ex.X_add_number != 0)
11710     {
11711       as_bad (_("Unsupported use of .gpword"));
11712       ignore_rest_of_line ();
11713     }
11714
11715   p = frag_more (4);
11716   md_number_to_chars (p, (valueT) 0, 4);
11717   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, 0,
11718                BFD_RELOC_GPREL32);
11719
11720   demand_empty_rest_of_line ();
11721 }
11722
11723 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
11724    tables in SVR4 PIC code.  */
11725
11726 static void
11727 s_cpadd (ignore)
11728      int ignore ATTRIBUTE_UNUSED;
11729 {
11730   int icnt = 0;
11731   int reg;
11732
11733   /* This is ignored when not generating SVR4 PIC code or if this is NewABI
11734      code.  */
11735   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
11736     {
11737       s_ignore (0);
11738       return;
11739     }
11740
11741   /* Add $gp to the register named as an argument.  */
11742   reg = tc_get_register (0);
11743   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
11744                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
11745                "d,v,t", reg, reg, GP);
11746
11747   demand_empty_rest_of_line ();
11748 }
11749
11750 /* Handle the .insn pseudo-op.  This marks instruction labels in
11751    mips16 mode.  This permits the linker to handle them specially,
11752    such as generating jalx instructions when needed.  We also make
11753    them odd for the duration of the assembly, in order to generate the
11754    right sort of code.  We will make them even in the adjust_symtab
11755    routine, while leaving them marked.  This is convenient for the
11756    debugger and the disassembler.  The linker knows to make them odd
11757    again.  */
11758
11759 static void
11760 s_insn (ignore)
11761      int ignore ATTRIBUTE_UNUSED;
11762 {
11763   if (mips_opts.mips16)
11764     mips16_mark_labels ();
11765
11766   demand_empty_rest_of_line ();
11767 }
11768
11769 /* Handle a .stabn directive.  We need these in order to mark a label
11770    as being a mips16 text label correctly.  Sometimes the compiler
11771    will emit a label, followed by a .stabn, and then switch sections.
11772    If the label and .stabn are in mips16 mode, then the label is
11773    really a mips16 text label.  */
11774
11775 static void
11776 s_mips_stab (type)
11777      int type;
11778 {
11779   if (type == 'n' && mips_opts.mips16)
11780     mips16_mark_labels ();
11781
11782   s_stab (type);
11783 }
11784
11785 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
11786  */
11787
11788 static void
11789 s_mips_weakext (ignore)
11790      int ignore ATTRIBUTE_UNUSED;
11791 {
11792   char *name;
11793   int c;
11794   symbolS *symbolP;
11795   expressionS exp;
11796
11797   name = input_line_pointer;
11798   c = get_symbol_end ();
11799   symbolP = symbol_find_or_make (name);
11800   S_SET_WEAK (symbolP);
11801   *input_line_pointer = c;
11802
11803   SKIP_WHITESPACE ();
11804
11805   if (! is_end_of_line[(unsigned char) *input_line_pointer])
11806     {
11807       if (S_IS_DEFINED (symbolP))
11808         {
11809           as_bad ("ignoring attempt to redefine symbol %s",
11810                   S_GET_NAME (symbolP));
11811           ignore_rest_of_line ();
11812           return;
11813         }
11814
11815       if (*input_line_pointer == ',')
11816         {
11817           ++input_line_pointer;
11818           SKIP_WHITESPACE ();
11819         }
11820
11821       expression (&exp);
11822       if (exp.X_op != O_symbol)
11823         {
11824           as_bad ("bad .weakext directive");
11825           ignore_rest_of_line();
11826           return;
11827         }
11828       symbol_set_value_expression (symbolP, &exp);
11829     }
11830
11831   demand_empty_rest_of_line ();
11832 }
11833
11834 /* Parse a register string into a number.  Called from the ECOFF code
11835    to parse .frame.  The argument is non-zero if this is the frame
11836    register, so that we can record it in mips_frame_reg.  */
11837
11838 int
11839 tc_get_register (frame)
11840      int frame;
11841 {
11842   int reg;
11843
11844   SKIP_WHITESPACE ();
11845   if (*input_line_pointer++ != '$')
11846     {
11847       as_warn (_("expected `$'"));
11848       reg = 0;
11849     }
11850   else if (ISDIGIT (*input_line_pointer))
11851     {
11852       reg = get_absolute_expression ();
11853       if (reg < 0 || reg >= 32)
11854         {
11855           as_warn (_("Bad register number"));
11856           reg = 0;
11857         }
11858     }
11859   else
11860     {
11861       if (strncmp (input_line_pointer, "fp", 2) == 0)
11862         reg = FP;
11863       else if (strncmp (input_line_pointer, "sp", 2) == 0)
11864         reg = SP;
11865       else if (strncmp (input_line_pointer, "gp", 2) == 0)
11866         reg = GP;
11867       else if (strncmp (input_line_pointer, "at", 2) == 0)
11868         reg = AT;
11869       else
11870         {
11871           as_warn (_("Unrecognized register name"));
11872           reg = 0;
11873         }
11874       input_line_pointer += 2;
11875     }
11876   if (frame)
11877     {
11878       mips_frame_reg = reg != 0 ? reg : SP;
11879       mips_frame_reg_valid = 1;
11880       mips_cprestore_valid = 0;
11881     }
11882   return reg;
11883 }
11884
11885 valueT
11886 md_section_align (seg, addr)
11887      asection *seg;
11888      valueT addr;
11889 {
11890   int align = bfd_get_section_alignment (stdoutput, seg);
11891
11892 #ifdef OBJ_ELF
11893   /* We don't need to align ELF sections to the full alignment.
11894      However, Irix 5 may prefer that we align them at least to a 16
11895      byte boundary.  We don't bother to align the sections if we are
11896      targeted for an embedded system.  */
11897   if (strcmp (TARGET_OS, "elf") == 0)
11898     return addr;
11899   if (align > 4)
11900     align = 4;
11901 #endif
11902
11903   return ((addr + (1 << align) - 1) & (-1 << align));
11904 }
11905
11906 /* Utility routine, called from above as well.  If called while the
11907    input file is still being read, it's only an approximation.  (For
11908    example, a symbol may later become defined which appeared to be
11909    undefined earlier.)  */
11910
11911 static int
11912 nopic_need_relax (sym, before_relaxing)
11913      symbolS *sym;
11914      int before_relaxing;
11915 {
11916   if (sym == 0)
11917     return 0;
11918
11919   if (USE_GLOBAL_POINTER_OPT && g_switch_value > 0)
11920     {
11921       const char *symname;
11922       int change;
11923
11924       /* Find out whether this symbol can be referenced off the GP
11925          register.  It can be if it is smaller than the -G size or if
11926          it is in the .sdata or .sbss section.  Certain symbols can
11927          not be referenced off the GP, although it appears as though
11928          they can.  */
11929       symname = S_GET_NAME (sym);
11930       if (symname != (const char *) NULL
11931           && (strcmp (symname, "eprol") == 0
11932               || strcmp (symname, "etext") == 0
11933               || strcmp (symname, "_gp") == 0
11934               || strcmp (symname, "edata") == 0
11935               || strcmp (symname, "_fbss") == 0
11936               || strcmp (symname, "_fdata") == 0
11937               || strcmp (symname, "_ftext") == 0
11938               || strcmp (symname, "end") == 0
11939               || strcmp (symname, "_gp_disp") == 0))
11940         change = 1;
11941       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
11942                && (0
11943 #ifndef NO_ECOFF_DEBUGGING
11944                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
11945                        && (symbol_get_obj (sym)->ecoff_extern_size
11946                            <= g_switch_value))
11947 #endif
11948                    /* We must defer this decision until after the whole
11949                       file has been read, since there might be a .extern
11950                       after the first use of this symbol.  */
11951                    || (before_relaxing
11952 #ifndef NO_ECOFF_DEBUGGING
11953                        && symbol_get_obj (sym)->ecoff_extern_size == 0
11954 #endif
11955                        && S_GET_VALUE (sym) == 0)
11956                    || (S_GET_VALUE (sym) != 0
11957                        && S_GET_VALUE (sym) <= g_switch_value)))
11958         change = 0;
11959       else
11960         {
11961           const char *segname;
11962
11963           segname = segment_name (S_GET_SEGMENT (sym));
11964           assert (strcmp (segname, ".lit8") != 0
11965                   && strcmp (segname, ".lit4") != 0);
11966           change = (strcmp (segname, ".sdata") != 0
11967                     && strcmp (segname, ".sbss") != 0
11968                     && strncmp (segname, ".sdata.", 7) != 0
11969                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
11970         }
11971       return change;
11972     }
11973   else
11974     /* We are not optimizing for the GP register.  */
11975     return 1;
11976 }
11977
11978 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
11979    extended opcode.  SEC is the section the frag is in.  */
11980
11981 static int
11982 mips16_extended_frag (fragp, sec, stretch)
11983      fragS *fragp;
11984      asection *sec;
11985      long stretch;
11986 {
11987   int type;
11988   register const struct mips16_immed_operand *op;
11989   offsetT val;
11990   int mintiny, maxtiny;
11991   segT symsec;
11992   fragS *sym_frag;
11993
11994   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
11995     return 0;
11996   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
11997     return 1;
11998
11999   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12000   op = mips16_immed_operands;
12001   while (op->type != type)
12002     {
12003       ++op;
12004       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
12005     }
12006
12007   if (op->unsp)
12008     {
12009       if (type == '<' || type == '>' || type == '[' || type == ']')
12010         {
12011           mintiny = 1;
12012           maxtiny = 1 << op->nbits;
12013         }
12014       else
12015         {
12016           mintiny = 0;
12017           maxtiny = (1 << op->nbits) - 1;
12018         }
12019     }
12020   else
12021     {
12022       mintiny = - (1 << (op->nbits - 1));
12023       maxtiny = (1 << (op->nbits - 1)) - 1;
12024     }
12025
12026   sym_frag = symbol_get_frag (fragp->fr_symbol);
12027   val = S_GET_VALUE (fragp->fr_symbol);
12028   symsec = S_GET_SEGMENT (fragp->fr_symbol);
12029
12030   if (op->pcrel)
12031     {
12032       addressT addr;
12033
12034       /* We won't have the section when we are called from
12035          mips_relax_frag.  However, we will always have been called
12036          from md_estimate_size_before_relax first.  If this is a
12037          branch to a different section, we mark it as such.  If SEC is
12038          NULL, and the frag is not marked, then it must be a branch to
12039          the same section.  */
12040       if (sec == NULL)
12041         {
12042           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
12043             return 1;
12044         }
12045       else
12046         {
12047           /* Must have been called from md_estimate_size_before_relax.  */
12048           if (symsec != sec)
12049             {
12050               fragp->fr_subtype =
12051                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12052
12053               /* FIXME: We should support this, and let the linker
12054                  catch branches and loads that are out of range.  */
12055               as_bad_where (fragp->fr_file, fragp->fr_line,
12056                             _("unsupported PC relative reference to different section"));
12057
12058               return 1;
12059             }
12060           if (fragp != sym_frag && sym_frag->fr_address == 0)
12061             /* Assume non-extended on the first relaxation pass.
12062                The address we have calculated will be bogus if this is
12063                a forward branch to another frag, as the forward frag
12064                will have fr_address == 0.  */
12065             return 0;
12066         }
12067
12068       /* In this case, we know for sure that the symbol fragment is in
12069          the same section.  If the relax_marker of the symbol fragment
12070          differs from the relax_marker of this fragment, we have not
12071          yet adjusted the symbol fragment fr_address.  We want to add
12072          in STRETCH in order to get a better estimate of the address.
12073          This particularly matters because of the shift bits.  */
12074       if (stretch != 0
12075           && sym_frag->relax_marker != fragp->relax_marker)
12076         {
12077           fragS *f;
12078
12079           /* Adjust stretch for any alignment frag.  Note that if have
12080              been expanding the earlier code, the symbol may be
12081              defined in what appears to be an earlier frag.  FIXME:
12082              This doesn't handle the fr_subtype field, which specifies
12083              a maximum number of bytes to skip when doing an
12084              alignment.  */
12085           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
12086             {
12087               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
12088                 {
12089                   if (stretch < 0)
12090                     stretch = - ((- stretch)
12091                                  & ~ ((1 << (int) f->fr_offset) - 1));
12092                   else
12093                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
12094                   if (stretch == 0)
12095                     break;
12096                 }
12097             }
12098           if (f != NULL)
12099             val += stretch;
12100         }
12101
12102       addr = fragp->fr_address + fragp->fr_fix;
12103
12104       /* The base address rules are complicated.  The base address of
12105          a branch is the following instruction.  The base address of a
12106          PC relative load or add is the instruction itself, but if it
12107          is in a delay slot (in which case it can not be extended) use
12108          the address of the instruction whose delay slot it is in.  */
12109       if (type == 'p' || type == 'q')
12110         {
12111           addr += 2;
12112
12113           /* If we are currently assuming that this frag should be
12114              extended, then, the current address is two bytes
12115              higher.  */
12116           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12117             addr += 2;
12118
12119           /* Ignore the low bit in the target, since it will be set
12120              for a text label.  */
12121           if ((val & 1) != 0)
12122             --val;
12123         }
12124       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
12125         addr -= 4;
12126       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
12127         addr -= 2;
12128
12129       val -= addr & ~ ((1 << op->shift) - 1);
12130
12131       /* Branch offsets have an implicit 0 in the lowest bit.  */
12132       if (type == 'p' || type == 'q')
12133         val /= 2;
12134
12135       /* If any of the shifted bits are set, we must use an extended
12136          opcode.  If the address depends on the size of this
12137          instruction, this can lead to a loop, so we arrange to always
12138          use an extended opcode.  We only check this when we are in
12139          the main relaxation loop, when SEC is NULL.  */
12140       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
12141         {
12142           fragp->fr_subtype =
12143             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12144           return 1;
12145         }
12146
12147       /* If we are about to mark a frag as extended because the value
12148          is precisely maxtiny + 1, then there is a chance of an
12149          infinite loop as in the following code:
12150              la $4,foo
12151              .skip      1020
12152              .align     2
12153            foo:
12154          In this case when the la is extended, foo is 0x3fc bytes
12155          away, so the la can be shrunk, but then foo is 0x400 away, so
12156          the la must be extended.  To avoid this loop, we mark the
12157          frag as extended if it was small, and is about to become
12158          extended with a value of maxtiny + 1.  */
12159       if (val == ((maxtiny + 1) << op->shift)
12160           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
12161           && sec == NULL)
12162         {
12163           fragp->fr_subtype =
12164             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12165           return 1;
12166         }
12167     }
12168   else if (symsec != absolute_section && sec != NULL)
12169     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
12170
12171   if ((val & ((1 << op->shift) - 1)) != 0
12172       || val < (mintiny << op->shift)
12173       || val > (maxtiny << op->shift))
12174     return 1;
12175   else
12176     return 0;
12177 }
12178
12179 /* Estimate the size of a frag before relaxing.  Unless this is the
12180    mips16, we are not really relaxing here, and the final size is
12181    encoded in the subtype information.  For the mips16, we have to
12182    decide whether we are using an extended opcode or not.  */
12183
12184 int
12185 md_estimate_size_before_relax (fragp, segtype)
12186      fragS *fragp;
12187      asection *segtype;
12188 {
12189   int change = 0;
12190   boolean linkonce = false;
12191
12192   if (RELAX_MIPS16_P (fragp->fr_subtype))
12193     /* We don't want to modify the EXTENDED bit here; it might get us
12194        into infinite loops.  We change it only in mips_relax_frag().  */
12195     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
12196
12197   if (mips_pic == NO_PIC)
12198     {
12199       change = nopic_need_relax (fragp->fr_symbol, 0);
12200     }
12201   else if (mips_pic == SVR4_PIC)
12202     {
12203       symbolS *sym;
12204       asection *symsec;
12205
12206       sym = fragp->fr_symbol;
12207
12208       /* Handle the case of a symbol equated to another symbol.  */
12209       while (symbol_equated_reloc_p (sym))
12210         {
12211           symbolS *n;
12212
12213           /* It's possible to get a loop here in a badly written
12214              program.  */
12215           n = symbol_get_value_expression (sym)->X_add_symbol;
12216           if (n == sym)
12217             break;
12218           sym = n;
12219         }
12220
12221       symsec = S_GET_SEGMENT (sym);
12222
12223       /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
12224       if (symsec != segtype && ! S_IS_LOCAL (sym))
12225         {
12226           if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
12227               != 0)
12228             linkonce = true;
12229
12230           /* The GNU toolchain uses an extension for ELF: a section
12231              beginning with the magic string .gnu.linkonce is a linkonce
12232              section.  */
12233           if (strncmp (segment_name (symsec), ".gnu.linkonce",
12234                        sizeof ".gnu.linkonce" - 1) == 0)
12235             linkonce = true;
12236         }
12237
12238       /* This must duplicate the test in adjust_reloc_syms.  */
12239       change = (symsec != &bfd_und_section
12240                 && symsec != &bfd_abs_section
12241                 && ! bfd_is_com_section (symsec)
12242                 && !linkonce
12243 #ifdef OBJ_ELF
12244                 /* A global or weak symbol is treated as external.  */
12245                 && (OUTPUT_FLAVOR != bfd_target_elf_flavour
12246                     || (! S_IS_WEAK (sym)
12247                         && (! S_IS_EXTERN (sym) || mips_pic == EMBEDDED_PIC)))
12248 #endif
12249                 );
12250     }
12251   else
12252     abort ();
12253
12254   if (change)
12255     {
12256       /* Record the offset to the first reloc in the fr_opcode field.
12257          This lets md_convert_frag and tc_gen_reloc know that the code
12258          must be expanded.  */
12259       fragp->fr_opcode = (fragp->fr_literal
12260                           + fragp->fr_fix
12261                           - RELAX_OLD (fragp->fr_subtype)
12262                           + RELAX_RELOC1 (fragp->fr_subtype));
12263       /* FIXME: This really needs as_warn_where.  */
12264       if (RELAX_WARN (fragp->fr_subtype))
12265         as_warn (_("AT used after \".set noat\" or macro used after "
12266                    "\".set nomacro\""));
12267
12268       return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
12269     }
12270
12271   return 0;
12272 }
12273
12274 /* This is called to see whether a reloc against a defined symbol
12275    should be converted into a reloc against a section.  Don't adjust
12276    MIPS16 jump relocations, so we don't have to worry about the format
12277    of the offset in the .o file.  Don't adjust relocations against
12278    mips16 symbols, so that the linker can find them if it needs to set
12279    up a stub.  */
12280
12281 int
12282 mips_fix_adjustable (fixp)
12283      fixS *fixp;
12284 {
12285 #ifdef OBJ_ELF
12286   /* Prevent all adjustments to global symbols.  */
12287   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
12288       && mips_pic != EMBEDDED_PIC
12289       && (S_IS_EXTERN (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)))
12290     return 0;
12291 #endif
12292   if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
12293     return 0;
12294   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12295       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
12296     return 0;
12297   if (fixp->fx_addsy == NULL)
12298     return 1;
12299 #ifdef OBJ_ELF
12300   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
12301       && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
12302       && fixp->fx_subsy == NULL)
12303     return 0;
12304 #endif
12305   return 1;
12306 }
12307
12308 /* Translate internal representation of relocation info to BFD target
12309    format.  */
12310
12311 arelent **
12312 tc_gen_reloc (section, fixp)
12313      asection *section ATTRIBUTE_UNUSED;
12314      fixS *fixp;
12315 {
12316   static arelent *retval[4];
12317   arelent *reloc;
12318   bfd_reloc_code_real_type code;
12319
12320   reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
12321   retval[1] = NULL;
12322
12323   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
12324   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
12325   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
12326
12327   if (mips_pic == EMBEDDED_PIC
12328       && SWITCH_TABLE (fixp))
12329     {
12330       /* For a switch table entry we use a special reloc.  The addend
12331          is actually the difference between the reloc address and the
12332          subtrahend.  */
12333       reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
12334       if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
12335         as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
12336       fixp->fx_r_type = BFD_RELOC_GPREL32;
12337     }
12338   else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
12339     {
12340       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
12341         reloc->addend = fixp->fx_addnumber;
12342       else
12343         {
12344           /* We use a special addend for an internal RELLO reloc.  */
12345           if (symbol_section_p (fixp->fx_addsy))
12346             reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
12347           else
12348             reloc->addend = fixp->fx_addnumber + reloc->address;
12349         }
12350     }
12351   else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
12352     {
12353       assert (fixp->fx_next != NULL
12354               && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
12355
12356       /* The reloc is relative to the RELLO; adjust the addend
12357          accordingly.  */
12358       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
12359         reloc->addend = fixp->fx_next->fx_addnumber;
12360       else
12361         {
12362           /* We use a special addend for an internal RELHI reloc.  */
12363           if (symbol_section_p (fixp->fx_addsy))
12364             reloc->addend = (fixp->fx_next->fx_frag->fr_address
12365                              + fixp->fx_next->fx_where
12366                              - S_GET_VALUE (fixp->fx_subsy));
12367           else
12368             reloc->addend = (fixp->fx_addnumber
12369                              + fixp->fx_next->fx_frag->fr_address
12370                              + fixp->fx_next->fx_where);
12371         }
12372     }
12373   else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
12374     reloc->addend = fixp->fx_addnumber;
12375   else
12376     {
12377       if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
12378         /* A gruesome hack which is a result of the gruesome gas reloc
12379            handling.  */
12380         reloc->addend = reloc->address;
12381       else
12382         reloc->addend = -reloc->address;
12383     }
12384
12385   /* If this is a variant frag, we may need to adjust the existing
12386      reloc and generate a new one.  */
12387   if (fixp->fx_frag->fr_opcode != NULL
12388       && (fixp->fx_r_type == BFD_RELOC_GPREL16
12389           || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
12390           || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16
12391           || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
12392           || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16
12393           || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
12394           || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_LO16)
12395       && ! HAVE_NEWABI)
12396     {
12397       arelent *reloc2;
12398
12399       assert (! RELAX_MIPS16_P (fixp->fx_frag->fr_subtype));
12400
12401       /* If this is not the last reloc in this frag, then we have two
12402          GPREL relocs, or a GOT_HI16/GOT_LO16 pair, or a
12403          CALL_HI16/CALL_LO16, both of which are being replaced.  Let
12404          the second one handle all of them.  */
12405       if (fixp->fx_next != NULL
12406           && fixp->fx_frag == fixp->fx_next->fx_frag)
12407         {
12408           assert ((fixp->fx_r_type == BFD_RELOC_GPREL16
12409                    && fixp->fx_next->fx_r_type == BFD_RELOC_GPREL16)
12410                   || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
12411                       && (fixp->fx_next->fx_r_type
12412                           == BFD_RELOC_MIPS_GOT_LO16))
12413                   || (fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
12414                       && (fixp->fx_next->fx_r_type
12415                           == BFD_RELOC_MIPS_CALL_LO16)));
12416           retval[0] = NULL;
12417           return retval;
12418         }
12419
12420       fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
12421       reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
12422       reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
12423       retval[2] = NULL;
12424       reloc2->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
12425       *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
12426       reloc2->address = (reloc->address
12427                          + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
12428                             - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
12429       reloc2->addend = fixp->fx_addnumber;
12430       reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
12431       assert (reloc2->howto != NULL);
12432
12433       if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
12434         {
12435           arelent *reloc3;
12436
12437           reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
12438           retval[3] = NULL;
12439           *reloc3 = *reloc2;
12440           reloc3->address += 4;
12441         }
12442
12443       if (mips_pic == NO_PIC)
12444         {
12445           assert (fixp->fx_r_type == BFD_RELOC_GPREL16);
12446           fixp->fx_r_type = BFD_RELOC_HI16_S;
12447         }
12448       else if (mips_pic == SVR4_PIC)
12449         {
12450           switch (fixp->fx_r_type)
12451             {
12452             default:
12453               abort ();
12454             case BFD_RELOC_MIPS_GOT16:
12455               break;
12456             case BFD_RELOC_MIPS_CALL16:
12457             case BFD_RELOC_MIPS_GOT_LO16:
12458             case BFD_RELOC_MIPS_CALL_LO16:
12459               fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
12460               break;
12461             }
12462         }
12463       else
12464         abort ();
12465     }
12466
12467   /* Since MIPS ELF uses Rel instead of Rela, encode the vtable entry
12468      to be used in the relocation's section offset.  */
12469   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
12470     {
12471       reloc->address = reloc->addend;
12472       reloc->addend = 0;
12473     }
12474
12475   /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
12476      fixup_segment converted a non-PC relative reloc into a PC
12477      relative reloc.  In such a case, we need to convert the reloc
12478      code.  */
12479   code = fixp->fx_r_type;
12480   if (fixp->fx_pcrel)
12481     {
12482       switch (code)
12483         {
12484         case BFD_RELOC_8:
12485           code = BFD_RELOC_8_PCREL;
12486           break;
12487         case BFD_RELOC_16:
12488           code = BFD_RELOC_16_PCREL;
12489           break;
12490         case BFD_RELOC_32:
12491           code = BFD_RELOC_32_PCREL;
12492           break;
12493         case BFD_RELOC_64:
12494           code = BFD_RELOC_64_PCREL;
12495           break;
12496         case BFD_RELOC_8_PCREL:
12497         case BFD_RELOC_16_PCREL:
12498         case BFD_RELOC_32_PCREL:
12499         case BFD_RELOC_64_PCREL:
12500         case BFD_RELOC_16_PCREL_S2:
12501         case BFD_RELOC_PCREL_HI16_S:
12502         case BFD_RELOC_PCREL_LO16:
12503           break;
12504         default:
12505           as_bad_where (fixp->fx_file, fixp->fx_line,
12506                         _("Cannot make %s relocation PC relative"),
12507                         bfd_get_reloc_code_name (code));
12508         }
12509     }
12510
12511 #ifdef OBJ_ELF
12512   /* md_apply_fix3 has a double-subtraction hack to get
12513      bfd_install_relocation to behave nicely.  GPREL relocations are
12514      handled correctly without this hack, so undo it here.  We can't
12515      stop md_apply_fix3 from subtracting twice in the first place since
12516      the fake addend is required for variant frags above.  */
12517   if (fixp->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour
12518       && code == BFD_RELOC_GPREL16
12519       && reloc->addend != 0
12520       && mips_need_elf_addend_fixup (fixp))
12521     reloc->addend += S_GET_VALUE (fixp->fx_addsy);
12522 #endif
12523
12524   /* To support a PC relative reloc when generating embedded PIC code
12525      for ECOFF, we use a Cygnus extension.  We check for that here to
12526      make sure that we don't let such a reloc escape normally.  */
12527   if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
12528        || OUTPUT_FLAVOR == bfd_target_elf_flavour)
12529       && code == BFD_RELOC_16_PCREL_S2
12530       && mips_pic != EMBEDDED_PIC)
12531     reloc->howto = NULL;
12532   else
12533     reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
12534
12535   if (reloc->howto == NULL)
12536     {
12537       as_bad_where (fixp->fx_file, fixp->fx_line,
12538                     _("Can not represent %s relocation in this object file format"),
12539                     bfd_get_reloc_code_name (code));
12540       retval[0] = NULL;
12541     }
12542
12543   return retval;
12544 }
12545
12546 /* Relax a machine dependent frag.  This returns the amount by which
12547    the current size of the frag should change.  */
12548
12549 int
12550 mips_relax_frag (fragp, stretch)
12551      fragS *fragp;
12552      long stretch;
12553 {
12554   if (! RELAX_MIPS16_P (fragp->fr_subtype))
12555     return 0;
12556
12557   if (mips16_extended_frag (fragp, NULL, stretch))
12558     {
12559       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12560         return 0;
12561       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
12562       return 2;
12563     }
12564   else
12565     {
12566       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12567         return 0;
12568       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
12569       return -2;
12570     }
12571
12572   return 0;
12573 }
12574
12575 /* Convert a machine dependent frag.  */
12576
12577 void
12578 md_convert_frag (abfd, asec, fragp)
12579      bfd *abfd ATTRIBUTE_UNUSED;
12580      segT asec;
12581      fragS *fragp;
12582 {
12583   int old, new;
12584   char *fixptr;
12585
12586   if (RELAX_MIPS16_P (fragp->fr_subtype))
12587     {
12588       int type;
12589       register const struct mips16_immed_operand *op;
12590       boolean small, ext;
12591       offsetT val;
12592       bfd_byte *buf;
12593       unsigned long insn;
12594       boolean use_extend;
12595       unsigned short extend;
12596
12597       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12598       op = mips16_immed_operands;
12599       while (op->type != type)
12600         ++op;
12601
12602       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12603         {
12604           small = false;
12605           ext = true;
12606         }
12607       else
12608         {
12609           small = true;
12610           ext = false;
12611         }
12612
12613       resolve_symbol_value (fragp->fr_symbol);
12614       val = S_GET_VALUE (fragp->fr_symbol);
12615       if (op->pcrel)
12616         {
12617           addressT addr;
12618
12619           addr = fragp->fr_address + fragp->fr_fix;
12620
12621           /* The rules for the base address of a PC relative reloc are
12622              complicated; see mips16_extended_frag.  */
12623           if (type == 'p' || type == 'q')
12624             {
12625               addr += 2;
12626               if (ext)
12627                 addr += 2;
12628               /* Ignore the low bit in the target, since it will be
12629                  set for a text label.  */
12630               if ((val & 1) != 0)
12631                 --val;
12632             }
12633           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
12634             addr -= 4;
12635           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
12636             addr -= 2;
12637
12638           addr &= ~ (addressT) ((1 << op->shift) - 1);
12639           val -= addr;
12640
12641           /* Make sure the section winds up with the alignment we have
12642              assumed.  */
12643           if (op->shift > 0)
12644             record_alignment (asec, op->shift);
12645         }
12646
12647       if (ext
12648           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
12649               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
12650         as_warn_where (fragp->fr_file, fragp->fr_line,
12651                        _("extended instruction in delay slot"));
12652
12653       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
12654
12655       if (target_big_endian)
12656         insn = bfd_getb16 (buf);
12657       else
12658         insn = bfd_getl16 (buf);
12659
12660       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
12661                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
12662                     small, ext, &insn, &use_extend, &extend);
12663
12664       if (use_extend)
12665         {
12666           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
12667           fragp->fr_fix += 2;
12668           buf += 2;
12669         }
12670
12671       md_number_to_chars ((char *) buf, insn, 2);
12672       fragp->fr_fix += 2;
12673       buf += 2;
12674     }
12675   else
12676     {
12677       if (fragp->fr_opcode == NULL)
12678         return;
12679
12680       old = RELAX_OLD (fragp->fr_subtype);
12681       new = RELAX_NEW (fragp->fr_subtype);
12682       fixptr = fragp->fr_literal + fragp->fr_fix;
12683
12684       if (new > 0)
12685         memcpy (fixptr - old, fixptr, new);
12686
12687       fragp->fr_fix += new - old;
12688     }
12689 }
12690
12691 #ifdef OBJ_ELF
12692
12693 /* This function is called after the relocs have been generated.
12694    We've been storing mips16 text labels as odd.  Here we convert them
12695    back to even for the convenience of the debugger.  */
12696
12697 void
12698 mips_frob_file_after_relocs ()
12699 {
12700   asymbol **syms;
12701   unsigned int count, i;
12702
12703   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
12704     return;
12705
12706   syms = bfd_get_outsymbols (stdoutput);
12707   count = bfd_get_symcount (stdoutput);
12708   for (i = 0; i < count; i++, syms++)
12709     {
12710       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
12711           && ((*syms)->value & 1) != 0)
12712         {
12713           (*syms)->value &= ~1;
12714           /* If the symbol has an odd size, it was probably computed
12715              incorrectly, so adjust that as well.  */
12716           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
12717             ++elf_symbol (*syms)->internal_elf_sym.st_size;
12718         }
12719     }
12720 }
12721
12722 #endif
12723
12724 /* This function is called whenever a label is defined.  It is used
12725    when handling branch delays; if a branch has a label, we assume we
12726    can not move it.  */
12727
12728 void
12729 mips_define_label (sym)
12730      symbolS *sym;
12731 {
12732   struct insn_label_list *l;
12733
12734   if (free_insn_labels == NULL)
12735     l = (struct insn_label_list *) xmalloc (sizeof *l);
12736   else
12737     {
12738       l = free_insn_labels;
12739       free_insn_labels = l->next;
12740     }
12741
12742   l->label = sym;
12743   l->next = insn_labels;
12744   insn_labels = l;
12745 }
12746 \f
12747 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
12748
12749 /* Some special processing for a MIPS ELF file.  */
12750
12751 void
12752 mips_elf_final_processing ()
12753 {
12754   /* Write out the register information.  */
12755   if (! HAVE_NEWABI)
12756     {
12757       Elf32_RegInfo s;
12758
12759       s.ri_gprmask = mips_gprmask;
12760       s.ri_cprmask[0] = mips_cprmask[0];
12761       s.ri_cprmask[1] = mips_cprmask[1];
12762       s.ri_cprmask[2] = mips_cprmask[2];
12763       s.ri_cprmask[3] = mips_cprmask[3];
12764       /* The gp_value field is set by the MIPS ELF backend.  */
12765
12766       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
12767                                        ((Elf32_External_RegInfo *)
12768                                         mips_regmask_frag));
12769     }
12770   else
12771     {
12772       Elf64_Internal_RegInfo s;
12773
12774       s.ri_gprmask = mips_gprmask;
12775       s.ri_pad = 0;
12776       s.ri_cprmask[0] = mips_cprmask[0];
12777       s.ri_cprmask[1] = mips_cprmask[1];
12778       s.ri_cprmask[2] = mips_cprmask[2];
12779       s.ri_cprmask[3] = mips_cprmask[3];
12780       /* The gp_value field is set by the MIPS ELF backend.  */
12781
12782       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
12783                                        ((Elf64_External_RegInfo *)
12784                                         mips_regmask_frag));
12785     }
12786
12787   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
12788      sort of BFD interface for this.  */
12789   if (mips_any_noreorder)
12790     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
12791   if (mips_pic != NO_PIC)
12792     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
12793
12794   /* Set MIPS ELF flags for ASEs. */
12795 #if 0 /* XXX FIXME */
12796   if (file_ase_mips3d)
12797     elf_elfheader (stdoutput)->e_flags |= ???;
12798 #endif
12799
12800   /* Set the MIPS ELF ABI flags.  */
12801   if (file_mips_abi == NO_ABI)
12802     ;
12803   else if (file_mips_abi == O32_ABI)
12804     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
12805   else if (file_mips_abi == O64_ABI)
12806     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
12807   else if (file_mips_abi == EABI_ABI)
12808     {
12809       if (mips_eabi64)
12810         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
12811       else
12812         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
12813     }
12814   else if (file_mips_abi == N32_ABI)
12815     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
12816
12817   /* Nothing to do for "64".  */
12818
12819   if (mips_32bitmode)
12820     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
12821 }
12822
12823 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
12824 \f
12825 typedef struct proc {
12826   symbolS *isym;
12827   unsigned long reg_mask;
12828   unsigned long reg_offset;
12829   unsigned long fpreg_mask;
12830   unsigned long fpreg_offset;
12831   unsigned long frame_offset;
12832   unsigned long frame_reg;
12833   unsigned long pc_reg;
12834 } procS;
12835
12836 static procS cur_proc;
12837 static procS *cur_proc_ptr;
12838 static int numprocs;
12839
12840 /* Fill in an rs_align_code fragment.  */
12841
12842 void
12843 mips_handle_align (fragp)
12844      fragS *fragp;
12845 {
12846   if (fragp->fr_type != rs_align_code)
12847     return;
12848
12849   if (mips_opts.mips16)
12850     {
12851       static const unsigned char be_nop[] = { 0x65, 0x00 };
12852       static const unsigned char le_nop[] = { 0x00, 0x65 };
12853
12854       int bytes;
12855       char *p;
12856
12857       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
12858       p = fragp->fr_literal + fragp->fr_fix;
12859
12860       if (bytes & 1)
12861         {
12862           *p++ = 0;
12863           fragp->fr_fix += 1;
12864         }
12865
12866       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
12867       fragp->fr_var = 2;
12868     }
12869
12870   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
12871 }
12872
12873 static void
12874 md_obj_begin ()
12875 {
12876 }
12877
12878 static void
12879 md_obj_end ()
12880 {
12881   /* check for premature end, nesting errors, etc */
12882   if (cur_proc_ptr)
12883     as_warn (_("missing .end at end of assembly"));
12884 }
12885
12886 static long
12887 get_number ()
12888 {
12889   int negative = 0;
12890   long val = 0;
12891
12892   if (*input_line_pointer == '-')
12893     {
12894       ++input_line_pointer;
12895       negative = 1;
12896     }
12897   if (!ISDIGIT (*input_line_pointer))
12898     as_bad (_("expected simple number"));
12899   if (input_line_pointer[0] == '0')
12900     {
12901       if (input_line_pointer[1] == 'x')
12902         {
12903           input_line_pointer += 2;
12904           while (ISXDIGIT (*input_line_pointer))
12905             {
12906               val <<= 4;
12907               val |= hex_value (*input_line_pointer++);
12908             }
12909           return negative ? -val : val;
12910         }
12911       else
12912         {
12913           ++input_line_pointer;
12914           while (ISDIGIT (*input_line_pointer))
12915             {
12916               val <<= 3;
12917               val |= *input_line_pointer++ - '0';
12918             }
12919           return negative ? -val : val;
12920         }
12921     }
12922   if (!ISDIGIT (*input_line_pointer))
12923     {
12924       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
12925               *input_line_pointer, *input_line_pointer);
12926       as_warn (_("invalid number"));
12927       return -1;
12928     }
12929   while (ISDIGIT (*input_line_pointer))
12930     {
12931       val *= 10;
12932       val += *input_line_pointer++ - '0';
12933     }
12934   return negative ? -val : val;
12935 }
12936
12937 /* The .file directive; just like the usual .file directive, but there
12938    is an initial number which is the ECOFF file index.  */
12939
12940 static void
12941 s_file (x)
12942      int x ATTRIBUTE_UNUSED;
12943 {
12944   get_number ();
12945   s_app_file (0);
12946 }
12947
12948 /* The .end directive.  */
12949
12950 static void
12951 s_mips_end (x)
12952      int x ATTRIBUTE_UNUSED;
12953 {
12954   symbolS *p;
12955   int maybe_text;
12956
12957   /* Following functions need their own .frame and .cprestore directives.  */
12958   mips_frame_reg_valid = 0;
12959   mips_cprestore_valid = 0;
12960
12961   if (!is_end_of_line[(unsigned char) *input_line_pointer])
12962     {
12963       p = get_symbol ();
12964       demand_empty_rest_of_line ();
12965     }
12966   else
12967     p = NULL;
12968
12969 #ifdef BFD_ASSEMBLER
12970   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
12971     maybe_text = 1;
12972   else
12973     maybe_text = 0;
12974 #else
12975   if (now_seg != data_section && now_seg != bss_section)
12976     maybe_text = 1;
12977   else
12978     maybe_text = 0;
12979 #endif
12980
12981   if (!maybe_text)
12982     as_warn (_(".end not in text section"));
12983
12984   if (!cur_proc_ptr)
12985     {
12986       as_warn (_(".end directive without a preceding .ent directive."));
12987       demand_empty_rest_of_line ();
12988       return;
12989     }
12990
12991   if (p != NULL)
12992     {
12993       assert (S_GET_NAME (p));
12994       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
12995         as_warn (_(".end symbol does not match .ent symbol."));
12996     }
12997   else
12998     as_warn (_(".end directive missing or unknown symbol"));
12999
13000 #ifdef MIPS_STABS_ELF
13001   {
13002     segT saved_seg = now_seg;
13003     subsegT saved_subseg = now_subseg;
13004     valueT dot;
13005     expressionS exp;
13006     char *fragp;
13007
13008     dot = frag_now_fix ();
13009
13010 #ifdef md_flush_pending_output
13011     md_flush_pending_output ();
13012 #endif
13013
13014     assert (pdr_seg);
13015     subseg_set (pdr_seg, 0);
13016
13017     /* Write the symbol.  */
13018     exp.X_op = O_symbol;
13019     exp.X_add_symbol = p;
13020     exp.X_add_number = 0;
13021     emit_expr (&exp, 4);
13022
13023     fragp = frag_more (7 * 4);
13024
13025     md_number_to_chars (fragp,      (valueT) cur_proc_ptr->reg_mask, 4);
13026     md_number_to_chars (fragp +  4, (valueT) cur_proc_ptr->reg_offset, 4);
13027     md_number_to_chars (fragp +  8, (valueT) cur_proc_ptr->fpreg_mask, 4);
13028     md_number_to_chars (fragp + 12, (valueT) cur_proc_ptr->fpreg_offset, 4);
13029     md_number_to_chars (fragp + 16, (valueT) cur_proc_ptr->frame_offset, 4);
13030     md_number_to_chars (fragp + 20, (valueT) cur_proc_ptr->frame_reg, 4);
13031     md_number_to_chars (fragp + 24, (valueT) cur_proc_ptr->pc_reg, 4);
13032
13033     subseg_set (saved_seg, saved_subseg);
13034   }
13035 #endif
13036
13037   cur_proc_ptr = NULL;
13038 }
13039
13040 /* The .aent and .ent directives.  */
13041
13042 static void
13043 s_mips_ent (aent)
13044      int aent;
13045 {
13046   symbolS *symbolP;
13047   int maybe_text;
13048
13049   symbolP = get_symbol ();
13050   if (*input_line_pointer == ',')
13051     input_line_pointer++;
13052   SKIP_WHITESPACE ();
13053   if (ISDIGIT (*input_line_pointer)
13054       || *input_line_pointer == '-')
13055     get_number ();
13056
13057 #ifdef BFD_ASSEMBLER
13058   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
13059     maybe_text = 1;
13060   else
13061     maybe_text = 0;
13062 #else
13063   if (now_seg != data_section && now_seg != bss_section)
13064     maybe_text = 1;
13065   else
13066     maybe_text = 0;
13067 #endif
13068
13069   if (!maybe_text)
13070     as_warn (_(".ent or .aent not in text section."));
13071
13072   if (!aent && cur_proc_ptr)
13073     as_warn (_("missing .end"));
13074
13075   if (!aent)
13076     {
13077       /* This function needs its own .frame and .cprestore directives.  */
13078       mips_frame_reg_valid = 0;
13079       mips_cprestore_valid = 0;
13080
13081       cur_proc_ptr = &cur_proc;
13082       memset (cur_proc_ptr, '\0', sizeof (procS));
13083
13084       cur_proc_ptr->isym = symbolP;
13085
13086       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
13087
13088       numprocs++;
13089     }
13090
13091   demand_empty_rest_of_line ();
13092 }
13093
13094 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
13095    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
13096    s_mips_frame is used so that we can set the PDR information correctly.
13097    We can't use the ecoff routines because they make reference to the ecoff
13098    symbol table (in the mdebug section).  */
13099
13100 static void
13101 s_mips_frame (ignore)
13102      int ignore ATTRIBUTE_UNUSED;
13103 {
13104 #ifdef MIPS_STABS_ELF
13105
13106   long val;
13107
13108   if (cur_proc_ptr == (procS *) NULL)
13109     {
13110       as_warn (_(".frame outside of .ent"));
13111       demand_empty_rest_of_line ();
13112       return;
13113     }
13114
13115   cur_proc_ptr->frame_reg = tc_get_register (1);
13116
13117   SKIP_WHITESPACE ();
13118   if (*input_line_pointer++ != ','
13119       || get_absolute_expression_and_terminator (&val) != ',')
13120     {
13121       as_warn (_("Bad .frame directive"));
13122       --input_line_pointer;
13123       demand_empty_rest_of_line ();
13124       return;
13125     }
13126
13127   cur_proc_ptr->frame_offset = val;
13128   cur_proc_ptr->pc_reg = tc_get_register (0);
13129
13130   demand_empty_rest_of_line ();
13131 #else
13132   s_ignore (ignore);
13133 #endif /* MIPS_STABS_ELF */
13134 }
13135
13136 /* The .fmask and .mask directives. If the mdebug section is present
13137    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
13138    embedded targets, s_mips_mask is used so that we can set the PDR
13139    information correctly. We can't use the ecoff routines because they
13140    make reference to the ecoff symbol table (in the mdebug section).  */
13141
13142 static void
13143 s_mips_mask (reg_type)
13144      char reg_type;
13145 {
13146 #ifdef MIPS_STABS_ELF
13147   long mask, off;
13148
13149   if (cur_proc_ptr == (procS *) NULL)
13150     {
13151       as_warn (_(".mask/.fmask outside of .ent"));
13152       demand_empty_rest_of_line ();
13153       return;
13154     }
13155
13156   if (get_absolute_expression_and_terminator (&mask) != ',')
13157     {
13158       as_warn (_("Bad .mask/.fmask directive"));
13159       --input_line_pointer;
13160       demand_empty_rest_of_line ();
13161       return;
13162     }
13163
13164   off = get_absolute_expression ();
13165
13166   if (reg_type == 'F')
13167     {
13168       cur_proc_ptr->fpreg_mask = mask;
13169       cur_proc_ptr->fpreg_offset = off;
13170     }
13171   else
13172     {
13173       cur_proc_ptr->reg_mask = mask;
13174       cur_proc_ptr->reg_offset = off;
13175     }
13176
13177   demand_empty_rest_of_line ();
13178 #else
13179   s_ignore (reg_type);
13180 #endif /* MIPS_STABS_ELF */
13181 }
13182
13183 /* The .loc directive.  */
13184
13185 #if 0
13186 static void
13187 s_loc (x)
13188      int x;
13189 {
13190   symbolS *symbolP;
13191   int lineno;
13192   int addroff;
13193
13194   assert (now_seg == text_section);
13195
13196   lineno = get_number ();
13197   addroff = frag_now_fix ();
13198
13199   symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
13200   S_SET_TYPE (symbolP, N_SLINE);
13201   S_SET_OTHER (symbolP, 0);
13202   S_SET_DESC (symbolP, lineno);
13203   symbolP->sy_segment = now_seg;
13204 }
13205 #endif
13206
13207 /* CPU name/ISA/number mapping table.
13208
13209    Entries are grouped by type.  The first matching CPU or ISA entry
13210    gets chosen by CPU or ISA, so it should be the 'canonical' name
13211    for that type.  Entries after that within the type are sorted
13212    alphabetically.
13213
13214    Case is ignored in comparison, so put the canonical entry in the
13215    appropriate case but everything else in lower case to ease eye pain.  */
13216 static const struct mips_cpu_info mips_cpu_info_table[] =
13217 {
13218   /* MIPS1 ISA */
13219   { "MIPS1",          1,      ISA_MIPS1,      CPU_R3000, },
13220   { "mips",           1,      ISA_MIPS1,      CPU_R3000, },
13221
13222   /* MIPS2 ISA */
13223   { "MIPS2",          1,      ISA_MIPS2,      CPU_R6000, },
13224
13225   /* MIPS3 ISA */
13226   { "MIPS3",          1,      ISA_MIPS3,      CPU_R4000, },
13227
13228   /* MIPS4 ISA */
13229   { "MIPS4",          1,      ISA_MIPS4,      CPU_R8000, },
13230
13231   /* MIPS5 ISA */
13232   { "MIPS5",          1,      ISA_MIPS5,      CPU_MIPS5, },
13233   { "Generic-MIPS5",  0,      ISA_MIPS5,      CPU_MIPS5, },
13234
13235   /* MIPS32 ISA */
13236   { "MIPS32",         1,      ISA_MIPS32,     CPU_MIPS32, },
13237   { "mipsisa32",      0,      ISA_MIPS32,     CPU_MIPS32, },
13238   { "Generic-MIPS32", 0,      ISA_MIPS32,     CPU_MIPS32, },
13239   { "4kc",            0,      ISA_MIPS32,     CPU_MIPS32, },
13240   { "4km",            0,      ISA_MIPS32,     CPU_MIPS32, },
13241   { "4kp",            0,      ISA_MIPS32,     CPU_MIPS32, },
13242
13243   /* For historical reasons.  */
13244   { "MIPS64",         1,      ISA_MIPS3,      CPU_R4000, },
13245
13246   /* MIPS64 ISA */
13247   { "mipsisa64",      1,      ISA_MIPS64,     CPU_MIPS64, },
13248   { "Generic-MIPS64", 0,      ISA_MIPS64,     CPU_MIPS64, },
13249   { "5kc",            0,      ISA_MIPS64,     CPU_MIPS64, },
13250   { "20kc",           0,      ISA_MIPS64,     CPU_MIPS64, },
13251
13252   /* R2000 CPU */
13253   { "R2000",          0,      ISA_MIPS1,      CPU_R2000, },
13254   { "2000",           0,      ISA_MIPS1,      CPU_R2000, },
13255   { "2k",             0,      ISA_MIPS1,      CPU_R2000, },
13256   { "r2k",            0,      ISA_MIPS1,      CPU_R2000, },
13257
13258   /* R3000 CPU */
13259   { "R3000",          0,      ISA_MIPS1,      CPU_R3000, },
13260   { "3000",           0,      ISA_MIPS1,      CPU_R3000, },
13261   { "3k",             0,      ISA_MIPS1,      CPU_R3000, },
13262   { "r3k",            0,      ISA_MIPS1,      CPU_R3000, },
13263
13264   /* TX3900 CPU */
13265   { "R3900",          0,      ISA_MIPS1,      CPU_R3900, },
13266   { "3900",           0,      ISA_MIPS1,      CPU_R3900, },
13267   { "mipstx39",       0,      ISA_MIPS1,      CPU_R3900, },
13268
13269   /* R4000 CPU */
13270   { "R4000",          0,      ISA_MIPS3,      CPU_R4000, },
13271   { "4000",           0,      ISA_MIPS3,      CPU_R4000, },
13272   { "4k",             0,      ISA_MIPS3,      CPU_R4000, },   /* beware */
13273   { "r4k",            0,      ISA_MIPS3,      CPU_R4000, },
13274
13275   /* R4010 CPU */
13276   { "R4010",          0,      ISA_MIPS2,      CPU_R4010, },
13277   { "4010",           0,      ISA_MIPS2,      CPU_R4010, },
13278
13279   /* R4400 CPU */
13280   { "R4400",          0,      ISA_MIPS3,      CPU_R4400, },
13281   { "4400",           0,      ISA_MIPS3,      CPU_R4400, },
13282
13283   /* R4600 CPU */
13284   { "R4600",          0,      ISA_MIPS3,      CPU_R4600, },
13285   { "4600",           0,      ISA_MIPS3,      CPU_R4600, },
13286   { "mips64orion",    0,      ISA_MIPS3,      CPU_R4600, },
13287   { "orion",          0,      ISA_MIPS3,      CPU_R4600, },
13288
13289   /* R4650 CPU */
13290   { "R4650",          0,      ISA_MIPS3,      CPU_R4650, },
13291   { "4650",           0,      ISA_MIPS3,      CPU_R4650, },
13292
13293   /* R6000 CPU */
13294   { "R6000",          0,      ISA_MIPS2,      CPU_R6000, },
13295   { "6000",           0,      ISA_MIPS2,      CPU_R6000, },
13296   { "6k",             0,      ISA_MIPS2,      CPU_R6000, },
13297   { "r6k",            0,      ISA_MIPS2,      CPU_R6000, },
13298
13299   /* R8000 CPU */
13300   { "R8000",          0,      ISA_MIPS4,      CPU_R8000, },
13301   { "8000",           0,      ISA_MIPS4,      CPU_R8000, },
13302   { "8k",             0,      ISA_MIPS4,      CPU_R8000, },
13303   { "r8k",            0,      ISA_MIPS4,      CPU_R8000, },
13304
13305   /* R10000 CPU */
13306   { "R10000",         0,      ISA_MIPS4,      CPU_R10000, },
13307   { "10000",          0,      ISA_MIPS4,      CPU_R10000, },
13308   { "10k",            0,      ISA_MIPS4,      CPU_R10000, },
13309   { "r10k",           0,      ISA_MIPS4,      CPU_R10000, },
13310
13311   /* R12000 CPU */
13312   { "R12000",         0,      ISA_MIPS4,      CPU_R12000, },
13313   { "12000",          0,      ISA_MIPS4,      CPU_R12000, },
13314   { "12k",            0,      ISA_MIPS4,      CPU_R12000, },
13315   { "r12k",           0,      ISA_MIPS4,      CPU_R12000, },
13316
13317   /* VR4100 CPU */
13318   { "VR4100",         0,      ISA_MIPS3,      CPU_VR4100, },
13319   { "4100",           0,      ISA_MIPS3,      CPU_VR4100, },
13320   { "mips64vr4100",   0,      ISA_MIPS3,      CPU_VR4100, },
13321   { "r4100",          0,      ISA_MIPS3,      CPU_VR4100, },
13322
13323   /* VR4111 CPU */
13324   { "VR4111",         0,      ISA_MIPS3,      CPU_R4111, },
13325   { "4111",           0,      ISA_MIPS3,      CPU_R4111, },
13326   { "mips64vr4111",   0,      ISA_MIPS3,      CPU_R4111, },
13327   { "r4111",          0,      ISA_MIPS3,      CPU_R4111, },
13328
13329   /* VR4300 CPU */
13330   { "VR4300",         0,      ISA_MIPS3,      CPU_R4300, },
13331   { "4300",           0,      ISA_MIPS3,      CPU_R4300, },
13332   { "mips64vr4300",   0,      ISA_MIPS3,      CPU_R4300, },
13333   { "r4300",          0,      ISA_MIPS3,      CPU_R4300, },
13334
13335   /* VR5000 CPU */
13336   { "VR5000",         0,      ISA_MIPS4,      CPU_R5000, },
13337   { "5000",           0,      ISA_MIPS4,      CPU_R5000, },
13338   { "5k",             0,      ISA_MIPS4,      CPU_R5000, },
13339   { "mips64vr5000",   0,      ISA_MIPS4,      CPU_R5000, },
13340   { "r5000",          0,      ISA_MIPS4,      CPU_R5000, },
13341   { "r5200",          0,      ISA_MIPS4,      CPU_R5000, },
13342   { "rm5200",         0,      ISA_MIPS4,      CPU_R5000, },
13343   { "r5230",          0,      ISA_MIPS4,      CPU_R5000, },
13344   { "rm5230",         0,      ISA_MIPS4,      CPU_R5000, },
13345   { "r5231",          0,      ISA_MIPS4,      CPU_R5000, },
13346   { "rm5231",         0,      ISA_MIPS4,      CPU_R5000, },
13347   { "r5261",          0,      ISA_MIPS4,      CPU_R5000, },
13348   { "rm5261",         0,      ISA_MIPS4,      CPU_R5000, },
13349   { "r5721",          0,      ISA_MIPS4,      CPU_R5000, },
13350   { "rm5721",         0,      ISA_MIPS4,      CPU_R5000, },
13351   { "r5k",            0,      ISA_MIPS4,      CPU_R5000, },
13352   { "r7000",          0,      ISA_MIPS4,      CPU_R5000, },
13353
13354   /* Broadcom SB-1 CPU */
13355   { "SB-1",           0,      ISA_MIPS64,     CPU_SB1, },
13356   { "sb-1250",        0,      ISA_MIPS64,     CPU_SB1, },
13357   { "sb1",            0,      ISA_MIPS64,     CPU_SB1, },
13358   { "sb1250",         0,      ISA_MIPS64,     CPU_SB1, },
13359
13360   /* End marker.  */
13361   { NULL, 0, 0, 0, },
13362 };
13363
13364 static const struct mips_cpu_info *
13365 mips_cpu_info_from_name (name)
13366      const char *name;
13367 {
13368   int i;
13369
13370   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
13371     if (strcasecmp (name, mips_cpu_info_table[i].name) == 0)
13372       return (&mips_cpu_info_table[i]);
13373
13374   return NULL;
13375 }
13376
13377 static const struct mips_cpu_info *
13378 mips_cpu_info_from_isa (isa)
13379      int isa;
13380 {
13381   int i;
13382
13383   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
13384     if (mips_cpu_info_table[i].is_isa
13385       && isa == mips_cpu_info_table[i].isa)
13386       return (&mips_cpu_info_table[i]);
13387
13388   return NULL;
13389 }
13390
13391 static const struct mips_cpu_info *
13392 mips_cpu_info_from_cpu (cpu)
13393      int cpu;
13394 {
13395   int i;
13396
13397   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
13398     if (!mips_cpu_info_table[i].is_isa
13399       && cpu == mips_cpu_info_table[i].cpu)
13400       return (&mips_cpu_info_table[i]);
13401
13402   return NULL;
13403 }