* config/tc-mips.c (HAVE_64BIT_ADDRESS_CONSTANTS): New.
[platform/upstream/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
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 #include "dwarf2dbg.h"
41
42 #ifdef DEBUG
43 #define DBG(x) printf x
44 #else
45 #define DBG(x)
46 #endif
47
48 #ifdef OBJ_MAYBE_ELF
49 /* Clean up namespace so we can include obj-elf.h too.  */
50 static int mips_output_flavor PARAMS ((void));
51 static int mips_output_flavor () { return OUTPUT_FLAVOR; }
52 #undef OBJ_PROCESS_STAB
53 #undef OUTPUT_FLAVOR
54 #undef S_GET_ALIGN
55 #undef S_GET_SIZE
56 #undef S_SET_ALIGN
57 #undef S_SET_SIZE
58 #undef obj_frob_file
59 #undef obj_frob_file_after_relocs
60 #undef obj_frob_symbol
61 #undef obj_pop_insert
62 #undef obj_sec_sym_ok_for_reloc
63 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
64
65 #include "obj-elf.h"
66 /* Fix any of them that we actually care about.  */
67 #undef OUTPUT_FLAVOR
68 #define OUTPUT_FLAVOR mips_output_flavor()
69 #endif
70
71 #if defined (OBJ_ELF)
72 #include "elf/mips.h"
73 #endif
74
75 #ifndef ECOFF_DEBUGGING
76 #define NO_ECOFF_DEBUGGING
77 #define ECOFF_DEBUGGING 0
78 #endif
79
80 int mips_flag_mdebug = -1;
81
82 #include "ecoff.h"
83
84 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
85 static char *mips_regmask_frag;
86 #endif
87
88 #define ZERO 0
89 #define AT  1
90 #define TREG 24
91 #define PIC_CALL_REG 25
92 #define KT0 26
93 #define KT1 27
94 #define GP  28
95 #define SP  29
96 #define FP  30
97 #define RA  31
98
99 #define ILLEGAL_REG (32)
100
101 /* Allow override of standard little-endian ECOFF format.  */
102
103 #ifndef ECOFF_LITTLE_FORMAT
104 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
105 #endif
106
107 extern int target_big_endian;
108
109 /* The name of the readonly data section.  */
110 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_aout_flavour \
111                             ? ".data" \
112                             : OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
113                             ? ".rdata" \
114                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
115                             ? ".rdata" \
116                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
117                             ? ".rodata" \
118                             : (abort (), ""))
119
120 /* The ABI to use.  */
121 enum mips_abi_level
122 {
123   NO_ABI = 0,
124   O32_ABI,
125   O64_ABI,
126   N32_ABI,
127   N64_ABI,
128   EABI_ABI
129 };
130
131 /* MIPS ABI we are using for this output file.  */
132 static enum mips_abi_level mips_abi = NO_ABI;
133
134 /* This is the set of options which may be modified by the .set
135    pseudo-op.  We use a struct so that .set push and .set pop are more
136    reliable.  */
137
138 struct mips_set_options
139 {
140   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
141      if it has not been initialized.  Changed by `.set mipsN', and the
142      -mipsN command line option, and the default CPU.  */
143   int isa;
144   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
145      if they have not been initialized.  Changed by `.set <asename>', by
146      command line options, and based on the default architecture.  */
147   int ase_mips3d;
148   int ase_mdmx;
149   /* Whether we are assembling for the mips16 processor.  0 if we are
150      not, 1 if we are, and -1 if the value has not been initialized.
151      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
152      -nomips16 command line options, and the default CPU.  */
153   int mips16;
154   /* Non-zero if we should not reorder instructions.  Changed by `.set
155      reorder' and `.set noreorder'.  */
156   int noreorder;
157   /* Non-zero if we should not permit the $at ($1) register to be used
158      in instructions.  Changed by `.set at' and `.set noat'.  */
159   int noat;
160   /* Non-zero if we should warn when a macro instruction expands into
161      more than one machine instruction.  Changed by `.set nomacro' and
162      `.set macro'.  */
163   int warn_about_macros;
164   /* Non-zero if we should not move instructions.  Changed by `.set
165      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
166   int nomove;
167   /* Non-zero if we should not optimize branches by moving the target
168      of the branch into the delay slot.  Actually, we don't perform
169      this optimization anyhow.  Changed by `.set bopt' and `.set
170      nobopt'.  */
171   int nobopt;
172   /* Non-zero if we should not autoextend mips16 instructions.
173      Changed by `.set autoextend' and `.set noautoextend'.  */
174   int noautoextend;
175   /* Restrict general purpose registers and floating point registers
176      to 32 bit.  This is initially determined when -mgp32 or -mfp32
177      is passed but can changed if the assembler code uses .set mipsN.  */
178   int gp32;
179   int fp32;
180 };
181
182 /* True if -mgp32 was passed.  */
183 static int file_mips_gp32 = -1;
184
185 /* True if -mfp32 was passed.  */
186 static int file_mips_fp32 = -1;
187
188 /* This is the struct we use to hold the current set of options.  Note
189    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
190    -1 to indicate that they have not been initialized.  */
191
192 static struct mips_set_options mips_opts =
193 {
194   ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0
195 };
196
197 /* These variables are filled in with the masks of registers used.
198    The object format code reads them and puts them in the appropriate
199    place.  */
200 unsigned long mips_gprmask;
201 unsigned long mips_cprmask[4];
202
203 /* MIPS ISA we are using for this output file.  */
204 static int file_mips_isa = ISA_UNKNOWN;
205
206 /* True if -mips16 was passed or implied by arguments passed on the
207    command line (e.g., by -march).  */
208 static int file_ase_mips16;
209
210 /* True if -mips3d was passed or implied by arguments passed on the
211    command line (e.g., by -march).  */
212 static int file_ase_mips3d;
213
214 /* True if -mdmx was passed or implied by arguments passed on the
215    command line (e.g., by -march).  */
216 static int file_ase_mdmx;
217
218 /* The argument of the -march= flag.  The architecture we are assembling.  */
219 static int mips_arch = CPU_UNKNOWN;
220 static const char *mips_arch_string;
221 static const struct mips_cpu_info *mips_arch_info;
222
223 /* The argument of the -mtune= flag.  The architecture for which we
224    are optimizing.  */
225 static int mips_tune = CPU_UNKNOWN;
226 static const char *mips_tune_string;
227 static const struct mips_cpu_info *mips_tune_info;
228
229 /* True when generating 32-bit code for a 64-bit processor.  */
230 static int mips_32bitmode = 0;
231
232 /* Some ISA's have delay slots for instructions which read or write
233    from a coprocessor (eg. mips1-mips3); some don't (eg mips4).
234    Return true if instructions marked INSN_LOAD_COPROC_DELAY,
235    INSN_COPROC_MOVE_DELAY, or INSN_WRITE_COND_CODE actually have a
236    delay slot in this ISA.  The uses of this macro assume that any
237    ISA that has delay slots for one of these, has them for all.  They
238    also assume that ISAs which don't have delays for these insns, don't
239    have delays for the INSN_LOAD_MEMORY_DELAY instructions either.  */
240 #define ISA_HAS_COPROC_DELAYS(ISA) (        \
241    (ISA) == ISA_MIPS1                       \
242    || (ISA) == ISA_MIPS2                    \
243    || (ISA) == ISA_MIPS3                    \
244    )
245
246 /* True if the given ABI requires 32-bit registers.  */
247 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
248
249 /* Likewise 64-bit registers.  */
250 #define ABI_NEEDS_64BIT_REGS(ABI) \
251   ((ABI) == N32_ABI               \
252    || (ABI) == N64_ABI            \
253    || (ABI) == O64_ABI)
254
255 /*  Return true if ISA supports 64 bit gp register instructions.  */
256 #define ISA_HAS_64BIT_REGS(ISA) (    \
257    (ISA) == ISA_MIPS3                \
258    || (ISA) == ISA_MIPS4             \
259    || (ISA) == ISA_MIPS5             \
260    || (ISA) == ISA_MIPS64            \
261    )
262
263 /* Return true if ISA supports 64-bit right rotate (dror et al.)
264    instructions.  */
265 #define ISA_HAS_DROR(ISA) (     \
266    0                            \
267    )
268
269 /* Return true if ISA supports 32-bit right rotate (ror et al.)
270    instructions.  */
271 #define ISA_HAS_ROR(ISA) (      \
272    (ISA) == ISA_MIPS32R2        \
273    )
274
275 #define HAVE_32BIT_GPRS                            \
276     (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
277
278 #define HAVE_32BIT_FPRS                            \
279     (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
280
281 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
282 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
283
284 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
285
286 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
287
288 /* We can only have 64bit addresses if the object file format
289    supports it.  */
290 #define HAVE_32BIT_ADDRESSES                           \
291    (HAVE_32BIT_GPRS                                    \
292     || ((bfd_arch_bits_per_address (stdoutput) == 32   \
293          || ! HAVE_64BIT_OBJECTS)                      \
294         && mips_pic != EMBEDDED_PIC))
295
296 #define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
297 #define HAVE_64BIT_ADDRESS_CONSTANTS (HAVE_64BIT_ADDRESSES \
298                                       || HAVE_64BIT_GPRS)
299
300 /* Return true if the given CPU supports the MIPS16 ASE.  */
301 #define CPU_HAS_MIPS16(cpu)                                             \
302    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
303     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
304
305 /* Return true if the given CPU supports the MIPS3D ASE.  */
306 #define CPU_HAS_MIPS3D(cpu)     ((cpu) == CPU_SB1      \
307                                  )
308
309 /* Return true if the given CPU supports the MDMX ASE.  */
310 #define CPU_HAS_MDMX(cpu)       (FALSE                 \
311                                  )
312
313 /* True if CPU has a dror instruction.  */
314 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
315
316 /* True if CPU has a ror instruction.  */
317 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
318
319 /* Whether the processor uses hardware interlocks to protect
320    reads from the HI and LO registers, and thus does not
321    require nops to be inserted.  */
322
323 #define hilo_interlocks (mips_arch == CPU_R4010                       \
324                          || mips_arch == CPU_VR5500                   \
325                          || mips_arch == CPU_SB1                      \
326                          )
327
328 /* Whether the processor uses hardware interlocks to protect reads
329    from the GPRs, and thus does not require nops to be inserted.  */
330 #define gpr_interlocks \
331   (mips_opts.isa != ISA_MIPS1  \
332    || mips_arch == CPU_VR5400  \
333    || mips_arch == CPU_VR5500  \
334    || mips_arch == CPU_R3900)
335
336 /* As with other "interlocks" this is used by hardware that has FP
337    (co-processor) interlocks.  */
338 /* Itbl support may require additional care here.  */
339 #define cop_interlocks (mips_arch == CPU_R4300                        \
340                         || mips_arch == CPU_VR5400                    \
341                         || mips_arch == CPU_VR5500                    \
342                         || mips_arch == CPU_SB1                       \
343                         )
344
345 /* Is this a mfhi or mflo instruction?  */
346 #define MF_HILO_INSN(PINFO) \
347           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
348
349 /* MIPS PIC level.  */
350
351 enum mips_pic_level mips_pic;
352
353 /* Warn about all NOPS that the assembler generates.  */
354 static int warn_nops = 0;
355
356 /* 1 if we should generate 32 bit offsets from the $gp register in
357    SVR4_PIC mode.  Currently has no meaning in other modes.  */
358 static int mips_big_got = 0;
359
360 /* 1 if trap instructions should used for overflow rather than break
361    instructions.  */
362 static int mips_trap = 0;
363
364 /* 1 if double width floating point constants should not be constructed
365    by assembling two single width halves into two single width floating
366    point registers which just happen to alias the double width destination
367    register.  On some architectures this aliasing can be disabled by a bit
368    in the status register, and the setting of this bit cannot be determined
369    automatically at assemble time.  */
370 static int mips_disable_float_construction;
371
372 /* Non-zero if any .set noreorder directives were used.  */
373
374 static int mips_any_noreorder;
375
376 /* Non-zero if nops should be inserted when the register referenced in
377    an mfhi/mflo instruction is read in the next two instructions.  */
378 static int mips_7000_hilo_fix;
379
380 /* The size of the small data section.  */
381 static unsigned int g_switch_value = 8;
382 /* Whether the -G option was used.  */
383 static int g_switch_seen = 0;
384
385 #define N_RMASK 0xc4
386 #define N_VFP   0xd4
387
388 /* If we can determine in advance that GP optimization won't be
389    possible, we can skip the relaxation stuff that tries to produce
390    GP-relative references.  This makes delay slot optimization work
391    better.
392
393    This function can only provide a guess, but it seems to work for
394    gcc output.  It needs to guess right for gcc, otherwise gcc
395    will put what it thinks is a GP-relative instruction in a branch
396    delay slot.
397
398    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
399    fixed it for the non-PIC mode.  KR 95/04/07  */
400 static int nopic_need_relax PARAMS ((symbolS *, int));
401
402 /* handle of the OPCODE hash table */
403 static struct hash_control *op_hash = NULL;
404
405 /* The opcode hash table we use for the mips16.  */
406 static struct hash_control *mips16_op_hash = NULL;
407
408 /* This array holds the chars that always start a comment.  If the
409     pre-processor is disabled, these aren't very useful */
410 const char comment_chars[] = "#";
411
412 /* This array holds the chars that only start a comment at the beginning of
413    a line.  If the line seems to have the form '# 123 filename'
414    .line and .file directives will appear in the pre-processed output */
415 /* Note that input_file.c hand checks for '#' at the beginning of the
416    first line of the input file.  This is because the compiler outputs
417    #NO_APP at the beginning of its output.  */
418 /* Also note that C style comments are always supported.  */
419 const char line_comment_chars[] = "#";
420
421 /* This array holds machine specific line separator characters.  */
422 const char line_separator_chars[] = ";";
423
424 /* Chars that can be used to separate mant from exp in floating point nums */
425 const char EXP_CHARS[] = "eE";
426
427 /* Chars that mean this number is a floating point constant */
428 /* As in 0f12.456 */
429 /* or    0d1.2345e12 */
430 const char FLT_CHARS[] = "rRsSfFdDxXpP";
431
432 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
433    changed in read.c .  Ideally it shouldn't have to know about it at all,
434    but nothing is ideal around here.
435  */
436
437 static char *insn_error;
438
439 static int auto_align = 1;
440
441 /* When outputting SVR4 PIC code, the assembler needs to know the
442    offset in the stack frame from which to restore the $gp register.
443    This is set by the .cprestore pseudo-op, and saved in this
444    variable.  */
445 static offsetT mips_cprestore_offset = -1;
446
447 /* Similiar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
448    more optimizations, it can use a register value instead of a memory-saved
449    offset and even an other register than $gp as global pointer.  */
450 static offsetT mips_cpreturn_offset = -1;
451 static int mips_cpreturn_register = -1;
452 static int mips_gp_register = GP;
453 static int mips_gprel_offset = 0;
454
455 /* Whether mips_cprestore_offset has been set in the current function
456    (or whether it has already been warned about, if not).  */
457 static int mips_cprestore_valid = 0;
458
459 /* This is the register which holds the stack frame, as set by the
460    .frame pseudo-op.  This is needed to implement .cprestore.  */
461 static int mips_frame_reg = SP;
462
463 /* Whether mips_frame_reg has been set in the current function
464    (or whether it has already been warned about, if not).  */
465 static int mips_frame_reg_valid = 0;
466
467 /* To output NOP instructions correctly, we need to keep information
468    about the previous two instructions.  */
469
470 /* Whether we are optimizing.  The default value of 2 means to remove
471    unneeded NOPs and swap branch instructions when possible.  A value
472    of 1 means to not swap branches.  A value of 0 means to always
473    insert NOPs.  */
474 static int mips_optimize = 2;
475
476 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
477    equivalent to seeing no -g option at all.  */
478 static int mips_debug = 0;
479
480 /* The previous instruction.  */
481 static struct mips_cl_insn prev_insn;
482
483 /* The instruction before prev_insn.  */
484 static struct mips_cl_insn prev_prev_insn;
485
486 /* If we don't want information for prev_insn or prev_prev_insn, we
487    point the insn_mo field at this dummy integer.  */
488 static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
489
490 /* Non-zero if prev_insn is valid.  */
491 static int prev_insn_valid;
492
493 /* The frag for the previous instruction.  */
494 static struct frag *prev_insn_frag;
495
496 /* The offset into prev_insn_frag for the previous instruction.  */
497 static long prev_insn_where;
498
499 /* The reloc type for the previous instruction, if any.  */
500 static bfd_reloc_code_real_type prev_insn_reloc_type[3];
501
502 /* The reloc for the previous instruction, if any.  */
503 static fixS *prev_insn_fixp[3];
504
505 /* Non-zero if the previous instruction was in a delay slot.  */
506 static int prev_insn_is_delay_slot;
507
508 /* Non-zero if the previous instruction was in a .set noreorder.  */
509 static int prev_insn_unreordered;
510
511 /* Non-zero if the previous instruction uses an extend opcode (if
512    mips16).  */
513 static int prev_insn_extended;
514
515 /* Non-zero if the previous previous instruction was in a .set
516    noreorder.  */
517 static int prev_prev_insn_unreordered;
518
519 /* If this is set, it points to a frag holding nop instructions which
520    were inserted before the start of a noreorder section.  If those
521    nops turn out to be unnecessary, the size of the frag can be
522    decreased.  */
523 static fragS *prev_nop_frag;
524
525 /* The number of nop instructions we created in prev_nop_frag.  */
526 static int prev_nop_frag_holds;
527
528 /* The number of nop instructions that we know we need in
529    prev_nop_frag.  */
530 static int prev_nop_frag_required;
531
532 /* The number of instructions we've seen since prev_nop_frag.  */
533 static int prev_nop_frag_since;
534
535 /* For ECOFF and ELF, relocations against symbols are done in two
536    parts, with a HI relocation and a LO relocation.  Each relocation
537    has only 16 bits of space to store an addend.  This means that in
538    order for the linker to handle carries correctly, it must be able
539    to locate both the HI and the LO relocation.  This means that the
540    relocations must appear in order in the relocation table.
541
542    In order to implement this, we keep track of each unmatched HI
543    relocation.  We then sort them so that they immediately precede the
544    corresponding LO relocation.  */
545
546 struct mips_hi_fixup
547 {
548   /* Next HI fixup.  */
549   struct mips_hi_fixup *next;
550   /* This fixup.  */
551   fixS *fixp;
552   /* The section this fixup is in.  */
553   segT seg;
554 };
555
556 /* The list of unmatched HI relocs.  */
557
558 static struct mips_hi_fixup *mips_hi_fixup_list;
559
560 /* The frag containing the last explicit relocation operator.
561    Null if explicit relocations have not been used.  */
562
563 static fragS *prev_reloc_op_frag;
564
565 /* Map normal MIPS register numbers to mips16 register numbers.  */
566
567 #define X ILLEGAL_REG
568 static const int mips32_to_16_reg_map[] =
569 {
570   X, X, 2, 3, 4, 5, 6, 7,
571   X, X, X, X, X, X, X, X,
572   0, 1, X, X, X, X, X, X,
573   X, X, X, X, X, X, X, X
574 };
575 #undef X
576
577 /* Map mips16 register numbers to normal MIPS register numbers.  */
578
579 static const unsigned int mips16_to_32_reg_map[] =
580 {
581   16, 17, 2, 3, 4, 5, 6, 7
582 };
583
584 static int mips_fix_4122_bugs;
585
586 /* We don't relax branches by default, since this causes us to expand
587    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
588    fail to compute the offset before expanding the macro to the most
589    efficient expansion.  */
590
591 static int mips_relax_branch;
592 \f
593 /* Since the MIPS does not have multiple forms of PC relative
594    instructions, we do not have to do relaxing as is done on other
595    platforms.  However, we do have to handle GP relative addressing
596    correctly, which turns out to be a similar problem.
597
598    Every macro that refers to a symbol can occur in (at least) two
599    forms, one with GP relative addressing and one without.  For
600    example, loading a global variable into a register generally uses
601    a macro instruction like this:
602      lw $4,i
603    If i can be addressed off the GP register (this is true if it is in
604    the .sbss or .sdata section, or if it is known to be smaller than
605    the -G argument) this will generate the following instruction:
606      lw $4,i($gp)
607    This instruction will use a GPREL reloc.  If i can not be addressed
608    off the GP register, the following instruction sequence will be used:
609      lui $at,i
610      lw $4,i($at)
611    In this case the first instruction will have a HI16 reloc, and the
612    second reloc will have a LO16 reloc.  Both relocs will be against
613    the symbol i.
614
615    The issue here is that we may not know whether i is GP addressable
616    until after we see the instruction that uses it.  Therefore, we
617    want to be able to choose the final instruction sequence only at
618    the end of the assembly.  This is similar to the way other
619    platforms choose the size of a PC relative instruction only at the
620    end of assembly.
621
622    When generating position independent code we do not use GP
623    addressing in quite the same way, but the issue still arises as
624    external symbols and local symbols must be handled differently.
625
626    We handle these issues by actually generating both possible
627    instruction sequences.  The longer one is put in a frag_var with
628    type rs_machine_dependent.  We encode what to do with the frag in
629    the subtype field.  We encode (1) the number of existing bytes to
630    replace, (2) the number of new bytes to use, (3) the offset from
631    the start of the existing bytes to the first reloc we must generate
632    (that is, the offset is applied from the start of the existing
633    bytes after they are replaced by the new bytes, if any), (4) the
634    offset from the start of the existing bytes to the second reloc,
635    (5) whether a third reloc is needed (the third reloc is always four
636    bytes after the second reloc), and (6) whether to warn if this
637    variant is used (this is sometimes needed if .set nomacro or .set
638    noat is in effect).  All these numbers are reasonably small.
639
640    Generating two instruction sequences must be handled carefully to
641    ensure that delay slots are handled correctly.  Fortunately, there
642    are a limited number of cases.  When the second instruction
643    sequence is generated, append_insn is directed to maintain the
644    existing delay slot information, so it continues to apply to any
645    code after the second instruction sequence.  This means that the
646    second instruction sequence must not impose any requirements not
647    required by the first instruction sequence.
648
649    These variant frags are then handled in functions called by the
650    machine independent code.  md_estimate_size_before_relax returns
651    the final size of the frag.  md_convert_frag sets up the final form
652    of the frag.  tc_gen_reloc adjust the first reloc and adds a second
653    one if needed.  */
654 #define RELAX_ENCODE(old, new, reloc1, reloc2, reloc3, warn) \
655   ((relax_substateT) \
656    (((old) << 23) \
657     | ((new) << 16) \
658     | (((reloc1) + 64) << 9) \
659     | (((reloc2) + 64) << 2) \
660     | ((reloc3) ? (1 << 1) : 0) \
661     | ((warn) ? 1 : 0)))
662 #define RELAX_OLD(i) (((i) >> 23) & 0x7f)
663 #define RELAX_NEW(i) (((i) >> 16) & 0x7f)
664 #define RELAX_RELOC1(i) ((valueT) (((i) >> 9) & 0x7f) - 64)
665 #define RELAX_RELOC2(i) ((valueT) (((i) >> 2) & 0x7f) - 64)
666 #define RELAX_RELOC3(i) (((i) >> 1) & 1)
667 #define RELAX_WARN(i) ((i) & 1)
668
669 /* Branch without likely bit.  If label is out of range, we turn:
670
671         beq reg1, reg2, label
672         delay slot
673
674    into
675
676         bne reg1, reg2, 0f
677         nop
678         j label
679      0: delay slot
680
681    with the following opcode replacements:
682
683         beq <-> bne
684         blez <-> bgtz
685         bltz <-> bgez
686         bc1f <-> bc1t
687
688         bltzal <-> bgezal  (with jal label instead of j label)
689
690    Even though keeping the delay slot instruction in the delay slot of
691    the branch would be more efficient, it would be very tricky to do
692    correctly, because we'd have to introduce a variable frag *after*
693    the delay slot instruction, and expand that instead.  Let's do it
694    the easy way for now, even if the branch-not-taken case now costs
695    one additional instruction.  Out-of-range branches are not supposed
696    to be common, anyway.
697
698    Branch likely.  If label is out of range, we turn:
699
700         beql reg1, reg2, label
701         delay slot (annulled if branch not taken)
702
703    into
704
705         beql reg1, reg2, 1f
706         nop
707         beql $0, $0, 2f
708         nop
709      1: j[al] label
710         delay slot (executed only if branch taken)
711      2:
712
713    It would be possible to generate a shorter sequence by losing the
714    likely bit, generating something like:
715
716         bne reg1, reg2, 0f
717         nop
718         j[al] label
719         delay slot (executed only if branch taken)
720      0:
721
722         beql -> bne
723         bnel -> beq
724         blezl -> bgtz
725         bgtzl -> blez
726         bltzl -> bgez
727         bgezl -> bltz
728         bc1fl -> bc1t
729         bc1tl -> bc1f
730
731         bltzall -> bgezal  (with jal label instead of j label)
732         bgezall -> bltzal  (ditto)
733
734
735    but it's not clear that it would actually improve performance.  */
736 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
737   ((relax_substateT) \
738    (0xc0000000 \
739     | ((toofar) ? 1 : 0) \
740     | ((link) ? 2 : 0) \
741     | ((likely) ? 4 : 0) \
742     | ((uncond) ? 8 : 0)))
743 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
744 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
745 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
746 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
747 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
748
749 /* For mips16 code, we use an entirely different form of relaxation.
750    mips16 supports two versions of most instructions which take
751    immediate values: a small one which takes some small value, and a
752    larger one which takes a 16 bit value.  Since branches also follow
753    this pattern, relaxing these values is required.
754
755    We can assemble both mips16 and normal MIPS code in a single
756    object.  Therefore, we need to support this type of relaxation at
757    the same time that we support the relaxation described above.  We
758    use the high bit of the subtype field to distinguish these cases.
759
760    The information we store for this type of relaxation is the
761    argument code found in the opcode file for this relocation, whether
762    the user explicitly requested a small or extended form, and whether
763    the relocation is in a jump or jal delay slot.  That tells us the
764    size of the value, and how it should be stored.  We also store
765    whether the fragment is considered to be extended or not.  We also
766    store whether this is known to be a branch to a different section,
767    whether we have tried to relax this frag yet, and whether we have
768    ever extended a PC relative fragment because of a shift count.  */
769 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
770   (0x80000000                                                   \
771    | ((type) & 0xff)                                            \
772    | ((small) ? 0x100 : 0)                                      \
773    | ((ext) ? 0x200 : 0)                                        \
774    | ((dslot) ? 0x400 : 0)                                      \
775    | ((jal_dslot) ? 0x800 : 0))
776 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
777 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
778 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
779 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
780 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
781 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
782 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
783 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
784 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
785 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
786 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
787 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
788
789 /* Is the given value a sign-extended 32-bit value?  */
790 #define IS_SEXT_32BIT_NUM(x)                                            \
791   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
792    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
793
794 /* Is the given value a sign-extended 16-bit value?  */
795 #define IS_SEXT_16BIT_NUM(x)                                            \
796   (((x) &~ (offsetT) 0x7fff) == 0                                       \
797    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
798
799 \f
800 /* Prototypes for static functions.  */
801
802 #ifdef __STDC__
803 #define internalError() \
804     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
805 #else
806 #define internalError() as_fatal (_("MIPS internal Error"));
807 #endif
808
809 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
810
811 static inline bfd_boolean reloc_needs_lo_p
812   PARAMS ((bfd_reloc_code_real_type));
813 static inline bfd_boolean fixup_has_matching_lo_p
814   PARAMS ((fixS *));
815 static int insn_uses_reg
816   PARAMS ((struct mips_cl_insn *ip, unsigned int reg,
817            enum mips_regclass class));
818 static int reg_needs_delay
819   PARAMS ((unsigned int));
820 static void mips16_mark_labels
821   PARAMS ((void));
822 static void append_insn
823   PARAMS ((char *place, struct mips_cl_insn * ip, expressionS * p,
824            bfd_reloc_code_real_type *r));
825 static void mips_no_prev_insn
826   PARAMS ((int));
827 static void mips_emit_delays
828   PARAMS ((bfd_boolean));
829 #ifdef USE_STDARG
830 static void macro_build
831   PARAMS ((char *place, int *counter, expressionS * ep, const char *name,
832            const char *fmt, ...));
833 #else
834 static void macro_build ();
835 #endif
836 static void mips16_macro_build
837   PARAMS ((char *, int *, expressionS *, const char *, const char *, va_list));
838 static void macro_build_jalr
839   PARAMS ((int, expressionS *));
840 static void macro_build_lui
841   PARAMS ((char *place, int *counter, expressionS * ep, int regnum));
842 static void macro_build_ldst_constoffset
843   PARAMS ((char *place, int *counter, expressionS * ep, const char *op,
844            int valreg, int breg));
845 static void set_at
846   PARAMS ((int *counter, int reg, int unsignedp));
847 static void check_absolute_expr
848   PARAMS ((struct mips_cl_insn * ip, expressionS *));
849 static void load_register
850   PARAMS ((int *, int, expressionS *, int));
851 static void load_address
852   PARAMS ((int *, int, expressionS *, int *));
853 static void move_register
854   PARAMS ((int *, int, int));
855 static void macro
856   PARAMS ((struct mips_cl_insn * ip));
857 static void mips16_macro
858   PARAMS ((struct mips_cl_insn * ip));
859 #ifdef LOSING_COMPILER
860 static void macro2
861   PARAMS ((struct mips_cl_insn * ip));
862 #endif
863 static void mips_ip
864   PARAMS ((char *str, struct mips_cl_insn * ip));
865 static void mips16_ip
866   PARAMS ((char *str, struct mips_cl_insn * ip));
867 static void mips16_immed
868   PARAMS ((char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean,
869            bfd_boolean, unsigned long *, bfd_boolean *, unsigned short *));
870 static bfd_boolean parse_relocation
871   PARAMS ((char **, bfd_reloc_code_real_type *));
872 static size_t my_getSmallExpression
873   PARAMS ((expressionS *, bfd_reloc_code_real_type *, char *));
874 static void my_getExpression
875   PARAMS ((expressionS *, char *));
876 #ifdef OBJ_ELF
877 static int support_64bit_objects
878   PARAMS((void));
879 #endif
880 static void mips_set_option_string
881   PARAMS ((const char **, const char *));
882 static symbolS *get_symbol
883   PARAMS ((void));
884 static void mips_align
885   PARAMS ((int to, int fill, symbolS *label));
886 static void s_align
887   PARAMS ((int));
888 static void s_change_sec
889   PARAMS ((int));
890 static void s_change_section
891   PARAMS ((int));
892 static void s_cons
893   PARAMS ((int));
894 static void s_float_cons
895   PARAMS ((int));
896 static void s_mips_globl
897   PARAMS ((int));
898 static void s_option
899   PARAMS ((int));
900 static void s_mipsset
901   PARAMS ((int));
902 static void s_abicalls
903   PARAMS ((int));
904 static void s_cpload
905   PARAMS ((int));
906 static void s_cpsetup
907   PARAMS ((int));
908 static void s_cplocal
909   PARAMS ((int));
910 static void s_cprestore
911   PARAMS ((int));
912 static void s_cpreturn
913   PARAMS ((int));
914 static void s_gpvalue
915   PARAMS ((int));
916 static void s_gpword
917   PARAMS ((int));
918 static void s_gpdword
919   PARAMS ((int));
920 static void s_cpadd
921   PARAMS ((int));
922 static void s_insn
923   PARAMS ((int));
924 static void md_obj_begin
925   PARAMS ((void));
926 static void md_obj_end
927   PARAMS ((void));
928 static long get_number
929   PARAMS ((void));
930 static void s_mips_ent
931   PARAMS ((int));
932 static void s_mips_end
933   PARAMS ((int));
934 static void s_mips_frame
935   PARAMS ((int));
936 static void s_mips_mask
937   PARAMS ((int));
938 static void s_mips_stab
939   PARAMS ((int));
940 static void s_mips_weakext
941   PARAMS ((int));
942 static void s_mips_file
943   PARAMS ((int));
944 static void s_mips_loc
945   PARAMS ((int));
946 static bfd_boolean pic_need_relax
947   PARAMS ((symbolS *, asection *));
948 static int mips16_extended_frag
949   PARAMS ((fragS *, asection *, long));
950 static int relaxed_branch_length (fragS *, asection *, int);
951 static int validate_mips_insn
952   PARAMS ((const struct mips_opcode *));
953 static void show
954   PARAMS ((FILE *, const char *, int *, int *));
955 #ifdef OBJ_ELF
956 static int mips_need_elf_addend_fixup
957   PARAMS ((fixS *));
958 #endif
959
960 /* Table and functions used to map between CPU/ISA names, and
961    ISA levels, and CPU numbers.  */
962
963 struct mips_cpu_info
964 {
965   const char *name;           /* CPU or ISA name.  */
966   int is_isa;                 /* Is this an ISA?  (If 0, a CPU.) */
967   int isa;                    /* ISA level.  */
968   int cpu;                    /* CPU number (default CPU if ISA).  */
969 };
970
971 static void mips_set_architecture
972   PARAMS ((const struct mips_cpu_info *));
973 static void mips_set_tune
974   PARAMS ((const struct mips_cpu_info *));
975 static bfd_boolean mips_strict_matching_cpu_name_p
976   PARAMS ((const char *, const char *));
977 static bfd_boolean mips_matching_cpu_name_p
978   PARAMS ((const char *, const char *));
979 static const struct mips_cpu_info *mips_parse_cpu
980   PARAMS ((const char *, const char *));
981 static const struct mips_cpu_info *mips_cpu_info_from_isa
982   PARAMS ((int));
983 \f
984 /* Pseudo-op table.
985
986    The following pseudo-ops from the Kane and Heinrich MIPS book
987    should be defined here, but are currently unsupported: .alias,
988    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
989
990    The following pseudo-ops from the Kane and Heinrich MIPS book are
991    specific to the type of debugging information being generated, and
992    should be defined by the object format: .aent, .begin, .bend,
993    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
994    .vreg.
995
996    The following pseudo-ops from the Kane and Heinrich MIPS book are
997    not MIPS CPU specific, but are also not specific to the object file
998    format.  This file is probably the best place to define them, but
999    they are not currently supported: .asm0, .endr, .lab, .repeat,
1000    .struct.  */
1001
1002 static const pseudo_typeS mips_pseudo_table[] =
1003 {
1004   /* MIPS specific pseudo-ops.  */
1005   {"option", s_option, 0},
1006   {"set", s_mipsset, 0},
1007   {"rdata", s_change_sec, 'r'},
1008   {"sdata", s_change_sec, 's'},
1009   {"livereg", s_ignore, 0},
1010   {"abicalls", s_abicalls, 0},
1011   {"cpload", s_cpload, 0},
1012   {"cpsetup", s_cpsetup, 0},
1013   {"cplocal", s_cplocal, 0},
1014   {"cprestore", s_cprestore, 0},
1015   {"cpreturn", s_cpreturn, 0},
1016   {"gpvalue", s_gpvalue, 0},
1017   {"gpword", s_gpword, 0},
1018   {"gpdword", s_gpdword, 0},
1019   {"cpadd", s_cpadd, 0},
1020   {"insn", s_insn, 0},
1021
1022   /* Relatively generic pseudo-ops that happen to be used on MIPS
1023      chips.  */
1024   {"asciiz", stringer, 1},
1025   {"bss", s_change_sec, 'b'},
1026   {"err", s_err, 0},
1027   {"half", s_cons, 1},
1028   {"dword", s_cons, 3},
1029   {"weakext", s_mips_weakext, 0},
1030
1031   /* These pseudo-ops are defined in read.c, but must be overridden
1032      here for one reason or another.  */
1033   {"align", s_align, 0},
1034   {"byte", s_cons, 0},
1035   {"data", s_change_sec, 'd'},
1036   {"double", s_float_cons, 'd'},
1037   {"float", s_float_cons, 'f'},
1038   {"globl", s_mips_globl, 0},
1039   {"global", s_mips_globl, 0},
1040   {"hword", s_cons, 1},
1041   {"int", s_cons, 2},
1042   {"long", s_cons, 2},
1043   {"octa", s_cons, 4},
1044   {"quad", s_cons, 3},
1045   {"section", s_change_section, 0},
1046   {"short", s_cons, 1},
1047   {"single", s_float_cons, 'f'},
1048   {"stabn", s_mips_stab, 'n'},
1049   {"text", s_change_sec, 't'},
1050   {"word", s_cons, 2},
1051
1052   { "extern", ecoff_directive_extern, 0},
1053
1054   { NULL, NULL, 0 },
1055 };
1056
1057 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1058 {
1059   /* These pseudo-ops should be defined by the object file format.
1060      However, a.out doesn't support them, so we have versions here.  */
1061   {"aent", s_mips_ent, 1},
1062   {"bgnb", s_ignore, 0},
1063   {"end", s_mips_end, 0},
1064   {"endb", s_ignore, 0},
1065   {"ent", s_mips_ent, 0},
1066   {"file", s_mips_file, 0},
1067   {"fmask", s_mips_mask, 'F'},
1068   {"frame", s_mips_frame, 0},
1069   {"loc", s_mips_loc, 0},
1070   {"mask", s_mips_mask, 'R'},
1071   {"verstamp", s_ignore, 0},
1072   { NULL, NULL, 0 },
1073 };
1074
1075 extern void pop_insert PARAMS ((const pseudo_typeS *));
1076
1077 void
1078 mips_pop_insert ()
1079 {
1080   pop_insert (mips_pseudo_table);
1081   if (! ECOFF_DEBUGGING)
1082     pop_insert (mips_nonecoff_pseudo_table);
1083 }
1084 \f
1085 /* Symbols labelling the current insn.  */
1086
1087 struct insn_label_list
1088 {
1089   struct insn_label_list *next;
1090   symbolS *label;
1091 };
1092
1093 static struct insn_label_list *insn_labels;
1094 static struct insn_label_list *free_insn_labels;
1095
1096 static void mips_clear_insn_labels PARAMS ((void));
1097
1098 static inline void
1099 mips_clear_insn_labels ()
1100 {
1101   register struct insn_label_list **pl;
1102
1103   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1104     ;
1105   *pl = insn_labels;
1106   insn_labels = NULL;
1107 }
1108 \f
1109 static char *expr_end;
1110
1111 /* Expressions which appear in instructions.  These are set by
1112    mips_ip.  */
1113
1114 static expressionS imm_expr;
1115 static expressionS offset_expr;
1116
1117 /* Relocs associated with imm_expr and offset_expr.  */
1118
1119 static bfd_reloc_code_real_type imm_reloc[3]
1120   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1121 static bfd_reloc_code_real_type offset_reloc[3]
1122   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1123
1124 /* These are set by mips16_ip if an explicit extension is used.  */
1125
1126 static bfd_boolean mips16_small, mips16_ext;
1127
1128 #ifdef OBJ_ELF
1129 /* The pdr segment for per procedure frame/regmask info.  Not used for
1130    ECOFF debugging.  */
1131
1132 static segT pdr_seg;
1133 #endif
1134
1135 /* The default target format to use.  */
1136
1137 const char *
1138 mips_target_format ()
1139 {
1140   switch (OUTPUT_FLAVOR)
1141     {
1142     case bfd_target_aout_flavour:
1143       return target_big_endian ? "a.out-mips-big" : "a.out-mips-little";
1144     case bfd_target_ecoff_flavour:
1145       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1146     case bfd_target_coff_flavour:
1147       return "pe-mips";
1148     case bfd_target_elf_flavour:
1149 #ifdef TE_TMIPS
1150       /* This is traditional mips.  */
1151       return (target_big_endian
1152               ? (HAVE_64BIT_OBJECTS
1153                  ? "elf64-tradbigmips"
1154                  : (HAVE_NEWABI
1155                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1156               : (HAVE_64BIT_OBJECTS
1157                  ? "elf64-tradlittlemips"
1158                  : (HAVE_NEWABI
1159                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1160 #else
1161       return (target_big_endian
1162               ? (HAVE_64BIT_OBJECTS
1163                  ? "elf64-bigmips"
1164                  : (HAVE_NEWABI
1165                     ? "elf32-nbigmips" : "elf32-bigmips"))
1166               : (HAVE_64BIT_OBJECTS
1167                  ? "elf64-littlemips"
1168                  : (HAVE_NEWABI
1169                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1170 #endif
1171     default:
1172       abort ();
1173       return NULL;
1174     }
1175 }
1176
1177 /* This function is called once, at assembler startup time.  It should
1178    set up all the tables, etc. that the MD part of the assembler will need.  */
1179
1180 void
1181 md_begin ()
1182 {
1183   register const char *retval = NULL;
1184   int i = 0;
1185   int broken = 0;
1186
1187   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
1188     as_warn (_("Could not set architecture and machine"));
1189
1190   op_hash = hash_new ();
1191
1192   for (i = 0; i < NUMOPCODES;)
1193     {
1194       const char *name = mips_opcodes[i].name;
1195
1196       retval = hash_insert (op_hash, name, (PTR) &mips_opcodes[i]);
1197       if (retval != NULL)
1198         {
1199           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1200                    mips_opcodes[i].name, retval);
1201           /* Probably a memory allocation problem?  Give up now.  */
1202           as_fatal (_("Broken assembler.  No assembly attempted."));
1203         }
1204       do
1205         {
1206           if (mips_opcodes[i].pinfo != INSN_MACRO)
1207             {
1208               if (!validate_mips_insn (&mips_opcodes[i]))
1209                 broken = 1;
1210             }
1211           ++i;
1212         }
1213       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1214     }
1215
1216   mips16_op_hash = hash_new ();
1217
1218   i = 0;
1219   while (i < bfd_mips16_num_opcodes)
1220     {
1221       const char *name = mips16_opcodes[i].name;
1222
1223       retval = hash_insert (mips16_op_hash, name, (PTR) &mips16_opcodes[i]);
1224       if (retval != NULL)
1225         as_fatal (_("internal: can't hash `%s': %s"),
1226                   mips16_opcodes[i].name, retval);
1227       do
1228         {
1229           if (mips16_opcodes[i].pinfo != INSN_MACRO
1230               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1231                   != mips16_opcodes[i].match))
1232             {
1233               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1234                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1235               broken = 1;
1236             }
1237           ++i;
1238         }
1239       while (i < bfd_mips16_num_opcodes
1240              && strcmp (mips16_opcodes[i].name, name) == 0);
1241     }
1242
1243   if (broken)
1244     as_fatal (_("Broken assembler.  No assembly attempted."));
1245
1246   /* We add all the general register names to the symbol table.  This
1247      helps us detect invalid uses of them.  */
1248   for (i = 0; i < 32; i++)
1249     {
1250       char buf[5];
1251
1252       sprintf (buf, "$%d", i);
1253       symbol_table_insert (symbol_new (buf, reg_section, i,
1254                                        &zero_address_frag));
1255     }
1256   symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1257                                    &zero_address_frag));
1258   symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1259                                    &zero_address_frag));
1260   symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1261                                    &zero_address_frag));
1262   symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1263                                    &zero_address_frag));
1264   symbol_table_insert (symbol_new ("$at", reg_section, AT,
1265                                    &zero_address_frag));
1266   symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1267                                    &zero_address_frag));
1268   symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1269                                    &zero_address_frag));
1270   symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1271                                    &zero_address_frag));
1272   symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1273                                    &zero_address_frag));
1274
1275   /* If we don't add these register names to the symbol table, they
1276      may end up being added as regular symbols by operand(), and then
1277      make it to the object file as undefined in case they're not
1278      regarded as local symbols.  They're local in o32, since `$' is a
1279      local symbol prefix, but not in n32 or n64.  */
1280   for (i = 0; i < 8; i++)
1281     {
1282       char buf[6];
1283
1284       sprintf (buf, "$fcc%i", i);
1285       symbol_table_insert (symbol_new (buf, reg_section, -1,
1286                                        &zero_address_frag));
1287     }
1288
1289   mips_no_prev_insn (FALSE);
1290
1291   mips_gprmask = 0;
1292   mips_cprmask[0] = 0;
1293   mips_cprmask[1] = 0;
1294   mips_cprmask[2] = 0;
1295   mips_cprmask[3] = 0;
1296
1297   /* set the default alignment for the text section (2**2) */
1298   record_alignment (text_section, 2);
1299
1300   if (USE_GLOBAL_POINTER_OPT)
1301     bfd_set_gp_size (stdoutput, g_switch_value);
1302
1303   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1304     {
1305       /* On a native system, sections must be aligned to 16 byte
1306          boundaries.  When configured for an embedded ELF target, we
1307          don't bother.  */
1308       if (strcmp (TARGET_OS, "elf") != 0)
1309         {
1310           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1311           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1312           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1313         }
1314
1315       /* Create a .reginfo section for register masks and a .mdebug
1316          section for debugging information.  */
1317       {
1318         segT seg;
1319         subsegT subseg;
1320         flagword flags;
1321         segT sec;
1322
1323         seg = now_seg;
1324         subseg = now_subseg;
1325
1326         /* The ABI says this section should be loaded so that the
1327            running program can access it.  However, we don't load it
1328            if we are configured for an embedded target */
1329         flags = SEC_READONLY | SEC_DATA;
1330         if (strcmp (TARGET_OS, "elf") != 0)
1331           flags |= SEC_ALLOC | SEC_LOAD;
1332
1333         if (mips_abi != N64_ABI)
1334           {
1335             sec = subseg_new (".reginfo", (subsegT) 0);
1336
1337             bfd_set_section_flags (stdoutput, sec, flags);
1338             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1339
1340 #ifdef OBJ_ELF
1341             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1342 #endif
1343           }
1344         else
1345           {
1346             /* The 64-bit ABI uses a .MIPS.options section rather than
1347                .reginfo section.  */
1348             sec = subseg_new (".MIPS.options", (subsegT) 0);
1349             bfd_set_section_flags (stdoutput, sec, flags);
1350             bfd_set_section_alignment (stdoutput, sec, 3);
1351
1352 #ifdef OBJ_ELF
1353             /* Set up the option header.  */
1354             {
1355               Elf_Internal_Options opthdr;
1356               char *f;
1357
1358               opthdr.kind = ODK_REGINFO;
1359               opthdr.size = (sizeof (Elf_External_Options)
1360                              + sizeof (Elf64_External_RegInfo));
1361               opthdr.section = 0;
1362               opthdr.info = 0;
1363               f = frag_more (sizeof (Elf_External_Options));
1364               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1365                                              (Elf_External_Options *) f);
1366
1367               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1368             }
1369 #endif
1370           }
1371
1372         if (ECOFF_DEBUGGING)
1373           {
1374             sec = subseg_new (".mdebug", (subsegT) 0);
1375             (void) bfd_set_section_flags (stdoutput, sec,
1376                                           SEC_HAS_CONTENTS | SEC_READONLY);
1377             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1378           }
1379 #ifdef OBJ_ELF
1380         else if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1381           {
1382             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1383             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1384                                           SEC_READONLY | SEC_RELOC
1385                                           | SEC_DEBUGGING);
1386             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1387           }
1388 #endif
1389
1390         subseg_set (seg, subseg);
1391       }
1392     }
1393
1394   if (! ECOFF_DEBUGGING)
1395     md_obj_begin ();
1396 }
1397
1398 void
1399 md_mips_end ()
1400 {
1401   if (! ECOFF_DEBUGGING)
1402     md_obj_end ();
1403 }
1404
1405 void
1406 md_assemble (str)
1407      char *str;
1408 {
1409   struct mips_cl_insn insn;
1410   bfd_reloc_code_real_type unused_reloc[3]
1411     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1412
1413   imm_expr.X_op = O_absent;
1414   offset_expr.X_op = O_absent;
1415   imm_reloc[0] = BFD_RELOC_UNUSED;
1416   imm_reloc[1] = BFD_RELOC_UNUSED;
1417   imm_reloc[2] = BFD_RELOC_UNUSED;
1418   offset_reloc[0] = BFD_RELOC_UNUSED;
1419   offset_reloc[1] = BFD_RELOC_UNUSED;
1420   offset_reloc[2] = BFD_RELOC_UNUSED;
1421
1422   if (mips_opts.mips16)
1423     mips16_ip (str, &insn);
1424   else
1425     {
1426       mips_ip (str, &insn);
1427       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1428             str, insn.insn_opcode));
1429     }
1430
1431   if (insn_error)
1432     {
1433       as_bad ("%s `%s'", insn_error, str);
1434       return;
1435     }
1436
1437   if (insn.insn_mo->pinfo == INSN_MACRO)
1438     {
1439       if (mips_opts.mips16)
1440         mips16_macro (&insn);
1441       else
1442         macro (&insn);
1443     }
1444   else
1445     {
1446       if (imm_expr.X_op != O_absent)
1447         append_insn (NULL, &insn, &imm_expr, imm_reloc);
1448       else if (offset_expr.X_op != O_absent)
1449         append_insn (NULL, &insn, &offset_expr, offset_reloc);
1450       else
1451         append_insn (NULL, &insn, NULL, unused_reloc);
1452     }
1453 }
1454
1455 /* Return true if the given relocation might need a matching %lo().
1456    Note that R_MIPS_GOT16 relocations only need a matching %lo() when
1457    applied to local symbols.  */
1458
1459 static inline bfd_boolean
1460 reloc_needs_lo_p (reloc)
1461      bfd_reloc_code_real_type reloc;
1462 {
1463   return (reloc == BFD_RELOC_HI16_S
1464           || reloc == BFD_RELOC_MIPS_GOT16);
1465 }
1466
1467 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1468    relocation.  */
1469
1470 static inline bfd_boolean
1471 fixup_has_matching_lo_p (fixp)
1472      fixS *fixp;
1473 {
1474   return (fixp->fx_next != NULL
1475           && fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1476           && fixp->fx_addsy == fixp->fx_next->fx_addsy
1477           && fixp->fx_offset == fixp->fx_next->fx_offset);
1478 }
1479
1480 /* See whether instruction IP reads register REG.  CLASS is the type
1481    of register.  */
1482
1483 static int
1484 insn_uses_reg (ip, reg, class)
1485      struct mips_cl_insn *ip;
1486      unsigned int reg;
1487      enum mips_regclass class;
1488 {
1489   if (class == MIPS16_REG)
1490     {
1491       assert (mips_opts.mips16);
1492       reg = mips16_to_32_reg_map[reg];
1493       class = MIPS_GR_REG;
1494     }
1495
1496   /* Don't report on general register ZERO, since it never changes.  */
1497   if (class == MIPS_GR_REG && reg == ZERO)
1498     return 0;
1499
1500   if (class == MIPS_FP_REG)
1501     {
1502       assert (! mips_opts.mips16);
1503       /* If we are called with either $f0 or $f1, we must check $f0.
1504          This is not optimal, because it will introduce an unnecessary
1505          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
1506          need to distinguish reading both $f0 and $f1 or just one of
1507          them.  Note that we don't have to check the other way,
1508          because there is no instruction that sets both $f0 and $f1
1509          and requires a delay.  */
1510       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1511           && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1512               == (reg &~ (unsigned) 1)))
1513         return 1;
1514       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1515           && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1516               == (reg &~ (unsigned) 1)))
1517         return 1;
1518     }
1519   else if (! mips_opts.mips16)
1520     {
1521       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1522           && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1523         return 1;
1524       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1525           && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1526         return 1;
1527     }
1528   else
1529     {
1530       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1531           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1532                                     & MIPS16OP_MASK_RX)]
1533               == reg))
1534         return 1;
1535       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1536           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1537                                     & MIPS16OP_MASK_RY)]
1538               == reg))
1539         return 1;
1540       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1541           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1542                                     & MIPS16OP_MASK_MOVE32Z)]
1543               == reg))
1544         return 1;
1545       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1546         return 1;
1547       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1548         return 1;
1549       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1550         return 1;
1551       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1552           && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1553               & MIPS16OP_MASK_REGR32) == reg)
1554         return 1;
1555     }
1556
1557   return 0;
1558 }
1559
1560 /* This function returns true if modifying a register requires a
1561    delay.  */
1562
1563 static int
1564 reg_needs_delay (reg)
1565      unsigned int reg;
1566 {
1567   unsigned long prev_pinfo;
1568
1569   prev_pinfo = prev_insn.insn_mo->pinfo;
1570   if (! mips_opts.noreorder
1571       && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1572       && ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1573           || (! gpr_interlocks
1574               && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1575     {
1576       /* A load from a coprocessor or from memory.  All load
1577          delays delay the use of general register rt for one
1578          instruction on the r3000.  The r6000 and r4000 use
1579          interlocks.  */
1580       /* Itbl support may require additional care here.  */
1581       know (prev_pinfo & INSN_WRITE_GPR_T);
1582       if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1583         return 1;
1584     }
1585
1586   return 0;
1587 }
1588
1589 /* Mark instruction labels in mips16 mode.  This permits the linker to
1590    handle them specially, such as generating jalx instructions when
1591    needed.  We also make them odd for the duration of the assembly, in
1592    order to generate the right sort of code.  We will make them even
1593    in the adjust_symtab routine, while leaving them marked.  This is
1594    convenient for the debugger and the disassembler.  The linker knows
1595    to make them odd again.  */
1596
1597 static void
1598 mips16_mark_labels ()
1599 {
1600   if (mips_opts.mips16)
1601     {
1602       struct insn_label_list *l;
1603       valueT val;
1604
1605       for (l = insn_labels; l != NULL; l = l->next)
1606         {
1607 #ifdef OBJ_ELF
1608           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1609             S_SET_OTHER (l->label, STO_MIPS16);
1610 #endif
1611           val = S_GET_VALUE (l->label);
1612           if ((val & 1) == 0)
1613             S_SET_VALUE (l->label, val + 1);
1614         }
1615     }
1616 }
1617
1618 /* Output an instruction.  PLACE is where to put the instruction; if
1619    it is NULL, this uses frag_more to get room.  IP is the instruction
1620    information.  ADDRESS_EXPR is an operand of the instruction to be
1621    used with RELOC_TYPE.  */
1622
1623 static void
1624 append_insn (place, ip, address_expr, reloc_type)
1625      char *place;
1626      struct mips_cl_insn *ip;
1627      expressionS *address_expr;
1628      bfd_reloc_code_real_type *reloc_type;
1629 {
1630   register unsigned long prev_pinfo, pinfo;
1631   char *f;
1632   fixS *fixp[3];
1633   int nops = 0;
1634
1635   /* Mark instruction labels in mips16 mode.  */
1636   mips16_mark_labels ();
1637
1638   prev_pinfo = prev_insn.insn_mo->pinfo;
1639   pinfo = ip->insn_mo->pinfo;
1640
1641   if (place == NULL && (! mips_opts.noreorder || prev_nop_frag != NULL))
1642     {
1643       int prev_prev_nop;
1644
1645       /* If the previous insn required any delay slots, see if we need
1646          to insert a NOP or two.  There are eight kinds of possible
1647          hazards, of which an instruction can have at most one type.
1648          (1) a load from memory delay
1649          (2) a load from a coprocessor delay
1650          (3) an unconditional branch delay
1651          (4) a conditional branch delay
1652          (5) a move to coprocessor register delay
1653          (6) a load coprocessor register from memory delay
1654          (7) a coprocessor condition code delay
1655          (8) a HI/LO special register delay
1656
1657          There are a lot of optimizations we could do that we don't.
1658          In particular, we do not, in general, reorder instructions.
1659          If you use gcc with optimization, it will reorder
1660          instructions and generally do much more optimization then we
1661          do here; repeating all that work in the assembler would only
1662          benefit hand written assembly code, and does not seem worth
1663          it.  */
1664
1665       /* This is how a NOP is emitted.  */
1666 #define emit_nop()                                      \
1667   (mips_opts.mips16                                     \
1668    ? md_number_to_chars (frag_more (2), 0x6500, 2)      \
1669    : md_number_to_chars (frag_more (4), 0, 4))
1670
1671       /* The previous insn might require a delay slot, depending upon
1672          the contents of the current insn.  */
1673       if (! mips_opts.mips16
1674           && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1675           && (((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1676                && ! cop_interlocks)
1677               || (! gpr_interlocks
1678                   && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))))
1679         {
1680           /* A load from a coprocessor or from memory.  All load
1681              delays delay the use of general register rt for one
1682              instruction on the r3000.  The r6000 and r4000 use
1683              interlocks.  */
1684           /* Itbl support may require additional care here.  */
1685           know (prev_pinfo & INSN_WRITE_GPR_T);
1686           if (mips_optimize == 0
1687               || insn_uses_reg (ip,
1688                                 ((prev_insn.insn_opcode >> OP_SH_RT)
1689                                  & OP_MASK_RT),
1690                                 MIPS_GR_REG))
1691             ++nops;
1692         }
1693       else if (! mips_opts.mips16
1694                && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1695                && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
1696                     && ! cop_interlocks)
1697                    || (mips_opts.isa == ISA_MIPS1
1698                        && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))))
1699         {
1700           /* A generic coprocessor delay.  The previous instruction
1701              modified a coprocessor general or control register.  If
1702              it modified a control register, we need to avoid any
1703              coprocessor instruction (this is probably not always
1704              required, but it sometimes is).  If it modified a general
1705              register, we avoid using that register.
1706
1707              On the r6000 and r4000 loading a coprocessor register
1708              from memory is interlocked, and does not require a delay.
1709
1710              This case is not handled very well.  There is no special
1711              knowledge of CP0 handling, and the coprocessors other
1712              than the floating point unit are not distinguished at
1713              all.  */
1714           /* Itbl support may require additional care here. FIXME!
1715              Need to modify this to include knowledge about
1716              user specified delays!  */
1717           if (prev_pinfo & INSN_WRITE_FPR_T)
1718             {
1719               if (mips_optimize == 0
1720                   || insn_uses_reg (ip,
1721                                     ((prev_insn.insn_opcode >> OP_SH_FT)
1722                                      & OP_MASK_FT),
1723                                     MIPS_FP_REG))
1724                 ++nops;
1725             }
1726           else if (prev_pinfo & INSN_WRITE_FPR_S)
1727             {
1728               if (mips_optimize == 0
1729                   || insn_uses_reg (ip,
1730                                     ((prev_insn.insn_opcode >> OP_SH_FS)
1731                                      & OP_MASK_FS),
1732                                     MIPS_FP_REG))
1733                 ++nops;
1734             }
1735           else
1736             {
1737               /* We don't know exactly what the previous instruction
1738                  does.  If the current instruction uses a coprocessor
1739                  register, we must insert a NOP.  If previous
1740                  instruction may set the condition codes, and the
1741                  current instruction uses them, we must insert two
1742                  NOPS.  */
1743               /* Itbl support may require additional care here.  */
1744               if (mips_optimize == 0
1745                   || ((prev_pinfo & INSN_WRITE_COND_CODE)
1746                       && (pinfo & INSN_READ_COND_CODE)))
1747                 nops += 2;
1748               else if (pinfo & INSN_COP)
1749                 ++nops;
1750             }
1751         }
1752       else if (! mips_opts.mips16
1753                && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1754                && (prev_pinfo & INSN_WRITE_COND_CODE)
1755                && ! cop_interlocks)
1756         {
1757           /* The previous instruction sets the coprocessor condition
1758              codes, but does not require a general coprocessor delay
1759              (this means it is a floating point comparison
1760              instruction).  If this instruction uses the condition
1761              codes, we need to insert a single NOP.  */
1762           /* Itbl support may require additional care here.  */
1763           if (mips_optimize == 0
1764               || (pinfo & INSN_READ_COND_CODE))
1765             ++nops;
1766         }
1767
1768       /* If we're fixing up mfhi/mflo for the r7000 and the
1769          previous insn was an mfhi/mflo and the current insn
1770          reads the register that the mfhi/mflo wrote to, then
1771          insert two nops.  */
1772
1773       else if (mips_7000_hilo_fix
1774                && MF_HILO_INSN (prev_pinfo)
1775                && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
1776                                       & OP_MASK_RD),
1777                                  MIPS_GR_REG))
1778         {
1779           nops += 2;
1780         }
1781
1782       /* If we're fixing up mfhi/mflo for the r7000 and the
1783          2nd previous insn was an mfhi/mflo and the current insn
1784          reads the register that the mfhi/mflo wrote to, then
1785          insert one nop.  */
1786
1787       else if (mips_7000_hilo_fix
1788                && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1789                && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1790                                        & OP_MASK_RD),
1791                                     MIPS_GR_REG))
1792
1793         {
1794           ++nops;
1795         }
1796
1797       else if (prev_pinfo & INSN_READ_LO)
1798         {
1799           /* The previous instruction reads the LO register; if the
1800              current instruction writes to the LO register, we must
1801              insert two NOPS.  Some newer processors have interlocks.
1802              Also the tx39's multiply instructions can be exectuted
1803              immediatly after a read from HI/LO (without the delay),
1804              though the tx39's divide insns still do require the
1805              delay.  */
1806           if (! (hilo_interlocks
1807                  || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1808               && (mips_optimize == 0
1809                   || (pinfo & INSN_WRITE_LO)))
1810             nops += 2;
1811           /* Most mips16 branch insns don't have a delay slot.
1812              If a read from LO is immediately followed by a branch
1813              to a write to LO we have a read followed by a write
1814              less than 2 insns away.  We assume the target of
1815              a branch might be a write to LO, and insert a nop
1816              between a read and an immediately following branch.  */
1817           else if (mips_opts.mips16
1818                    && (mips_optimize == 0
1819                        || (pinfo & MIPS16_INSN_BRANCH)))
1820             ++nops;
1821         }
1822       else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1823         {
1824           /* The previous instruction reads the HI register; if the
1825              current instruction writes to the HI register, we must
1826              insert a NOP.  Some newer processors have interlocks.
1827              Also the note tx39's multiply above.  */
1828           if (! (hilo_interlocks
1829                  || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
1830               && (mips_optimize == 0
1831                   || (pinfo & INSN_WRITE_HI)))
1832             nops += 2;
1833           /* Most mips16 branch insns don't have a delay slot.
1834              If a read from HI is immediately followed by a branch
1835              to a write to HI we have a read followed by a write
1836              less than 2 insns away.  We assume the target of
1837              a branch might be a write to HI, and insert a nop
1838              between a read and an immediately following branch.  */
1839           else if (mips_opts.mips16
1840                    && (mips_optimize == 0
1841                        || (pinfo & MIPS16_INSN_BRANCH)))
1842             ++nops;
1843         }
1844
1845       /* If the previous instruction was in a noreorder section, then
1846          we don't want to insert the nop after all.  */
1847       /* Itbl support may require additional care here.  */
1848       if (prev_insn_unreordered)
1849         nops = 0;
1850
1851       /* There are two cases which require two intervening
1852          instructions: 1) setting the condition codes using a move to
1853          coprocessor instruction which requires a general coprocessor
1854          delay and then reading the condition codes 2) reading the HI
1855          or LO register and then writing to it (except on processors
1856          which have interlocks).  If we are not already emitting a NOP
1857          instruction, we must check for these cases compared to the
1858          instruction previous to the previous instruction.  */
1859       if ((! mips_opts.mips16
1860            && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
1861            && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1862            && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1863            && (pinfo & INSN_READ_COND_CODE)
1864            && ! cop_interlocks)
1865           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1866               && (pinfo & INSN_WRITE_LO)
1867               && ! (hilo_interlocks
1868                     || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT))))
1869           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1870               && (pinfo & INSN_WRITE_HI)
1871               && ! (hilo_interlocks
1872                     || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))))
1873         prev_prev_nop = 1;
1874       else
1875         prev_prev_nop = 0;
1876
1877       if (prev_prev_insn_unreordered)
1878         prev_prev_nop = 0;
1879
1880       if (prev_prev_nop && nops == 0)
1881         ++nops;
1882
1883       if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
1884         {
1885           /* We're out of bits in pinfo, so we must resort to string
1886              ops here.  Shortcuts are selected based on opcodes being
1887              limited to the VR4122 instruction set.  */
1888           int min_nops = 0;
1889           const char *pn = prev_insn.insn_mo->name;
1890           const char *tn = ip->insn_mo->name;
1891           if (strncmp(pn, "macc", 4) == 0
1892               || strncmp(pn, "dmacc", 5) == 0)
1893             {
1894               /* Errata 21 - [D]DIV[U] after [D]MACC */
1895               if (strstr (tn, "div"))
1896                 {
1897                   min_nops = 1;
1898                 }
1899
1900               /* Errata 23 - Continuous DMULT[U]/DMACC instructions */
1901               if (pn[0] == 'd' /* dmacc */
1902                   && (strncmp(tn, "dmult", 5) == 0
1903                       || strncmp(tn, "dmacc", 5) == 0))
1904                 {
1905                   min_nops = 1;
1906                 }
1907
1908               /* Errata 24 - MT{LO,HI} after [D]MACC */
1909               if (strcmp (tn, "mtlo") == 0
1910                   || strcmp (tn, "mthi") == 0)
1911                 {
1912                   min_nops = 1;
1913                 }
1914
1915             }
1916           else if (strncmp(pn, "dmult", 5) == 0
1917                    && (strncmp(tn, "dmult", 5) == 0
1918                        || strncmp(tn, "dmacc", 5) == 0))
1919             {
1920               /* Here is the rest of errata 23.  */
1921               min_nops = 1;
1922             }
1923           if (nops < min_nops)
1924             nops = min_nops;
1925         }
1926
1927       /* If we are being given a nop instruction, don't bother with
1928          one of the nops we would otherwise output.  This will only
1929          happen when a nop instruction is used with mips_optimize set
1930          to 0.  */
1931       if (nops > 0
1932           && ! mips_opts.noreorder
1933           && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
1934         --nops;
1935
1936       /* Now emit the right number of NOP instructions.  */
1937       if (nops > 0 && ! mips_opts.noreorder)
1938         {
1939           fragS *old_frag;
1940           unsigned long old_frag_offset;
1941           int i;
1942           struct insn_label_list *l;
1943
1944           old_frag = frag_now;
1945           old_frag_offset = frag_now_fix ();
1946
1947           for (i = 0; i < nops; i++)
1948             emit_nop ();
1949
1950           if (listing)
1951             {
1952               listing_prev_line ();
1953               /* We may be at the start of a variant frag.  In case we
1954                  are, make sure there is enough space for the frag
1955                  after the frags created by listing_prev_line.  The
1956                  argument to frag_grow here must be at least as large
1957                  as the argument to all other calls to frag_grow in
1958                  this file.  We don't have to worry about being in the
1959                  middle of a variant frag, because the variants insert
1960                  all needed nop instructions themselves.  */
1961               frag_grow (40);
1962             }
1963
1964           for (l = insn_labels; l != NULL; l = l->next)
1965             {
1966               valueT val;
1967
1968               assert (S_GET_SEGMENT (l->label) == now_seg);
1969               symbol_set_frag (l->label, frag_now);
1970               val = (valueT) frag_now_fix ();
1971               /* mips16 text labels are stored as odd.  */
1972               if (mips_opts.mips16)
1973                 ++val;
1974               S_SET_VALUE (l->label, val);
1975             }
1976
1977 #ifndef NO_ECOFF_DEBUGGING
1978           if (ECOFF_DEBUGGING)
1979             ecoff_fix_loc (old_frag, old_frag_offset);
1980 #endif
1981         }
1982       else if (prev_nop_frag != NULL)
1983         {
1984           /* We have a frag holding nops we may be able to remove.  If
1985              we don't need any nops, we can decrease the size of
1986              prev_nop_frag by the size of one instruction.  If we do
1987              need some nops, we count them in prev_nops_required.  */
1988           if (prev_nop_frag_since == 0)
1989             {
1990               if (nops == 0)
1991                 {
1992                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1993                   --prev_nop_frag_holds;
1994                 }
1995               else
1996                 prev_nop_frag_required += nops;
1997             }
1998           else
1999             {
2000               if (prev_prev_nop == 0)
2001                 {
2002                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2003                   --prev_nop_frag_holds;
2004                 }
2005               else
2006                 ++prev_nop_frag_required;
2007             }
2008
2009           if (prev_nop_frag_holds <= prev_nop_frag_required)
2010             prev_nop_frag = NULL;
2011
2012           ++prev_nop_frag_since;
2013
2014           /* Sanity check: by the time we reach the second instruction
2015              after prev_nop_frag, we should have used up all the nops
2016              one way or another.  */
2017           assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
2018         }
2019     }
2020
2021   if (place == NULL
2022       && address_expr
2023       && *reloc_type == BFD_RELOC_16_PCREL_S2
2024       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2025           || pinfo & INSN_COND_BRANCH_LIKELY)
2026       && mips_relax_branch
2027       /* Don't try branch relaxation within .set nomacro, or within
2028          .set noat if we use $at for PIC computations.  If it turns
2029          out that the branch was out-of-range, we'll get an error.  */
2030       && !mips_opts.warn_about_macros
2031       && !(mips_opts.noat && mips_pic != NO_PIC)
2032       && !mips_opts.mips16)
2033     {
2034       f = frag_var (rs_machine_dependent,
2035                     relaxed_branch_length
2036                     (NULL, NULL,
2037                      (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2038                      : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1 : 0), 4,
2039                     RELAX_BRANCH_ENCODE
2040                     (pinfo & INSN_UNCOND_BRANCH_DELAY,
2041                      pinfo & INSN_COND_BRANCH_LIKELY,
2042                      pinfo & INSN_WRITE_GPR_31,
2043                      0),
2044                     address_expr->X_add_symbol,
2045                     address_expr->X_add_number,
2046                     0);
2047       *reloc_type = BFD_RELOC_UNUSED;
2048     }
2049   else if (*reloc_type > BFD_RELOC_UNUSED)
2050     {
2051       /* We need to set up a variant frag.  */
2052       assert (mips_opts.mips16 && address_expr != NULL);
2053       f = frag_var (rs_machine_dependent, 4, 0,
2054                     RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
2055                                          mips16_small, mips16_ext,
2056                                          (prev_pinfo
2057                                           & INSN_UNCOND_BRANCH_DELAY),
2058                                          (*prev_insn_reloc_type
2059                                           == BFD_RELOC_MIPS16_JMP)),
2060                     make_expr_symbol (address_expr), 0, NULL);
2061     }
2062   else if (place != NULL)
2063     f = place;
2064   else if (mips_opts.mips16
2065            && ! ip->use_extend
2066            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2067     {
2068       /* Make sure there is enough room to swap this instruction with
2069          a following jump instruction.  */
2070       frag_grow (6);
2071       f = frag_more (2);
2072     }
2073   else
2074     {
2075       if (mips_opts.mips16
2076           && mips_opts.noreorder
2077           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2078         as_warn (_("extended instruction in delay slot"));
2079
2080       f = frag_more (4);
2081     }
2082
2083   fixp[0] = fixp[1] = fixp[2] = NULL;
2084   if (address_expr != NULL && *reloc_type < BFD_RELOC_UNUSED)
2085     {
2086       if (address_expr->X_op == O_constant)
2087         {
2088           valueT tmp;
2089
2090           switch (*reloc_type)
2091             {
2092             case BFD_RELOC_32:
2093               ip->insn_opcode |= address_expr->X_add_number;
2094               break;
2095
2096             case BFD_RELOC_MIPS_HIGHEST:
2097               tmp = (address_expr->X_add_number + 0x800080008000) >> 16;
2098               tmp >>= 16;
2099               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2100               break;
2101
2102             case BFD_RELOC_MIPS_HIGHER:
2103               tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2104               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2105               break;
2106
2107             case BFD_RELOC_HI16_S:
2108               ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2109                                   >> 16) & 0xffff;
2110               break;
2111
2112             case BFD_RELOC_HI16:
2113               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2114               break;
2115
2116             case BFD_RELOC_LO16:
2117             case BFD_RELOC_MIPS_GOT_DISP:
2118               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2119               break;
2120
2121             case BFD_RELOC_MIPS_JMP:
2122               if ((address_expr->X_add_number & 3) != 0)
2123                 as_bad (_("jump to misaligned address (0x%lx)"),
2124                         (unsigned long) address_expr->X_add_number);
2125               if (address_expr->X_add_number & ~0xfffffff)
2126                 as_bad (_("jump address range overflow (0x%lx)"),
2127                         (unsigned long) address_expr->X_add_number);
2128               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2129               break;
2130
2131             case BFD_RELOC_MIPS16_JMP:
2132               if ((address_expr->X_add_number & 3) != 0)
2133                 as_bad (_("jump to misaligned address (0x%lx)"),
2134                         (unsigned long) address_expr->X_add_number);
2135               if (address_expr->X_add_number & ~0xfffffff)
2136                 as_bad (_("jump address range overflow (0x%lx)"),
2137                         (unsigned long) address_expr->X_add_number);
2138               ip->insn_opcode |=
2139                 (((address_expr->X_add_number & 0x7c0000) << 3)
2140                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2141                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2142               break;
2143
2144             case BFD_RELOC_16_PCREL_S2:
2145               goto need_reloc;
2146
2147             default:
2148               internalError ();
2149             }
2150         }
2151       else
2152         {
2153         need_reloc:
2154           /* Don't generate a reloc if we are writing into a variant frag.  */
2155           if (place == NULL)
2156             {
2157               fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
2158                                      address_expr,
2159                                      *reloc_type == BFD_RELOC_16_PCREL_S2,
2160                                      reloc_type[0]);
2161
2162               /* These relocations can have an addend that won't fit in
2163                  4 octets for 64bit assembly.  */
2164               if (HAVE_64BIT_GPRS &&
2165                   (*reloc_type == BFD_RELOC_16
2166                    || *reloc_type == BFD_RELOC_32
2167                    || *reloc_type == BFD_RELOC_MIPS_JMP
2168                    || *reloc_type == BFD_RELOC_HI16_S
2169                    || *reloc_type == BFD_RELOC_LO16
2170                    || *reloc_type == BFD_RELOC_GPREL16
2171                    || *reloc_type == BFD_RELOC_MIPS_LITERAL
2172                    || *reloc_type == BFD_RELOC_GPREL32
2173                    || *reloc_type == BFD_RELOC_64
2174                    || *reloc_type == BFD_RELOC_CTOR
2175                    || *reloc_type == BFD_RELOC_MIPS_SUB
2176                    || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2177                    || *reloc_type == BFD_RELOC_MIPS_HIGHER
2178                    || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2179                    || *reloc_type == BFD_RELOC_MIPS_REL16
2180                    || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2181                 fixp[0]->fx_no_overflow = 1;
2182
2183               if (reloc_needs_lo_p (*reloc_type))
2184                 {
2185                   struct mips_hi_fixup *hi_fixup;
2186
2187                   /* Reuse the last entry if it already has a matching %lo.  */
2188                   hi_fixup = mips_hi_fixup_list;
2189                   if (hi_fixup == 0
2190                       || !fixup_has_matching_lo_p (hi_fixup->fixp))
2191                     {
2192                       hi_fixup = ((struct mips_hi_fixup *)
2193                                   xmalloc (sizeof (struct mips_hi_fixup)));
2194                       hi_fixup->next = mips_hi_fixup_list;
2195                       mips_hi_fixup_list = hi_fixup;
2196                     }
2197                   hi_fixup->fixp = fixp[0];
2198                   hi_fixup->seg = now_seg;
2199                 }
2200
2201               if (reloc_type[1] != BFD_RELOC_UNUSED)
2202                 {
2203                   /* FIXME: This symbol can be one of
2204                      RSS_UNDEF, RSS_GP, RSS_GP0, RSS_LOC.  */
2205                   address_expr->X_op = O_absent;
2206                   address_expr->X_add_symbol = 0;
2207                   address_expr->X_add_number = 0;
2208
2209                   fixp[1] = fix_new_exp (frag_now, f - frag_now->fr_literal,
2210                                          4, address_expr, FALSE,
2211                                          reloc_type[1]);
2212
2213                   /* These relocations can have an addend that won't fit in
2214                      4 octets for 64bit assembly.  */
2215                   if (HAVE_64BIT_GPRS &&
2216                       (*reloc_type == BFD_RELOC_16
2217                        || *reloc_type == BFD_RELOC_32
2218                        || *reloc_type == BFD_RELOC_MIPS_JMP
2219                        || *reloc_type == BFD_RELOC_HI16_S
2220                        || *reloc_type == BFD_RELOC_LO16
2221                        || *reloc_type == BFD_RELOC_GPREL16
2222                        || *reloc_type == BFD_RELOC_MIPS_LITERAL
2223                        || *reloc_type == BFD_RELOC_GPREL32
2224                        || *reloc_type == BFD_RELOC_64
2225                        || *reloc_type == BFD_RELOC_CTOR
2226                        || *reloc_type == BFD_RELOC_MIPS_SUB
2227                        || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2228                        || *reloc_type == BFD_RELOC_MIPS_HIGHER
2229                        || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2230                        || *reloc_type == BFD_RELOC_MIPS_REL16
2231                        || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2232                     fixp[1]->fx_no_overflow = 1;
2233
2234                   if (reloc_type[2] != BFD_RELOC_UNUSED)
2235                     {
2236                       address_expr->X_op = O_absent;
2237                       address_expr->X_add_symbol = 0;
2238                       address_expr->X_add_number = 0;
2239
2240                       fixp[2] = fix_new_exp (frag_now,
2241                                              f - frag_now->fr_literal, 4,
2242                                              address_expr, FALSE,
2243                                              reloc_type[2]);
2244
2245                       /* These relocations can have an addend that won't fit in
2246                          4 octets for 64bit assembly.  */
2247                       if (HAVE_64BIT_GPRS &&
2248                           (*reloc_type == BFD_RELOC_16
2249                            || *reloc_type == BFD_RELOC_32
2250                            || *reloc_type == BFD_RELOC_MIPS_JMP
2251                            || *reloc_type == BFD_RELOC_HI16_S
2252                            || *reloc_type == BFD_RELOC_LO16
2253                            || *reloc_type == BFD_RELOC_GPREL16
2254                            || *reloc_type == BFD_RELOC_MIPS_LITERAL
2255                            || *reloc_type == BFD_RELOC_GPREL32
2256                            || *reloc_type == BFD_RELOC_64
2257                            || *reloc_type == BFD_RELOC_CTOR
2258                            || *reloc_type == BFD_RELOC_MIPS_SUB
2259                            || *reloc_type == BFD_RELOC_MIPS_HIGHEST
2260                            || *reloc_type == BFD_RELOC_MIPS_HIGHER
2261                            || *reloc_type == BFD_RELOC_MIPS_SCN_DISP
2262                            || *reloc_type == BFD_RELOC_MIPS_REL16
2263                            || *reloc_type == BFD_RELOC_MIPS_RELGOT))
2264                         fixp[2]->fx_no_overflow = 1;
2265                     }
2266                 }
2267             }
2268         }
2269     }
2270
2271   if (! mips_opts.mips16)
2272     {
2273       md_number_to_chars (f, ip->insn_opcode, 4);
2274 #ifdef OBJ_ELF
2275       dwarf2_emit_insn (4);
2276 #endif
2277     }
2278   else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
2279     {
2280       md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2281       md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
2282 #ifdef OBJ_ELF
2283       dwarf2_emit_insn (4);
2284 #endif
2285     }
2286   else
2287     {
2288       if (ip->use_extend)
2289         {
2290           md_number_to_chars (f, 0xf000 | ip->extend, 2);
2291           f += 2;
2292         }
2293       md_number_to_chars (f, ip->insn_opcode, 2);
2294 #ifdef OBJ_ELF
2295       dwarf2_emit_insn (ip->use_extend ? 4 : 2);
2296 #endif
2297     }
2298
2299   /* Update the register mask information.  */
2300   if (! mips_opts.mips16)
2301     {
2302       if (pinfo & INSN_WRITE_GPR_D)
2303         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2304       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2305         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2306       if (pinfo & INSN_READ_GPR_S)
2307         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2308       if (pinfo & INSN_WRITE_GPR_31)
2309         mips_gprmask |= 1 << RA;
2310       if (pinfo & INSN_WRITE_FPR_D)
2311         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2312       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2313         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2314       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2315         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2316       if ((pinfo & INSN_READ_FPR_R) != 0)
2317         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2318       if (pinfo & INSN_COP)
2319         {
2320           /* We don't keep enough information to sort these cases out.
2321              The itbl support does keep this information however, although
2322              we currently don't support itbl fprmats as part of the cop
2323              instruction.  May want to add this support in the future.  */
2324         }
2325       /* Never set the bit for $0, which is always zero.  */
2326       mips_gprmask &= ~1 << 0;
2327     }
2328   else
2329     {
2330       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2331         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2332                               & MIPS16OP_MASK_RX);
2333       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2334         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2335                               & MIPS16OP_MASK_RY);
2336       if (pinfo & MIPS16_INSN_WRITE_Z)
2337         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2338                               & MIPS16OP_MASK_RZ);
2339       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2340         mips_gprmask |= 1 << TREG;
2341       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2342         mips_gprmask |= 1 << SP;
2343       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2344         mips_gprmask |= 1 << RA;
2345       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2346         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2347       if (pinfo & MIPS16_INSN_READ_Z)
2348         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2349                               & MIPS16OP_MASK_MOVE32Z);
2350       if (pinfo & MIPS16_INSN_READ_GPR_X)
2351         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2352                               & MIPS16OP_MASK_REGR32);
2353     }
2354
2355   if (place == NULL && ! mips_opts.noreorder)
2356     {
2357       /* Filling the branch delay slot is more complex.  We try to
2358          switch the branch with the previous instruction, which we can
2359          do if the previous instruction does not set up a condition
2360          that the branch tests and if the branch is not itself the
2361          target of any branch.  */
2362       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2363           || (pinfo & INSN_COND_BRANCH_DELAY))
2364         {
2365           if (mips_optimize < 2
2366               /* If we have seen .set volatile or .set nomove, don't
2367                  optimize.  */
2368               || mips_opts.nomove != 0
2369               /* If we had to emit any NOP instructions, then we
2370                  already know we can not swap.  */
2371               || nops != 0
2372               /* If we don't even know the previous insn, we can not
2373                  swap.  */
2374               || ! prev_insn_valid
2375               /* If the previous insn is already in a branch delay
2376                  slot, then we can not swap.  */
2377               || prev_insn_is_delay_slot
2378               /* If the previous previous insn was in a .set
2379                  noreorder, we can't swap.  Actually, the MIPS
2380                  assembler will swap in this situation.  However, gcc
2381                  configured -with-gnu-as will generate code like
2382                    .set noreorder
2383                    lw   $4,XXX
2384                    .set reorder
2385                    INSN
2386                    bne  $4,$0,foo
2387                  in which we can not swap the bne and INSN.  If gcc is
2388                  not configured -with-gnu-as, it does not output the
2389                  .set pseudo-ops.  We don't have to check
2390                  prev_insn_unreordered, because prev_insn_valid will
2391                  be 0 in that case.  We don't want to use
2392                  prev_prev_insn_valid, because we do want to be able
2393                  to swap at the start of a function.  */
2394               || prev_prev_insn_unreordered
2395               /* If the branch is itself the target of a branch, we
2396                  can not swap.  We cheat on this; all we check for is
2397                  whether there is a label on this instruction.  If
2398                  there are any branches to anything other than a
2399                  label, users must use .set noreorder.  */
2400               || insn_labels != NULL
2401               /* If the previous instruction is in a variant frag, we
2402                  can not do the swap.  This does not apply to the
2403                  mips16, which uses variant frags for different
2404                  purposes.  */
2405               || (! mips_opts.mips16
2406                   && prev_insn_frag->fr_type == rs_machine_dependent)
2407               /* If the branch reads the condition codes, we don't
2408                  even try to swap, because in the sequence
2409                    ctc1 $X,$31
2410                    INSN
2411                    INSN
2412                    bc1t LABEL
2413                  we can not swap, and I don't feel like handling that
2414                  case.  */
2415               || (! mips_opts.mips16
2416                   && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2417                   && (pinfo & INSN_READ_COND_CODE))
2418               /* We can not swap with an instruction that requires a
2419                  delay slot, becase the target of the branch might
2420                  interfere with that instruction.  */
2421               || (! mips_opts.mips16
2422                   && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2423                   && (prev_pinfo
2424               /* Itbl support may require additional care here.  */
2425                       & (INSN_LOAD_COPROC_DELAY
2426                          | INSN_COPROC_MOVE_DELAY
2427                          | INSN_WRITE_COND_CODE)))
2428               || (! (hilo_interlocks
2429                      || (mips_tune == CPU_R3900 && (pinfo & INSN_MULT)))
2430                   && (prev_pinfo
2431                       & (INSN_READ_LO
2432                          | INSN_READ_HI)))
2433               || (! mips_opts.mips16
2434                   && ! gpr_interlocks
2435                   && (prev_pinfo & INSN_LOAD_MEMORY_DELAY))
2436               || (! mips_opts.mips16
2437                   && mips_opts.isa == ISA_MIPS1
2438                   /* Itbl support may require additional care here.  */
2439                   && (prev_pinfo & INSN_COPROC_MEMORY_DELAY))
2440               /* We can not swap with a branch instruction.  */
2441               || (prev_pinfo
2442                   & (INSN_UNCOND_BRANCH_DELAY
2443                      | INSN_COND_BRANCH_DELAY
2444                      | INSN_COND_BRANCH_LIKELY))
2445               /* We do not swap with a trap instruction, since it
2446                  complicates trap handlers to have the trap
2447                  instruction be in a delay slot.  */
2448               || (prev_pinfo & INSN_TRAP)
2449               /* If the branch reads a register that the previous
2450                  instruction sets, we can not swap.  */
2451               || (! mips_opts.mips16
2452                   && (prev_pinfo & INSN_WRITE_GPR_T)
2453                   && insn_uses_reg (ip,
2454                                     ((prev_insn.insn_opcode >> OP_SH_RT)
2455                                      & OP_MASK_RT),
2456                                     MIPS_GR_REG))
2457               || (! mips_opts.mips16
2458                   && (prev_pinfo & INSN_WRITE_GPR_D)
2459                   && insn_uses_reg (ip,
2460                                     ((prev_insn.insn_opcode >> OP_SH_RD)
2461                                      & OP_MASK_RD),
2462                                     MIPS_GR_REG))
2463               || (mips_opts.mips16
2464                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2465                        && insn_uses_reg (ip,
2466                                          ((prev_insn.insn_opcode
2467                                            >> MIPS16OP_SH_RX)
2468                                           & MIPS16OP_MASK_RX),
2469                                          MIPS16_REG))
2470                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2471                           && insn_uses_reg (ip,
2472                                             ((prev_insn.insn_opcode
2473                                               >> MIPS16OP_SH_RY)
2474                                              & MIPS16OP_MASK_RY),
2475                                             MIPS16_REG))
2476                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2477                           && insn_uses_reg (ip,
2478                                             ((prev_insn.insn_opcode
2479                                               >> MIPS16OP_SH_RZ)
2480                                              & MIPS16OP_MASK_RZ),
2481                                             MIPS16_REG))
2482                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2483                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2484                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2485                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
2486                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2487                           && insn_uses_reg (ip,
2488                                             MIPS16OP_EXTRACT_REG32R (prev_insn.
2489                                                                      insn_opcode),
2490                                             MIPS_GR_REG))))
2491               /* If the branch writes a register that the previous
2492                  instruction sets, we can not swap (we know that
2493                  branches write only to RD or to $31).  */
2494               || (! mips_opts.mips16
2495                   && (prev_pinfo & INSN_WRITE_GPR_T)
2496                   && (((pinfo & INSN_WRITE_GPR_D)
2497                        && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2498                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2499                       || ((pinfo & INSN_WRITE_GPR_31)
2500                           && (((prev_insn.insn_opcode >> OP_SH_RT)
2501                                & OP_MASK_RT)
2502                               == RA))))
2503               || (! mips_opts.mips16
2504                   && (prev_pinfo & INSN_WRITE_GPR_D)
2505                   && (((pinfo & INSN_WRITE_GPR_D)
2506                        && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2507                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2508                       || ((pinfo & INSN_WRITE_GPR_31)
2509                           && (((prev_insn.insn_opcode >> OP_SH_RD)
2510                                & OP_MASK_RD)
2511                               == RA))))
2512               || (mips_opts.mips16
2513                   && (pinfo & MIPS16_INSN_WRITE_31)
2514                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2515                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2516                           && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2517                               == RA))))
2518               /* If the branch writes a register that the previous
2519                  instruction reads, we can not swap (we know that
2520                  branches only write to RD or to $31).  */
2521               || (! mips_opts.mips16
2522                   && (pinfo & INSN_WRITE_GPR_D)
2523                   && insn_uses_reg (&prev_insn,
2524                                     ((ip->insn_opcode >> OP_SH_RD)
2525                                      & OP_MASK_RD),
2526                                     MIPS_GR_REG))
2527               || (! mips_opts.mips16
2528                   && (pinfo & INSN_WRITE_GPR_31)
2529                   && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2530               || (mips_opts.mips16
2531                   && (pinfo & MIPS16_INSN_WRITE_31)
2532                   && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2533               /* If we are generating embedded PIC code, the branch
2534                  might be expanded into a sequence which uses $at, so
2535                  we can't swap with an instruction which reads it.  */
2536               || (mips_pic == EMBEDDED_PIC
2537                   && insn_uses_reg (&prev_insn, AT, MIPS_GR_REG))
2538               /* If the previous previous instruction has a load
2539                  delay, and sets a register that the branch reads, we
2540                  can not swap.  */
2541               || (! mips_opts.mips16
2542                   && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2543               /* Itbl support may require additional care here.  */
2544                   && ((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2545                       || (! gpr_interlocks
2546                           && (prev_prev_insn.insn_mo->pinfo
2547                               & INSN_LOAD_MEMORY_DELAY)))
2548                   && insn_uses_reg (ip,
2549                                     ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2550                                      & OP_MASK_RT),
2551                                     MIPS_GR_REG))
2552               /* If one instruction sets a condition code and the
2553                  other one uses a condition code, we can not swap.  */
2554               || ((pinfo & INSN_READ_COND_CODE)
2555                   && (prev_pinfo & INSN_WRITE_COND_CODE))
2556               || ((pinfo & INSN_WRITE_COND_CODE)
2557                   && (prev_pinfo & INSN_READ_COND_CODE))
2558               /* If the previous instruction uses the PC, we can not
2559                  swap.  */
2560               || (mips_opts.mips16
2561                   && (prev_pinfo & MIPS16_INSN_READ_PC))
2562               /* If the previous instruction was extended, we can not
2563                  swap.  */
2564               || (mips_opts.mips16 && prev_insn_extended)
2565               /* If the previous instruction had a fixup in mips16
2566                  mode, we can not swap.  This normally means that the
2567                  previous instruction was a 4 byte branch anyhow.  */
2568               || (mips_opts.mips16 && prev_insn_fixp[0])
2569               /* If the previous instruction is a sync, sync.l, or
2570                  sync.p, we can not swap.  */
2571               || (prev_pinfo & INSN_SYNC))
2572             {
2573               /* We could do even better for unconditional branches to
2574                  portions of this object file; we could pick up the
2575                  instruction at the destination, put it in the delay
2576                  slot, and bump the destination address.  */
2577               emit_nop ();
2578               /* Update the previous insn information.  */
2579               prev_prev_insn = *ip;
2580               prev_insn.insn_mo = &dummy_opcode;
2581             }
2582           else
2583             {
2584               /* It looks like we can actually do the swap.  */
2585               if (! mips_opts.mips16)
2586                 {
2587                   char *prev_f;
2588                   char temp[4];
2589
2590                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2591                   memcpy (temp, prev_f, 4);
2592                   memcpy (prev_f, f, 4);
2593                   memcpy (f, temp, 4);
2594                   if (prev_insn_fixp[0])
2595                     {
2596                       prev_insn_fixp[0]->fx_frag = frag_now;
2597                       prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2598                     }
2599                   if (prev_insn_fixp[1])
2600                     {
2601                       prev_insn_fixp[1]->fx_frag = frag_now;
2602                       prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2603                     }
2604                   if (prev_insn_fixp[2])
2605                     {
2606                       prev_insn_fixp[2]->fx_frag = frag_now;
2607                       prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
2608                     }
2609                   if (fixp[0])
2610                     {
2611                       fixp[0]->fx_frag = prev_insn_frag;
2612                       fixp[0]->fx_where = prev_insn_where;
2613                     }
2614                   if (fixp[1])
2615                     {
2616                       fixp[1]->fx_frag = prev_insn_frag;
2617                       fixp[1]->fx_where = prev_insn_where;
2618                     }
2619                   if (fixp[2])
2620                     {
2621                       fixp[2]->fx_frag = prev_insn_frag;
2622                       fixp[2]->fx_where = prev_insn_where;
2623                     }
2624                 }
2625               else
2626                 {
2627                   char *prev_f;
2628                   char temp[2];
2629
2630                   assert (prev_insn_fixp[0] == NULL);
2631                   assert (prev_insn_fixp[1] == NULL);
2632                   assert (prev_insn_fixp[2] == NULL);
2633                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2634                   memcpy (temp, prev_f, 2);
2635                   memcpy (prev_f, f, 2);
2636                   if (*reloc_type != BFD_RELOC_MIPS16_JMP)
2637                     {
2638                       assert (*reloc_type == BFD_RELOC_UNUSED);
2639                       memcpy (f, temp, 2);
2640                     }
2641                   else
2642                     {
2643                       memcpy (f, f + 2, 2);
2644                       memcpy (f + 2, temp, 2);
2645                     }
2646                   if (fixp[0])
2647                     {
2648                       fixp[0]->fx_frag = prev_insn_frag;
2649                       fixp[0]->fx_where = prev_insn_where;
2650                     }
2651                   if (fixp[1])
2652                     {
2653                       fixp[1]->fx_frag = prev_insn_frag;
2654                       fixp[1]->fx_where = prev_insn_where;
2655                     }
2656                   if (fixp[2])
2657                     {
2658                       fixp[2]->fx_frag = prev_insn_frag;
2659                       fixp[2]->fx_where = prev_insn_where;
2660                     }
2661                 }
2662
2663               /* Update the previous insn information; leave prev_insn
2664                  unchanged.  */
2665               prev_prev_insn = *ip;
2666             }
2667           prev_insn_is_delay_slot = 1;
2668
2669           /* If that was an unconditional branch, forget the previous
2670              insn information.  */
2671           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2672             {
2673               prev_prev_insn.insn_mo = &dummy_opcode;
2674               prev_insn.insn_mo = &dummy_opcode;
2675             }
2676
2677           prev_insn_fixp[0] = NULL;
2678           prev_insn_fixp[1] = NULL;
2679           prev_insn_fixp[2] = NULL;
2680           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2681           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2682           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2683           prev_insn_extended = 0;
2684         }
2685       else if (pinfo & INSN_COND_BRANCH_LIKELY)
2686         {
2687           /* We don't yet optimize a branch likely.  What we should do
2688              is look at the target, copy the instruction found there
2689              into the delay slot, and increment the branch to jump to
2690              the next instruction.  */
2691           emit_nop ();
2692           /* Update the previous insn information.  */
2693           prev_prev_insn = *ip;
2694           prev_insn.insn_mo = &dummy_opcode;
2695           prev_insn_fixp[0] = NULL;
2696           prev_insn_fixp[1] = NULL;
2697           prev_insn_fixp[2] = NULL;
2698           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2699           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2700           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2701           prev_insn_extended = 0;
2702         }
2703       else
2704         {
2705           /* Update the previous insn information.  */
2706           if (nops > 0)
2707             prev_prev_insn.insn_mo = &dummy_opcode;
2708           else
2709             prev_prev_insn = prev_insn;
2710           prev_insn = *ip;
2711
2712           /* Any time we see a branch, we always fill the delay slot
2713              immediately; since this insn is not a branch, we know it
2714              is not in a delay slot.  */
2715           prev_insn_is_delay_slot = 0;
2716
2717           prev_insn_fixp[0] = fixp[0];
2718           prev_insn_fixp[1] = fixp[1];
2719           prev_insn_fixp[2] = fixp[2];
2720           prev_insn_reloc_type[0] = reloc_type[0];
2721           prev_insn_reloc_type[1] = reloc_type[1];
2722           prev_insn_reloc_type[2] = reloc_type[2];
2723           if (mips_opts.mips16)
2724             prev_insn_extended = (ip->use_extend
2725                                   || *reloc_type > BFD_RELOC_UNUSED);
2726         }
2727
2728       prev_prev_insn_unreordered = prev_insn_unreordered;
2729       prev_insn_unreordered = 0;
2730       prev_insn_frag = frag_now;
2731       prev_insn_where = f - frag_now->fr_literal;
2732       prev_insn_valid = 1;
2733     }
2734   else if (place == NULL)
2735     {
2736       /* We need to record a bit of information even when we are not
2737          reordering, in order to determine the base address for mips16
2738          PC relative relocs.  */
2739       prev_prev_insn = prev_insn;
2740       prev_insn = *ip;
2741       prev_insn_reloc_type[0] = reloc_type[0];
2742       prev_insn_reloc_type[1] = reloc_type[1];
2743       prev_insn_reloc_type[2] = reloc_type[2];
2744       prev_prev_insn_unreordered = prev_insn_unreordered;
2745       prev_insn_unreordered = 1;
2746     }
2747
2748   /* We just output an insn, so the next one doesn't have a label.  */
2749   mips_clear_insn_labels ();
2750 }
2751
2752 /* This function forgets that there was any previous instruction or
2753    label.  If PRESERVE is non-zero, it remembers enough information to
2754    know whether nops are needed before a noreorder section.  */
2755
2756 static void
2757 mips_no_prev_insn (preserve)
2758      int preserve;
2759 {
2760   if (! preserve)
2761     {
2762       prev_insn.insn_mo = &dummy_opcode;
2763       prev_prev_insn.insn_mo = &dummy_opcode;
2764       prev_nop_frag = NULL;
2765       prev_nop_frag_holds = 0;
2766       prev_nop_frag_required = 0;
2767       prev_nop_frag_since = 0;
2768     }
2769   prev_insn_valid = 0;
2770   prev_insn_is_delay_slot = 0;
2771   prev_insn_unreordered = 0;
2772   prev_insn_extended = 0;
2773   prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2774   prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2775   prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2776   prev_prev_insn_unreordered = 0;
2777   mips_clear_insn_labels ();
2778 }
2779
2780 /* This function must be called whenever we turn on noreorder or emit
2781    something other than instructions.  It inserts any NOPS which might
2782    be needed by the previous instruction, and clears the information
2783    kept for the previous instructions.  The INSNS parameter is true if
2784    instructions are to follow.  */
2785
2786 static void
2787 mips_emit_delays (insns)
2788      bfd_boolean insns;
2789 {
2790   if (! mips_opts.noreorder)
2791     {
2792       int nops;
2793
2794       nops = 0;
2795       if ((! mips_opts.mips16
2796            && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2797            && (! cop_interlocks
2798                && (prev_insn.insn_mo->pinfo
2799                    & (INSN_LOAD_COPROC_DELAY
2800                       | INSN_COPROC_MOVE_DELAY
2801                       | INSN_WRITE_COND_CODE))))
2802           || (! hilo_interlocks
2803               && (prev_insn.insn_mo->pinfo
2804                   & (INSN_READ_LO
2805                      | INSN_READ_HI)))
2806           || (! mips_opts.mips16
2807               && ! gpr_interlocks
2808               && (prev_insn.insn_mo->pinfo
2809                   & INSN_LOAD_MEMORY_DELAY))
2810           || (! mips_opts.mips16
2811               && mips_opts.isa == ISA_MIPS1
2812               && (prev_insn.insn_mo->pinfo
2813                   & INSN_COPROC_MEMORY_DELAY)))
2814         {
2815           /* Itbl support may require additional care here.  */
2816           ++nops;
2817           if ((! mips_opts.mips16
2818                && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2819                && (! cop_interlocks
2820                    && prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2821               || (! hilo_interlocks
2822                   && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2823                       || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2824             ++nops;
2825
2826           if (prev_insn_unreordered)
2827             nops = 0;
2828         }
2829       else if ((! mips_opts.mips16
2830                 && ISA_HAS_COPROC_DELAYS (mips_opts.isa)
2831                 && (! cop_interlocks
2832                     && prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE))
2833                || (! hilo_interlocks
2834                    && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2835                        || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2836         {
2837           /* Itbl support may require additional care here.  */
2838           if (! prev_prev_insn_unreordered)
2839             ++nops;
2840         }
2841
2842       if (mips_fix_4122_bugs && prev_insn.insn_mo->name)
2843         {
2844           int min_nops = 0;
2845           const char *pn = prev_insn.insn_mo->name;
2846           if (strncmp(pn, "macc", 4) == 0
2847               || strncmp(pn, "dmacc", 5) == 0
2848               || strncmp(pn, "dmult", 5) == 0)
2849             {
2850               min_nops = 1;
2851             }
2852           if (nops < min_nops)
2853             nops = min_nops;
2854         }
2855
2856       if (nops > 0)
2857         {
2858           struct insn_label_list *l;
2859
2860           if (insns)
2861             {
2862               /* Record the frag which holds the nop instructions, so
2863                  that we can remove them if we don't need them.  */
2864               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2865               prev_nop_frag = frag_now;
2866               prev_nop_frag_holds = nops;
2867               prev_nop_frag_required = 0;
2868               prev_nop_frag_since = 0;
2869             }
2870
2871           for (; nops > 0; --nops)
2872             emit_nop ();
2873
2874           if (insns)
2875             {
2876               /* Move on to a new frag, so that it is safe to simply
2877                  decrease the size of prev_nop_frag.  */
2878               frag_wane (frag_now);
2879               frag_new (0);
2880             }
2881
2882           for (l = insn_labels; l != NULL; l = l->next)
2883             {
2884               valueT val;
2885
2886               assert (S_GET_SEGMENT (l->label) == now_seg);
2887               symbol_set_frag (l->label, frag_now);
2888               val = (valueT) frag_now_fix ();
2889               /* mips16 text labels are stored as odd.  */
2890               if (mips_opts.mips16)
2891                 ++val;
2892               S_SET_VALUE (l->label, val);
2893             }
2894         }
2895     }
2896
2897   /* Mark instruction labels in mips16 mode.  */
2898   if (insns)
2899     mips16_mark_labels ();
2900
2901   mips_no_prev_insn (insns);
2902 }
2903
2904 /* Build an instruction created by a macro expansion.  This is passed
2905    a pointer to the count of instructions created so far, an
2906    expression, the name of the instruction to build, an operand format
2907    string, and corresponding arguments.  */
2908
2909 #ifdef USE_STDARG
2910 static void
2911 macro_build (char *place,
2912              int *counter,
2913              expressionS * ep,
2914              const char *name,
2915              const char *fmt,
2916              ...)
2917 #else
2918 static void
2919 macro_build (place, counter, ep, name, fmt, va_alist)
2920      char *place;
2921      int *counter;
2922      expressionS *ep;
2923      const char *name;
2924      const char *fmt;
2925      va_dcl
2926 #endif
2927 {
2928   struct mips_cl_insn insn;
2929   bfd_reloc_code_real_type r[3];
2930   va_list args;
2931
2932 #ifdef USE_STDARG
2933   va_start (args, fmt);
2934 #else
2935   va_start (args);
2936 #endif
2937
2938   /*
2939    * If the macro is about to expand into a second instruction,
2940    * print a warning if needed. We need to pass ip as a parameter
2941    * to generate a better warning message here...
2942    */
2943   if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
2944     as_warn (_("Macro instruction expanded into multiple instructions"));
2945
2946   /*
2947    * If the macro is about to expand into a second instruction,
2948    * and it is in a delay slot, print a warning.
2949    */
2950   if (place == NULL
2951       && *counter == 1
2952       && mips_opts.noreorder
2953       && (prev_prev_insn.insn_mo->pinfo
2954           & (INSN_UNCOND_BRANCH_DELAY | INSN_COND_BRANCH_DELAY
2955              | INSN_COND_BRANCH_LIKELY)) != 0)
2956     as_warn (_("Macro instruction expanded into multiple instructions in a branch delay slot"));
2957
2958   if (place == NULL)
2959     ++*counter;         /* bump instruction counter */
2960
2961   if (mips_opts.mips16)
2962     {
2963       mips16_macro_build (place, counter, ep, name, fmt, args);
2964       va_end (args);
2965       return;
2966     }
2967
2968   r[0] = BFD_RELOC_UNUSED;
2969   r[1] = BFD_RELOC_UNUSED;
2970   r[2] = BFD_RELOC_UNUSED;
2971   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2972   assert (insn.insn_mo);
2973   assert (strcmp (name, insn.insn_mo->name) == 0);
2974
2975   /* Search until we get a match for NAME.  */
2976   while (1)
2977     {
2978       /* It is assumed here that macros will never generate
2979          MDMX or MIPS-3D instructions.  */
2980       if (strcmp (fmt, insn.insn_mo->args) == 0
2981           && insn.insn_mo->pinfo != INSN_MACRO
2982           && OPCODE_IS_MEMBER (insn.insn_mo,
2983                                (mips_opts.isa
2984                                 | (file_ase_mips16 ? INSN_MIPS16 : 0)),
2985                                mips_arch)
2986           && (mips_arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
2987         break;
2988
2989       ++insn.insn_mo;
2990       assert (insn.insn_mo->name);
2991       assert (strcmp (name, insn.insn_mo->name) == 0);
2992     }
2993
2994   insn.insn_opcode = insn.insn_mo->match;
2995   for (;;)
2996     {
2997       switch (*fmt++)
2998         {
2999         case '\0':
3000           break;
3001
3002         case ',':
3003         case '(':
3004         case ')':
3005           continue;
3006
3007         case 't':
3008         case 'w':
3009         case 'E':
3010           insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
3011           continue;
3012
3013         case 'c':
3014           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
3015           continue;
3016
3017         case 'T':
3018         case 'W':
3019           insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
3020           continue;
3021
3022         case 'd':
3023         case 'G':
3024         case 'K':
3025           insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
3026           continue;
3027
3028         case 'U':
3029           {
3030             int tmp = va_arg (args, int);
3031
3032             insn.insn_opcode |= tmp << OP_SH_RT;
3033             insn.insn_opcode |= tmp << OP_SH_RD;
3034             continue;
3035           }
3036
3037         case 'V':
3038         case 'S':
3039           insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
3040           continue;
3041
3042         case 'z':
3043           continue;
3044
3045         case '<':
3046           insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
3047           continue;
3048
3049         case 'D':
3050           insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
3051           continue;
3052
3053         case 'B':
3054           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
3055           continue;
3056
3057         case 'J':
3058           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
3059           continue;
3060
3061         case 'q':
3062           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
3063           continue;
3064
3065         case 'b':
3066         case 's':
3067         case 'r':
3068         case 'v':
3069           insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
3070           continue;
3071
3072         case 'i':
3073         case 'j':
3074         case 'o':
3075           *r = (bfd_reloc_code_real_type) va_arg (args, int);
3076           assert (*r == BFD_RELOC_GPREL16
3077                   || *r == BFD_RELOC_MIPS_LITERAL
3078                   || *r == BFD_RELOC_MIPS_HIGHER
3079                   || *r == BFD_RELOC_HI16_S
3080                   || *r == BFD_RELOC_LO16
3081                   || *r == BFD_RELOC_MIPS_GOT16
3082                   || *r == BFD_RELOC_MIPS_CALL16
3083                   || *r == BFD_RELOC_MIPS_GOT_DISP
3084                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3085                   || *r == BFD_RELOC_MIPS_GOT_OFST
3086                   || *r == BFD_RELOC_MIPS_GOT_LO16
3087                   || *r == BFD_RELOC_MIPS_CALL_LO16
3088                   || (ep->X_op == O_subtract
3089                       && *r == BFD_RELOC_PCREL_LO16));
3090           continue;
3091
3092         case 'u':
3093           *r = (bfd_reloc_code_real_type) va_arg (args, int);
3094           assert (ep != NULL
3095                   && (ep->X_op == O_constant
3096                       || (ep->X_op == O_symbol
3097                           && (*r == BFD_RELOC_MIPS_HIGHEST
3098                               || *r == BFD_RELOC_HI16_S
3099                               || *r == BFD_RELOC_HI16
3100                               || *r == BFD_RELOC_GPREL16
3101                               || *r == BFD_RELOC_MIPS_GOT_HI16
3102                               || *r == BFD_RELOC_MIPS_CALL_HI16))
3103                       || (ep->X_op == O_subtract
3104                           && *r == BFD_RELOC_PCREL_HI16_S)));
3105           continue;
3106
3107         case 'p':
3108           assert (ep != NULL);
3109           /*
3110            * This allows macro() to pass an immediate expression for
3111            * creating short branches without creating a symbol.
3112            * Note that the expression still might come from the assembly
3113            * input, in which case the value is not checked for range nor
3114            * is a relocation entry generated (yuck).
3115            */
3116           if (ep->X_op == O_constant)
3117             {
3118               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3119               ep = NULL;
3120             }
3121           else
3122             *r = BFD_RELOC_16_PCREL_S2;
3123           continue;
3124
3125         case 'a':
3126           assert (ep != NULL);
3127           *r = BFD_RELOC_MIPS_JMP;
3128           continue;
3129
3130         case 'C':
3131           insn.insn_opcode |= va_arg (args, unsigned long);
3132           continue;
3133
3134         default:
3135           internalError ();
3136         }
3137       break;
3138     }
3139   va_end (args);
3140   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3141
3142   append_insn (place, &insn, ep, r);
3143 }
3144
3145 static void
3146 mips16_macro_build (place, counter, ep, name, fmt, args)
3147      char *place;
3148      int *counter ATTRIBUTE_UNUSED;
3149      expressionS *ep;
3150      const char *name;
3151      const char *fmt;
3152      va_list args;
3153 {
3154   struct mips_cl_insn insn;
3155   bfd_reloc_code_real_type r[3]
3156     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3157
3158   insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3159   assert (insn.insn_mo);
3160   assert (strcmp (name, insn.insn_mo->name) == 0);
3161
3162   while (strcmp (fmt, insn.insn_mo->args) != 0
3163          || insn.insn_mo->pinfo == INSN_MACRO)
3164     {
3165       ++insn.insn_mo;
3166       assert (insn.insn_mo->name);
3167       assert (strcmp (name, insn.insn_mo->name) == 0);
3168     }
3169
3170   insn.insn_opcode = insn.insn_mo->match;
3171   insn.use_extend = FALSE;
3172
3173   for (;;)
3174     {
3175       int c;
3176
3177       c = *fmt++;
3178       switch (c)
3179         {
3180         case '\0':
3181           break;
3182
3183         case ',':
3184         case '(':
3185         case ')':
3186           continue;
3187
3188         case 'y':
3189         case 'w':
3190           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3191           continue;
3192
3193         case 'x':
3194         case 'v':
3195           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3196           continue;
3197
3198         case 'z':
3199           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3200           continue;
3201
3202         case 'Z':
3203           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3204           continue;
3205
3206         case '0':
3207         case 'S':
3208         case 'P':
3209         case 'R':
3210           continue;
3211
3212         case 'X':
3213           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3214           continue;
3215
3216         case 'Y':
3217           {
3218             int regno;
3219
3220             regno = va_arg (args, int);
3221             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3222             insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3223           }
3224           continue;
3225
3226         case '<':
3227         case '>':
3228         case '4':
3229         case '5':
3230         case 'H':
3231         case 'W':
3232         case 'D':
3233         case 'j':
3234         case '8':
3235         case 'V':
3236         case 'C':
3237         case 'U':
3238         case 'k':
3239         case 'K':
3240         case 'p':
3241         case 'q':
3242           {
3243             assert (ep != NULL);
3244
3245             if (ep->X_op != O_constant)
3246               *r = (int) BFD_RELOC_UNUSED + c;
3247             else
3248               {
3249                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3250                               FALSE, &insn.insn_opcode, &insn.use_extend,
3251                               &insn.extend);
3252                 ep = NULL;
3253                 *r = BFD_RELOC_UNUSED;
3254               }
3255           }
3256           continue;
3257
3258         case '6':
3259           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3260           continue;
3261         }
3262
3263       break;
3264     }
3265
3266   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3267
3268   append_insn (place, &insn, ep, r);
3269 }
3270
3271 /*
3272  * Generate a "jalr" instruction with a relocation hint to the called
3273  * function.  This occurs in NewABI PIC code.
3274  */
3275 static void
3276 macro_build_jalr (icnt, ep)
3277      int icnt;
3278      expressionS *ep;
3279 {
3280   char *f;
3281
3282   if (HAVE_NEWABI)
3283     {
3284       frag_grow (4);
3285       f = frag_more (0);
3286     }
3287   macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr", "d,s",
3288                RA, PIC_CALL_REG);
3289   if (HAVE_NEWABI)
3290     fix_new_exp (frag_now, f - frag_now->fr_literal,
3291                  0, ep, FALSE, BFD_RELOC_MIPS_JALR);
3292 }
3293
3294 /*
3295  * Generate a "lui" instruction.
3296  */
3297 static void
3298 macro_build_lui (place, counter, ep, regnum)
3299      char *place;
3300      int *counter;
3301      expressionS *ep;
3302      int regnum;
3303 {
3304   expressionS high_expr;
3305   struct mips_cl_insn insn;
3306   bfd_reloc_code_real_type r[3]
3307     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3308   const char *name = "lui";
3309   const char *fmt = "t,u";
3310
3311   assert (! mips_opts.mips16);
3312
3313   if (place == NULL)
3314     high_expr = *ep;
3315   else
3316     {
3317       high_expr.X_op = O_constant;
3318       high_expr.X_add_number = ep->X_add_number;
3319     }
3320
3321   if (high_expr.X_op == O_constant)
3322     {
3323       /* we can compute the instruction now without a relocation entry */
3324       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3325                                 >> 16) & 0xffff;
3326       *r = BFD_RELOC_UNUSED;
3327     }
3328   else
3329     {
3330       assert (ep->X_op == O_symbol);
3331       /* _gp_disp is a special case, used from s_cpload.  */
3332       assert (mips_pic == NO_PIC
3333               || (! HAVE_NEWABI
3334                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
3335       *r = BFD_RELOC_HI16_S;
3336     }
3337
3338   /*
3339    * If the macro is about to expand into a second instruction,
3340    * print a warning if needed. We need to pass ip as a parameter
3341    * to generate a better warning message here...
3342    */
3343   if (mips_opts.warn_about_macros && place == NULL && *counter == 1)
3344     as_warn (_("Macro instruction expanded into multiple instructions"));
3345
3346   if (place == NULL)
3347     ++*counter;         /* bump instruction counter */
3348
3349   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3350   assert (insn.insn_mo);
3351   assert (strcmp (name, insn.insn_mo->name) == 0);
3352   assert (strcmp (fmt, insn.insn_mo->args) == 0);
3353
3354   insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
3355   if (*r == BFD_RELOC_UNUSED)
3356     {
3357       insn.insn_opcode |= high_expr.X_add_number;
3358       append_insn (place, &insn, NULL, r);
3359     }
3360   else
3361     append_insn (place, &insn, &high_expr, r);
3362 }
3363
3364 /* Generate a sequence of instructions to do a load or store from a constant
3365    offset off of a base register (breg) into/from a target register (treg),
3366    using AT if necessary.  */
3367 static void
3368 macro_build_ldst_constoffset (place, counter, ep, op, treg, breg)
3369      char *place;
3370      int *counter;
3371      expressionS *ep;
3372      const char *op;
3373      int treg, breg;
3374 {
3375   assert (ep->X_op == O_constant);
3376
3377   /* Right now, this routine can only handle signed 32-bit contants.  */
3378   if (! IS_SEXT_32BIT_NUM(ep->X_add_number))
3379     as_warn (_("operand overflow"));
3380
3381   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3382     {
3383       /* Signed 16-bit offset will fit in the op.  Easy!  */
3384       macro_build (place, counter, ep, op, "t,o(b)", treg,
3385                    (int) BFD_RELOC_LO16, breg);
3386     }
3387   else
3388     {
3389       /* 32-bit offset, need multiple instructions and AT, like:
3390            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3391            addu     $tempreg,$tempreg,$breg
3392            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3393          to handle the complete offset.  */
3394       macro_build_lui (place, counter, ep, AT);
3395       if (place != NULL)
3396         place += 4;
3397       macro_build (place, counter, (expressionS *) NULL,
3398                    HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
3399                    "d,v,t", AT, AT, breg);
3400       if (place != NULL)
3401         place += 4;
3402       macro_build (place, counter, ep, op, "t,o(b)", treg,
3403                    (int) BFD_RELOC_LO16, AT);
3404
3405       if (mips_opts.noat)
3406         as_warn (_("Macro used $at after \".set noat\""));
3407     }
3408 }
3409
3410 /*                      set_at()
3411  * Generates code to set the $at register to true (one)
3412  * if reg is less than the immediate expression.
3413  */
3414 static void
3415 set_at (counter, reg, unsignedp)
3416      int *counter;
3417      int reg;
3418      int unsignedp;
3419 {
3420   if (imm_expr.X_op == O_constant
3421       && imm_expr.X_add_number >= -0x8000
3422       && imm_expr.X_add_number < 0x8000)
3423     macro_build ((char *) NULL, counter, &imm_expr,
3424                  unsignedp ? "sltiu" : "slti",
3425                  "t,r,j", AT, reg, (int) BFD_RELOC_LO16);
3426   else
3427     {
3428       load_register (counter, AT, &imm_expr, HAVE_64BIT_GPRS);
3429       macro_build ((char *) NULL, counter, (expressionS *) NULL,
3430                    unsignedp ? "sltu" : "slt",
3431                    "d,v,t", AT, reg, AT);
3432     }
3433 }
3434
3435 /* Warn if an expression is not a constant.  */
3436
3437 static void
3438 check_absolute_expr (ip, ex)
3439      struct mips_cl_insn *ip;
3440      expressionS *ex;
3441 {
3442   if (ex->X_op == O_big)
3443     as_bad (_("unsupported large constant"));
3444   else if (ex->X_op != O_constant)
3445     as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3446 }
3447
3448 /* Count the leading zeroes by performing a binary chop. This is a
3449    bulky bit of source, but performance is a LOT better for the
3450    majority of values than a simple loop to count the bits:
3451        for (lcnt = 0; (lcnt < 32); lcnt++)
3452          if ((v) & (1 << (31 - lcnt)))
3453            break;
3454   However it is not code size friendly, and the gain will drop a bit
3455   on certain cached systems.
3456 */
3457 #define COUNT_TOP_ZEROES(v)             \
3458   (((v) & ~0xffff) == 0                 \
3459    ? ((v) & ~0xff) == 0                 \
3460      ? ((v) & ~0xf) == 0                \
3461        ? ((v) & ~0x3) == 0              \
3462          ? ((v) & ~0x1) == 0            \
3463            ? !(v)                       \
3464              ? 32                       \
3465              : 31                       \
3466            : 30                         \
3467          : ((v) & ~0x7) == 0            \
3468            ? 29                         \
3469            : 28                         \
3470        : ((v) & ~0x3f) == 0             \
3471          ? ((v) & ~0x1f) == 0           \
3472            ? 27                         \
3473            : 26                         \
3474          : ((v) & ~0x7f) == 0           \
3475            ? 25                         \
3476            : 24                         \
3477      : ((v) & ~0xfff) == 0              \
3478        ? ((v) & ~0x3ff) == 0            \
3479          ? ((v) & ~0x1ff) == 0          \
3480            ? 23                         \
3481            : 22                         \
3482          : ((v) & ~0x7ff) == 0          \
3483            ? 21                         \
3484            : 20                         \
3485        : ((v) & ~0x3fff) == 0           \
3486          ? ((v) & ~0x1fff) == 0         \
3487            ? 19                         \
3488            : 18                         \
3489          : ((v) & ~0x7fff) == 0         \
3490            ? 17                         \
3491            : 16                         \
3492    : ((v) & ~0xffffff) == 0             \
3493      ? ((v) & ~0xfffff) == 0            \
3494        ? ((v) & ~0x3ffff) == 0          \
3495          ? ((v) & ~0x1ffff) == 0        \
3496            ? 15                         \
3497            : 14                         \
3498          : ((v) & ~0x7ffff) == 0        \
3499            ? 13                         \
3500            : 12                         \
3501        : ((v) & ~0x3fffff) == 0         \
3502          ? ((v) & ~0x1fffff) == 0       \
3503            ? 11                         \
3504            : 10                         \
3505          : ((v) & ~0x7fffff) == 0       \
3506            ? 9                          \
3507            : 8                          \
3508      : ((v) & ~0xfffffff) == 0          \
3509        ? ((v) & ~0x3ffffff) == 0        \
3510          ? ((v) & ~0x1ffffff) == 0      \
3511            ? 7                          \
3512            : 6                          \
3513          : ((v) & ~0x7ffffff) == 0      \
3514            ? 5                          \
3515            : 4                          \
3516        : ((v) & ~0x3fffffff) == 0       \
3517          ? ((v) & ~0x1fffffff) == 0     \
3518            ? 3                          \
3519            : 2                          \
3520          : ((v) & ~0x7fffffff) == 0     \
3521            ? 1                          \
3522            : 0)
3523
3524 /*                      load_register()
3525  *  This routine generates the least number of instructions neccessary to load
3526  *  an absolute expression value into a register.
3527  */
3528 static void
3529 load_register (counter, reg, ep, dbl)
3530      int *counter;
3531      int reg;
3532      expressionS *ep;
3533      int dbl;
3534 {
3535   int freg;
3536   expressionS hi32, lo32;
3537
3538   if (ep->X_op != O_big)
3539     {
3540       assert (ep->X_op == O_constant);
3541       if (ep->X_add_number < 0x8000
3542           && (ep->X_add_number >= 0
3543               || (ep->X_add_number >= -0x8000
3544                   && (! dbl
3545                       || ! ep->X_unsigned
3546                       || sizeof (ep->X_add_number) > 4))))
3547         {
3548           /* We can handle 16 bit signed values with an addiu to
3549              $zero.  No need to ever use daddiu here, since $zero and
3550              the result are always correct in 32 bit mode.  */
3551           macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3552                        (int) BFD_RELOC_LO16);
3553           return;
3554         }
3555       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3556         {
3557           /* We can handle 16 bit unsigned values with an ori to
3558              $zero.  */
3559           macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, 0,
3560                        (int) BFD_RELOC_LO16);
3561           return;
3562         }
3563       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)
3564                 && (! dbl
3565                     || ! ep->X_unsigned
3566                     || sizeof (ep->X_add_number) > 4
3567                     || (ep->X_add_number & 0x80000000) == 0))
3568                || ((HAVE_32BIT_GPRS || ! dbl)
3569                    && (ep->X_add_number &~ (offsetT) 0xffffffff) == 0)
3570                || (HAVE_32BIT_GPRS
3571                    && ! dbl
3572                    && ((ep->X_add_number &~ (offsetT) 0xffffffff)
3573                        == ~ (offsetT) 0xffffffff)))
3574         {
3575           /* 32 bit values require an lui.  */
3576           macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3577                        (int) BFD_RELOC_HI16);
3578           if ((ep->X_add_number & 0xffff) != 0)
3579             macro_build ((char *) NULL, counter, ep, "ori", "t,r,i", reg, reg,
3580                          (int) BFD_RELOC_LO16);
3581           return;
3582         }
3583     }
3584
3585   /* The value is larger than 32 bits.  */
3586
3587   if (HAVE_32BIT_GPRS)
3588     {
3589       as_bad (_("Number (0x%lx) larger than 32 bits"),
3590               (unsigned long) ep->X_add_number);
3591       macro_build ((char *) NULL, counter, ep, "addiu", "t,r,j", reg, 0,
3592                    (int) BFD_RELOC_LO16);
3593       return;
3594     }
3595
3596   if (ep->X_op != O_big)
3597     {
3598       hi32 = *ep;
3599       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3600       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3601       hi32.X_add_number &= 0xffffffff;
3602       lo32 = *ep;
3603       lo32.X_add_number &= 0xffffffff;
3604     }
3605   else
3606     {
3607       assert (ep->X_add_number > 2);
3608       if (ep->X_add_number == 3)
3609         generic_bignum[3] = 0;
3610       else if (ep->X_add_number > 4)
3611         as_bad (_("Number larger than 64 bits"));
3612       lo32.X_op = O_constant;
3613       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3614       hi32.X_op = O_constant;
3615       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3616     }
3617
3618   if (hi32.X_add_number == 0)
3619     freg = 0;
3620   else
3621     {
3622       int shift, bit;
3623       unsigned long hi, lo;
3624
3625       if (hi32.X_add_number == (offsetT) 0xffffffff)
3626         {
3627           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3628             {
3629               macro_build ((char *) NULL, counter, &lo32, "addiu", "t,r,j",
3630                            reg, 0, (int) BFD_RELOC_LO16);
3631               return;
3632             }
3633           if (lo32.X_add_number & 0x80000000)
3634             {
3635               macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3636                            (int) BFD_RELOC_HI16);
3637               if (lo32.X_add_number & 0xffff)
3638                 macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i",
3639                              reg, reg, (int) BFD_RELOC_LO16);
3640               return;
3641             }
3642         }
3643
3644       /* Check for 16bit shifted constant.  We know that hi32 is
3645          non-zero, so start the mask on the first bit of the hi32
3646          value.  */
3647       shift = 17;
3648       do
3649         {
3650           unsigned long himask, lomask;
3651
3652           if (shift < 32)
3653             {
3654               himask = 0xffff >> (32 - shift);
3655               lomask = (0xffff << shift) & 0xffffffff;
3656             }
3657           else
3658             {
3659               himask = 0xffff << (shift - 32);
3660               lomask = 0;
3661             }
3662           if ((hi32.X_add_number & ~(offsetT) himask) == 0
3663               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3664             {
3665               expressionS tmp;
3666
3667               tmp.X_op = O_constant;
3668               if (shift < 32)
3669                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3670                                     | (lo32.X_add_number >> shift));
3671               else
3672                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3673               macro_build ((char *) NULL, counter, &tmp,
3674                            "ori", "t,r,i", reg, 0,
3675                            (int) BFD_RELOC_LO16);
3676               macro_build ((char *) NULL, counter, (expressionS *) NULL,
3677                            (shift >= 32) ? "dsll32" : "dsll",
3678                            "d,w,<", reg, reg,
3679                            (shift >= 32) ? shift - 32 : shift);
3680               return;
3681             }
3682           ++shift;
3683         }
3684       while (shift <= (64 - 16));
3685
3686       /* Find the bit number of the lowest one bit, and store the
3687          shifted value in hi/lo.  */
3688       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3689       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3690       if (lo != 0)
3691         {
3692           bit = 0;
3693           while ((lo & 1) == 0)
3694             {
3695               lo >>= 1;
3696               ++bit;
3697             }
3698           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3699           hi >>= bit;
3700         }
3701       else
3702         {
3703           bit = 32;
3704           while ((hi & 1) == 0)
3705             {
3706               hi >>= 1;
3707               ++bit;
3708             }
3709           lo = hi;
3710           hi = 0;
3711         }
3712
3713       /* Optimize if the shifted value is a (power of 2) - 1.  */
3714       if ((hi == 0 && ((lo + 1) & lo) == 0)
3715           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3716         {
3717           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3718           if (shift != 0)
3719             {
3720               expressionS tmp;
3721
3722               /* This instruction will set the register to be all
3723                  ones.  */
3724               tmp.X_op = O_constant;
3725               tmp.X_add_number = (offsetT) -1;
3726               macro_build ((char *) NULL, counter, &tmp, "addiu", "t,r,j",
3727                            reg, 0, (int) BFD_RELOC_LO16);
3728               if (bit != 0)
3729                 {
3730                   bit += shift;
3731                   macro_build ((char *) NULL, counter, (expressionS *) NULL,
3732                                (bit >= 32) ? "dsll32" : "dsll",
3733                                "d,w,<", reg, reg,
3734                                (bit >= 32) ? bit - 32 : bit);
3735                 }
3736               macro_build ((char *) NULL, counter, (expressionS *) NULL,
3737                            (shift >= 32) ? "dsrl32" : "dsrl",
3738                            "d,w,<", reg, reg,
3739                            (shift >= 32) ? shift - 32 : shift);
3740               return;
3741             }
3742         }
3743
3744       /* Sign extend hi32 before calling load_register, because we can
3745          generally get better code when we load a sign extended value.  */
3746       if ((hi32.X_add_number & 0x80000000) != 0)
3747         hi32.X_add_number |= ~(offsetT) 0xffffffff;
3748       load_register (counter, reg, &hi32, 0);
3749       freg = reg;
3750     }
3751   if ((lo32.X_add_number & 0xffff0000) == 0)
3752     {
3753       if (freg != 0)
3754         {
3755           macro_build ((char *) NULL, counter, (expressionS *) NULL,
3756                        "dsll32", "d,w,<", reg, freg, 0);
3757           freg = reg;
3758         }
3759     }
3760   else
3761     {
3762       expressionS mid16;
3763
3764       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3765         {
3766           macro_build ((char *) NULL, counter, &lo32, "lui", "t,u", reg,
3767                        (int) BFD_RELOC_HI16);
3768           macro_build ((char *) NULL, counter, (expressionS *) NULL,
3769                        "dsrl32", "d,w,<", reg, reg, 0);
3770           return;
3771         }
3772
3773       if (freg != 0)
3774         {
3775           macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3776                        "d,w,<", reg, freg, 16);
3777           freg = reg;
3778         }
3779       mid16 = lo32;
3780       mid16.X_add_number >>= 16;
3781       macro_build ((char *) NULL, counter, &mid16, "ori", "t,r,i", reg,
3782                    freg, (int) BFD_RELOC_LO16);
3783       macro_build ((char *) NULL, counter, (expressionS *) NULL, "dsll",
3784                    "d,w,<", reg, reg, 16);
3785       freg = reg;
3786     }
3787   if ((lo32.X_add_number & 0xffff) != 0)
3788     macro_build ((char *) NULL, counter, &lo32, "ori", "t,r,i", reg, freg,
3789                  (int) BFD_RELOC_LO16);
3790 }
3791
3792 /* Load an address into a register.  */
3793
3794 static void
3795 load_address (counter, reg, ep, used_at)
3796      int *counter;
3797      int reg;
3798      expressionS *ep;
3799      int *used_at;
3800 {
3801   char *p = NULL;
3802
3803   if (ep->X_op != O_constant
3804       && ep->X_op != O_symbol)
3805     {
3806       as_bad (_("expression too complex"));
3807       ep->X_op = O_constant;
3808     }
3809
3810   if (ep->X_op == O_constant)
3811     {
3812       load_register (counter, reg, ep, HAVE_64BIT_ADDRESSES);
3813       return;
3814     }
3815
3816   if (mips_pic == NO_PIC)
3817     {
3818       /* If this is a reference to a GP relative symbol, we want
3819            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
3820          Otherwise we want
3821            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
3822            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3823          If we have an addend, we always use the latter form.
3824
3825          With 64bit address space and a usable $at we want
3826            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3827            lui          $at,<sym>               (BFD_RELOC_HI16_S)
3828            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3829            daddiu       $at,<sym>               (BFD_RELOC_LO16)
3830            dsll32       $reg,0
3831            daddu        $reg,$reg,$at
3832
3833          If $at is already in use, we use a path which is suboptimal
3834          on superscalar processors.
3835            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
3836            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
3837            dsll         $reg,16
3838            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
3839            dsll         $reg,16
3840            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
3841        */
3842       if (HAVE_64BIT_ADDRESSES)
3843         {
3844           /* We don't do GP optimization for now because RELAX_ENCODE can't
3845              hold the data for such large chunks.  */
3846
3847           if (*used_at == 0 && ! mips_opts.noat)
3848             {
3849               macro_build (p, counter, ep, "lui", "t,u",
3850                            reg, (int) BFD_RELOC_MIPS_HIGHEST);
3851               macro_build (p, counter, ep, "lui", "t,u",
3852                            AT, (int) BFD_RELOC_HI16_S);
3853               macro_build (p, counter, ep, "daddiu", "t,r,j",
3854                            reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3855               macro_build (p, counter, ep, "daddiu", "t,r,j",
3856                            AT, AT, (int) BFD_RELOC_LO16);
3857               macro_build (p, counter, (expressionS *) NULL, "dsll32",
3858                            "d,w,<", reg, reg, 0);
3859               macro_build (p, counter, (expressionS *) NULL, "daddu",
3860                            "d,v,t", reg, reg, AT);
3861               *used_at = 1;
3862             }
3863           else
3864             {
3865               macro_build (p, counter, ep, "lui", "t,u",
3866                            reg, (int) BFD_RELOC_MIPS_HIGHEST);
3867               macro_build (p, counter, ep, "daddiu", "t,r,j",
3868                            reg, reg, (int) BFD_RELOC_MIPS_HIGHER);
3869               macro_build (p, counter, (expressionS *) NULL, "dsll",
3870                            "d,w,<", reg, reg, 16);
3871               macro_build (p, counter, ep, "daddiu", "t,r,j",
3872                            reg, reg, (int) BFD_RELOC_HI16_S);
3873               macro_build (p, counter, (expressionS *) NULL, "dsll",
3874                            "d,w,<", reg, reg, 16);
3875               macro_build (p, counter, ep, "daddiu", "t,r,j",
3876                            reg, reg, (int) BFD_RELOC_LO16);
3877             }
3878         }
3879       else
3880         {
3881           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3882               && ! nopic_need_relax (ep->X_add_symbol, 1))
3883             {
3884               frag_grow (20);
3885               macro_build ((char *) NULL, counter, ep,
3886                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
3887                            reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
3888               p = frag_var (rs_machine_dependent, 8, 0,
3889                             RELAX_ENCODE (4, 8, 0, 4, 0,
3890                                           mips_opts.warn_about_macros),
3891                             ep->X_add_symbol, 0, NULL);
3892             }
3893           macro_build_lui (p, counter, ep, reg);
3894           if (p != NULL)
3895             p += 4;
3896           macro_build (p, counter, ep,
3897                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3898                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3899         }
3900     }
3901   else if (mips_pic == SVR4_PIC && ! mips_big_got)
3902     {
3903       expressionS ex;
3904
3905       /* If this is a reference to an external symbol, we want
3906            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3907          Otherwise we want
3908            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3909            nop
3910            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3911          If we have NewABI, we want
3912            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_DISP)
3913          If there is a constant, it must be added in after.  */
3914       ex.X_add_number = ep->X_add_number;
3915       ep->X_add_number = 0;
3916       frag_grow (20);
3917       if (HAVE_NEWABI)
3918         {
3919           macro_build ((char *) NULL, counter, ep,
3920                        HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3921                        (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3922         }
3923       else
3924         {
3925           macro_build ((char *) NULL, counter, ep,
3926                        HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)",
3927                        reg, (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
3928           macro_build ((char *) NULL, counter, (expressionS *) NULL, "nop", "");
3929           p = frag_var (rs_machine_dependent, 4, 0,
3930                         RELAX_ENCODE (0, 4, -8, 0, 0, mips_opts.warn_about_macros),
3931                         ep->X_add_symbol, (offsetT) 0, (char *) NULL);
3932           macro_build (p, counter, ep,
3933                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3934                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3935         }
3936
3937       if (ex.X_add_number != 0)
3938         {
3939           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3940             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3941           ex.X_op = O_constant;
3942           macro_build ((char *) NULL, counter, &ex,
3943                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
3944                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
3945         }
3946     }
3947   else if (mips_pic == SVR4_PIC)
3948     {
3949       expressionS ex;
3950       int off;
3951
3952       /* This is the large GOT case.  If this is a reference to an
3953          external symbol, we want
3954            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
3955            addu         $reg,$reg,$gp
3956            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
3957          Otherwise, for a reference to a local symbol, we want
3958            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3959            nop
3960            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3961          If we have NewABI, we want
3962            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
3963            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
3964          If there is a constant, it must be added in after.  */
3965       ex.X_add_number = ep->X_add_number;
3966       ep->X_add_number = 0;
3967       if (HAVE_NEWABI)
3968         {
3969           macro_build ((char *) NULL, counter, ep,
3970                        HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
3971                        (int) BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
3972           macro_build (p, counter, ep,
3973                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
3974                        reg, reg, (int) BFD_RELOC_MIPS_GOT_OFST);
3975         }
3976       else
3977         {
3978           if (reg_needs_delay (mips_gp_register))
3979             off = 4;
3980           else
3981             off = 0;
3982           frag_grow (32);
3983           macro_build ((char *) NULL, counter, ep, "lui", "t,u", reg,
3984                        (int) BFD_RELOC_MIPS_GOT_HI16);
3985           macro_build ((char *) NULL, counter, (expressionS *) NULL,
3986                        HAVE_32BIT_ADDRESSES ? "addu" : "daddu", "d,v,t", reg,
3987                        reg, mips_gp_register);
3988           macro_build ((char *) NULL, counter, ep,
3989                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
3990                        "t,o(b)", reg, (int) BFD_RELOC_MIPS_GOT_LO16, reg);
3991           p = frag_var (rs_machine_dependent, 12 + off, 0,
3992                         RELAX_ENCODE (12, 12 + off, off, 8 + off, 0,
3993                                       mips_opts.warn_about_macros),
3994                         ep->X_add_symbol, 0, NULL);
3995           if (off > 0)
3996             {
3997               /* We need a nop before loading from $gp.  This special
3998                  check is required because the lui which starts the main
3999                  instruction stream does not refer to $gp, and so will not
4000                  insert the nop which may be required.  */
4001               macro_build (p, counter, (expressionS *) NULL, "nop", "");
4002                 p += 4;
4003             }
4004           macro_build (p, counter, ep,
4005                        HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", reg,
4006                        (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
4007           p += 4;
4008           macro_build (p, counter, (expressionS *) NULL, "nop", "");
4009           p += 4;
4010           macro_build (p, counter, ep,
4011                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4012                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4013         }
4014
4015       if (ex.X_add_number != 0)
4016         {
4017           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4018             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4019           ex.X_op = O_constant;
4020           macro_build ((char *) NULL, counter, &ex,
4021                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4022                        "t,r,j", reg, reg, (int) BFD_RELOC_LO16);
4023         }
4024     }
4025   else if (mips_pic == EMBEDDED_PIC)
4026     {
4027       /* We always do
4028            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4029        */
4030       macro_build ((char *) NULL, counter, ep,
4031                    HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
4032                    "t,r,j", reg, mips_gp_register, (int) BFD_RELOC_GPREL16);
4033     }
4034   else
4035     abort ();
4036 }
4037
4038 /* Move the contents of register SOURCE into register DEST.  */
4039
4040 static void
4041 move_register (counter, dest, source)
4042      int *counter;
4043      int dest;
4044      int source;
4045 {
4046   macro_build ((char *) NULL, counter, (expressionS *) NULL,
4047                HAVE_32BIT_GPRS ? "addu" : "daddu",
4048                "d,v,t", dest, source, 0);
4049 }
4050
4051 /*
4052  *                      Build macros
4053  *   This routine implements the seemingly endless macro or synthesized
4054  * instructions and addressing modes in the mips assembly language. Many
4055  * of these macros are simple and are similar to each other. These could
4056  * probably be handled by some kind of table or grammer aproach instead of
4057  * this verbose method. Others are not simple macros but are more like
4058  * optimizing code generation.
4059  *   One interesting optimization is when several store macros appear
4060  * consecutivly that would load AT with the upper half of the same address.
4061  * The ensuing load upper instructions are ommited. This implies some kind
4062  * of global optimization. We currently only optimize within a single macro.
4063  *   For many of the load and store macros if the address is specified as a
4064  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4065  * first load register 'at' with zero and use it as the base register. The
4066  * mips assembler simply uses register $zero. Just one tiny optimization
4067  * we're missing.
4068  */
4069 static void
4070 macro (ip)
4071      struct mips_cl_insn *ip;
4072 {
4073   register int treg, sreg, dreg, breg;
4074   int tempreg;
4075   int mask;
4076   int icnt = 0;
4077   int used_at = 0;
4078   expressionS expr1;
4079   const char *s;
4080   const char *s2;
4081   const char *fmt;
4082   int likely = 0;
4083   int dbl = 0;
4084   int coproc = 0;
4085   int lr = 0;
4086   int imm = 0;
4087   offsetT maxnum;
4088   int off;
4089   bfd_reloc_code_real_type r;
4090   int hold_mips_optimize;
4091
4092   assert (! mips_opts.mips16);
4093
4094   treg = (ip->insn_opcode >> 16) & 0x1f;
4095   dreg = (ip->insn_opcode >> 11) & 0x1f;
4096   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4097   mask = ip->insn_mo->mask;
4098
4099   expr1.X_op = O_constant;
4100   expr1.X_op_symbol = NULL;
4101   expr1.X_add_symbol = NULL;
4102   expr1.X_add_number = 1;
4103
4104   /* Umatched fixups should not be put in the same frag as a relaxable
4105      macro.  For example, suppose we have:
4106
4107         lui $4,%hi(l1)          # 1
4108         la $5,l2                # 2
4109         addiu $4,$4,%lo(l1)     # 3
4110
4111      If instructions 1 and 2 were put in the same frag, md_frob_file would
4112      move the fixup for #1 after the fixups for the "unrelaxed" version of
4113      #2.  This would confuse tc_gen_reloc, which expects the relocations
4114      for #2 to be the last for that frag.
4115
4116      Also, if tc_gen_reloc sees certain relocations in a variant frag,
4117      it assumes that they belong to a relaxable macro.  We mustn't put
4118      other uses of such relocations into a variant frag.
4119
4120      To avoid both problems, finish the current frag it contains a
4121      %reloc() operator.  The macro then goes into a new frag.  */
4122   if (prev_reloc_op_frag == frag_now)
4123     {
4124       frag_wane (frag_now);
4125       frag_new (0);
4126     }
4127
4128   switch (mask)
4129     {
4130     case M_DABS:
4131       dbl = 1;
4132     case M_ABS:
4133       /* bgez $a0,.+12
4134          move v0,$a0
4135          sub v0,$zero,$a0
4136          */
4137
4138       mips_emit_delays (TRUE);
4139       ++mips_opts.noreorder;
4140       mips_any_noreorder = 1;
4141
4142       expr1.X_add_number = 8;
4143       macro_build ((char *) NULL, &icnt, &expr1, "bgez", "s,p", sreg);
4144       if (dreg == sreg)
4145         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4146                      0);
4147       else
4148         move_register (&icnt, dreg, sreg);
4149       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4150                    dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4151
4152       --mips_opts.noreorder;
4153       return;
4154
4155     case M_ADD_I:
4156       s = "addi";
4157       s2 = "add";
4158       goto do_addi;
4159     case M_ADDU_I:
4160       s = "addiu";
4161       s2 = "addu";
4162       goto do_addi;
4163     case M_DADD_I:
4164       dbl = 1;
4165       s = "daddi";
4166       s2 = "dadd";
4167       goto do_addi;
4168     case M_DADDU_I:
4169       dbl = 1;
4170       s = "daddiu";
4171       s2 = "daddu";
4172     do_addi:
4173       if (imm_expr.X_op == O_constant
4174           && imm_expr.X_add_number >= -0x8000
4175           && imm_expr.X_add_number < 0x8000)
4176         {
4177           macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,j", treg, sreg,
4178                        (int) BFD_RELOC_LO16);
4179           return;
4180         }
4181       load_register (&icnt, AT, &imm_expr, dbl);
4182       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4183                    treg, sreg, AT);
4184       break;
4185
4186     case M_AND_I:
4187       s = "andi";
4188       s2 = "and";
4189       goto do_bit;
4190     case M_OR_I:
4191       s = "ori";
4192       s2 = "or";
4193       goto do_bit;
4194     case M_NOR_I:
4195       s = "";
4196       s2 = "nor";
4197       goto do_bit;
4198     case M_XOR_I:
4199       s = "xori";
4200       s2 = "xor";
4201     do_bit:
4202       if (imm_expr.X_op == O_constant
4203           && imm_expr.X_add_number >= 0
4204           && imm_expr.X_add_number < 0x10000)
4205         {
4206           if (mask != M_NOR_I)
4207             macro_build ((char *) NULL, &icnt, &imm_expr, s, "t,r,i", treg,
4208                          sreg, (int) BFD_RELOC_LO16);
4209           else
4210             {
4211               macro_build ((char *) NULL, &icnt, &imm_expr, "ori", "t,r,i",
4212                            treg, sreg, (int) BFD_RELOC_LO16);
4213               macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nor",
4214                            "d,v,t", treg, treg, 0);
4215             }
4216           return;
4217         }
4218
4219       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4220       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d,v,t",
4221                    treg, sreg, AT);
4222       break;
4223
4224     case M_BEQ_I:
4225       s = "beq";
4226       goto beq_i;
4227     case M_BEQL_I:
4228       s = "beql";
4229       likely = 1;
4230       goto beq_i;
4231     case M_BNE_I:
4232       s = "bne";
4233       goto beq_i;
4234     case M_BNEL_I:
4235       s = "bnel";
4236       likely = 1;
4237     beq_i:
4238       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4239         {
4240           macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg,
4241                        0);
4242           return;
4243         }
4244       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
4245       macro_build ((char *) NULL, &icnt, &offset_expr, s, "s,t,p", sreg, AT);
4246       break;
4247
4248     case M_BGEL:
4249       likely = 1;
4250     case M_BGE:
4251       if (treg == 0)
4252         {
4253           macro_build ((char *) NULL, &icnt, &offset_expr,
4254                        likely ? "bgezl" : "bgez", "s,p", sreg);
4255           return;
4256         }
4257       if (sreg == 0)
4258         {
4259           macro_build ((char *) NULL, &icnt, &offset_expr,
4260                        likely ? "blezl" : "blez", "s,p", treg);
4261           return;
4262         }
4263       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4264                    AT, sreg, treg);
4265       macro_build ((char *) NULL, &icnt, &offset_expr,
4266                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4267       break;
4268
4269     case M_BGTL_I:
4270       likely = 1;
4271     case M_BGT_I:
4272       /* check for > max integer */
4273       maxnum = 0x7fffffff;
4274       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4275         {
4276           maxnum <<= 16;
4277           maxnum |= 0xffff;
4278           maxnum <<= 16;
4279           maxnum |= 0xffff;
4280         }
4281       if (imm_expr.X_op == O_constant
4282           && imm_expr.X_add_number >= maxnum
4283           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4284         {
4285         do_false:
4286           /* result is always false */
4287           if (! likely)
4288             {
4289               if (warn_nops)
4290                 as_warn (_("Branch %s is always false (nop)"),
4291                          ip->insn_mo->name);
4292               macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop",
4293                            "", 0);
4294             }
4295           else
4296             {
4297               if (warn_nops)
4298                 as_warn (_("Branch likely %s is always false"),
4299                          ip->insn_mo->name);
4300               macro_build ((char *) NULL, &icnt, &offset_expr, "bnel",
4301                            "s,t,p", 0, 0);
4302             }
4303           return;
4304         }
4305       if (imm_expr.X_op != O_constant)
4306         as_bad (_("Unsupported large constant"));
4307       ++imm_expr.X_add_number;
4308       /* FALLTHROUGH */
4309     case M_BGE_I:
4310     case M_BGEL_I:
4311       if (mask == M_BGEL_I)
4312         likely = 1;
4313       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4314         {
4315           macro_build ((char *) NULL, &icnt, &offset_expr,
4316                        likely ? "bgezl" : "bgez", "s,p", sreg);
4317           return;
4318         }
4319       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4320         {
4321           macro_build ((char *) NULL, &icnt, &offset_expr,
4322                        likely ? "bgtzl" : "bgtz", "s,p", sreg);
4323           return;
4324         }
4325       maxnum = 0x7fffffff;
4326       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4327         {
4328           maxnum <<= 16;
4329           maxnum |= 0xffff;
4330           maxnum <<= 16;
4331           maxnum |= 0xffff;
4332         }
4333       maxnum = - maxnum - 1;
4334       if (imm_expr.X_op == O_constant
4335           && imm_expr.X_add_number <= maxnum
4336           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4337         {
4338         do_true:
4339           /* result is always true */
4340           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4341           macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
4342           return;
4343         }
4344       set_at (&icnt, sreg, 0);
4345       macro_build ((char *) NULL, &icnt, &offset_expr,
4346                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4347       break;
4348
4349     case M_BGEUL:
4350       likely = 1;
4351     case M_BGEU:
4352       if (treg == 0)
4353         goto do_true;
4354       if (sreg == 0)
4355         {
4356           macro_build ((char *) NULL, &icnt, &offset_expr,
4357                        likely ? "beql" : "beq", "s,t,p", 0, treg);
4358           return;
4359         }
4360       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4361                    "d,v,t", AT, sreg, treg);
4362       macro_build ((char *) NULL, &icnt, &offset_expr,
4363                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4364       break;
4365
4366     case M_BGTUL_I:
4367       likely = 1;
4368     case M_BGTU_I:
4369       if (sreg == 0
4370           || (HAVE_32BIT_GPRS
4371               && imm_expr.X_op == O_constant
4372               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4373         goto do_false;
4374       if (imm_expr.X_op != O_constant)
4375         as_bad (_("Unsupported large constant"));
4376       ++imm_expr.X_add_number;
4377       /* FALLTHROUGH */
4378     case M_BGEU_I:
4379     case M_BGEUL_I:
4380       if (mask == M_BGEUL_I)
4381         likely = 1;
4382       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4383         goto do_true;
4384       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4385         {
4386           macro_build ((char *) NULL, &icnt, &offset_expr,
4387                        likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4388           return;
4389         }
4390       set_at (&icnt, sreg, 1);
4391       macro_build ((char *) NULL, &icnt, &offset_expr,
4392                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4393       break;
4394
4395     case M_BGTL:
4396       likely = 1;
4397     case M_BGT:
4398       if (treg == 0)
4399         {
4400           macro_build ((char *) NULL, &icnt, &offset_expr,
4401                        likely ? "bgtzl" : "bgtz", "s,p", sreg);
4402           return;
4403         }
4404       if (sreg == 0)
4405         {
4406           macro_build ((char *) NULL, &icnt, &offset_expr,
4407                        likely ? "bltzl" : "bltz", "s,p", treg);
4408           return;
4409         }
4410       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4411                    AT, treg, sreg);
4412       macro_build ((char *) NULL, &icnt, &offset_expr,
4413                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4414       break;
4415
4416     case M_BGTUL:
4417       likely = 1;
4418     case M_BGTU:
4419       if (treg == 0)
4420         {
4421           macro_build ((char *) NULL, &icnt, &offset_expr,
4422                        likely ? "bnel" : "bne", "s,t,p", sreg, 0);
4423           return;
4424         }
4425       if (sreg == 0)
4426         goto do_false;
4427       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4428                    "d,v,t", AT, treg, sreg);
4429       macro_build ((char *) NULL, &icnt, &offset_expr,
4430                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4431       break;
4432
4433     case M_BLEL:
4434       likely = 1;
4435     case M_BLE:
4436       if (treg == 0)
4437         {
4438           macro_build ((char *) NULL, &icnt, &offset_expr,
4439                        likely ? "blezl" : "blez", "s,p", sreg);
4440           return;
4441         }
4442       if (sreg == 0)
4443         {
4444           macro_build ((char *) NULL, &icnt, &offset_expr,
4445                        likely ? "bgezl" : "bgez", "s,p", treg);
4446           return;
4447         }
4448       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4449                    AT, treg, sreg);
4450       macro_build ((char *) NULL, &icnt, &offset_expr,
4451                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4452       break;
4453
4454     case M_BLEL_I:
4455       likely = 1;
4456     case M_BLE_I:
4457       maxnum = 0x7fffffff;
4458       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4459         {
4460           maxnum <<= 16;
4461           maxnum |= 0xffff;
4462           maxnum <<= 16;
4463           maxnum |= 0xffff;
4464         }
4465       if (imm_expr.X_op == O_constant
4466           && imm_expr.X_add_number >= maxnum
4467           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4468         goto do_true;
4469       if (imm_expr.X_op != O_constant)
4470         as_bad (_("Unsupported large constant"));
4471       ++imm_expr.X_add_number;
4472       /* FALLTHROUGH */
4473     case M_BLT_I:
4474     case M_BLTL_I:
4475       if (mask == M_BLTL_I)
4476         likely = 1;
4477       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4478         {
4479           macro_build ((char *) NULL, &icnt, &offset_expr,
4480                        likely ? "bltzl" : "bltz", "s,p", sreg);
4481           return;
4482         }
4483       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4484         {
4485           macro_build ((char *) NULL, &icnt, &offset_expr,
4486                        likely ? "blezl" : "blez", "s,p", sreg);
4487           return;
4488         }
4489       set_at (&icnt, sreg, 0);
4490       macro_build ((char *) NULL, &icnt, &offset_expr,
4491                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4492       break;
4493
4494     case M_BLEUL:
4495       likely = 1;
4496     case M_BLEU:
4497       if (treg == 0)
4498         {
4499           macro_build ((char *) NULL, &icnt, &offset_expr,
4500                        likely ? "beql" : "beq", "s,t,p", sreg, 0);
4501           return;
4502         }
4503       if (sreg == 0)
4504         goto do_true;
4505       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4506                    "d,v,t", AT, treg, sreg);
4507       macro_build ((char *) NULL, &icnt, &offset_expr,
4508                    likely ? "beql" : "beq", "s,t,p", AT, 0);
4509       break;
4510
4511     case M_BLEUL_I:
4512       likely = 1;
4513     case M_BLEU_I:
4514       if (sreg == 0
4515           || (HAVE_32BIT_GPRS
4516               && imm_expr.X_op == O_constant
4517               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4518         goto do_true;
4519       if (imm_expr.X_op != O_constant)
4520         as_bad (_("Unsupported large constant"));
4521       ++imm_expr.X_add_number;
4522       /* FALLTHROUGH */
4523     case M_BLTU_I:
4524     case M_BLTUL_I:
4525       if (mask == M_BLTUL_I)
4526         likely = 1;
4527       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4528         goto do_false;
4529       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4530         {
4531           macro_build ((char *) NULL, &icnt, &offset_expr,
4532                        likely ? "beql" : "beq",
4533                        "s,t,p", sreg, 0);
4534           return;
4535         }
4536       set_at (&icnt, sreg, 1);
4537       macro_build ((char *) NULL, &icnt, &offset_expr,
4538                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4539       break;
4540
4541     case M_BLTL:
4542       likely = 1;
4543     case M_BLT:
4544       if (treg == 0)
4545         {
4546           macro_build ((char *) NULL, &icnt, &offset_expr,
4547                        likely ? "bltzl" : "bltz", "s,p", sreg);
4548           return;
4549         }
4550       if (sreg == 0)
4551         {
4552           macro_build ((char *) NULL, &icnt, &offset_expr,
4553                        likely ? "bgtzl" : "bgtz", "s,p", treg);
4554           return;
4555         }
4556       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
4557                    AT, sreg, treg);
4558       macro_build ((char *) NULL, &icnt, &offset_expr,
4559                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4560       break;
4561
4562     case M_BLTUL:
4563       likely = 1;
4564     case M_BLTU:
4565       if (treg == 0)
4566         goto do_false;
4567       if (sreg == 0)
4568         {
4569           macro_build ((char *) NULL, &icnt, &offset_expr,
4570                        likely ? "bnel" : "bne", "s,t,p", 0, treg);
4571           return;
4572         }
4573       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
4574                    "d,v,t", AT, sreg,
4575                    treg);
4576       macro_build ((char *) NULL, &icnt, &offset_expr,
4577                    likely ? "bnel" : "bne", "s,t,p", AT, 0);
4578       break;
4579
4580     case M_DDIV_3:
4581       dbl = 1;
4582     case M_DIV_3:
4583       s = "mflo";
4584       goto do_div3;
4585     case M_DREM_3:
4586       dbl = 1;
4587     case M_REM_3:
4588       s = "mfhi";
4589     do_div3:
4590       if (treg == 0)
4591         {
4592           as_warn (_("Divide by zero."));
4593           if (mips_trap)
4594             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4595                          "s,t,q", 0, 0, 7);
4596           else
4597             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4598                          "c", 7);
4599           return;
4600         }
4601
4602       mips_emit_delays (TRUE);
4603       ++mips_opts.noreorder;
4604       mips_any_noreorder = 1;
4605       if (mips_trap)
4606         {
4607           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4608                        "s,t,q", treg, 0, 7);
4609           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4610                        dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4611         }
4612       else
4613         {
4614           expr1.X_add_number = 8;
4615           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4616           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4617                        dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4618           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4619                        "c", 7);
4620         }
4621       expr1.X_add_number = -1;
4622       macro_build ((char *) NULL, &icnt, &expr1,
4623                    dbl ? "daddiu" : "addiu",
4624                    "t,r,j", AT, 0, (int) BFD_RELOC_LO16);
4625       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4626       macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, AT);
4627       if (dbl)
4628         {
4629           expr1.X_add_number = 1;
4630           macro_build ((char *) NULL, &icnt, &expr1, "daddiu", "t,r,j", AT, 0,
4631                        (int) BFD_RELOC_LO16);
4632           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsll32",
4633                        "d,w,<", AT, AT, 31);
4634         }
4635       else
4636         {
4637           expr1.X_add_number = 0x80000000;
4638           macro_build ((char *) NULL, &icnt, &expr1, "lui", "t,u", AT,
4639                        (int) BFD_RELOC_HI16);
4640         }
4641       if (mips_trap)
4642         {
4643           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4644                        "s,t,q", sreg, AT, 6);
4645           /* We want to close the noreorder block as soon as possible, so
4646              that later insns are available for delay slot filling.  */
4647           --mips_opts.noreorder;
4648         }
4649       else
4650         {
4651           expr1.X_add_number = 8;
4652           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", sreg, AT);
4653           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
4654                        0);
4655
4656           /* We want to close the noreorder block as soon as possible, so
4657              that later insns are available for delay slot filling.  */
4658           --mips_opts.noreorder;
4659
4660           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4661                        "c", 6);
4662         }
4663       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d", dreg);
4664       break;
4665
4666     case M_DIV_3I:
4667       s = "div";
4668       s2 = "mflo";
4669       goto do_divi;
4670     case M_DIVU_3I:
4671       s = "divu";
4672       s2 = "mflo";
4673       goto do_divi;
4674     case M_REM_3I:
4675       s = "div";
4676       s2 = "mfhi";
4677       goto do_divi;
4678     case M_REMU_3I:
4679       s = "divu";
4680       s2 = "mfhi";
4681       goto do_divi;
4682     case M_DDIV_3I:
4683       dbl = 1;
4684       s = "ddiv";
4685       s2 = "mflo";
4686       goto do_divi;
4687     case M_DDIVU_3I:
4688       dbl = 1;
4689       s = "ddivu";
4690       s2 = "mflo";
4691       goto do_divi;
4692     case M_DREM_3I:
4693       dbl = 1;
4694       s = "ddiv";
4695       s2 = "mfhi";
4696       goto do_divi;
4697     case M_DREMU_3I:
4698       dbl = 1;
4699       s = "ddivu";
4700       s2 = "mfhi";
4701     do_divi:
4702       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4703         {
4704           as_warn (_("Divide by zero."));
4705           if (mips_trap)
4706             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4707                          "s,t,q", 0, 0, 7);
4708           else
4709             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4710                          "c", 7);
4711           return;
4712         }
4713       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4714         {
4715           if (strcmp (s2, "mflo") == 0)
4716             move_register (&icnt, dreg, sreg);
4717           else
4718             move_register (&icnt, dreg, 0);
4719           return;
4720         }
4721       if (imm_expr.X_op == O_constant
4722           && imm_expr.X_add_number == -1
4723           && s[strlen (s) - 1] != 'u')
4724         {
4725           if (strcmp (s2, "mflo") == 0)
4726             {
4727               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4728                            dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4729             }
4730           else
4731             move_register (&icnt, dreg, 0);
4732           return;
4733         }
4734
4735       load_register (&icnt, AT, &imm_expr, dbl);
4736       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4737                    sreg, AT);
4738       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4739       break;
4740
4741     case M_DIVU_3:
4742       s = "divu";
4743       s2 = "mflo";
4744       goto do_divu3;
4745     case M_REMU_3:
4746       s = "divu";
4747       s2 = "mfhi";
4748       goto do_divu3;
4749     case M_DDIVU_3:
4750       s = "ddivu";
4751       s2 = "mflo";
4752       goto do_divu3;
4753     case M_DREMU_3:
4754       s = "ddivu";
4755       s2 = "mfhi";
4756     do_divu3:
4757       mips_emit_delays (TRUE);
4758       ++mips_opts.noreorder;
4759       mips_any_noreorder = 1;
4760       if (mips_trap)
4761         {
4762           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "teq",
4763                        "s,t,q", treg, 0, 7);
4764           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4765                        sreg, treg);
4766           /* We want to close the noreorder block as soon as possible, so
4767              that later insns are available for delay slot filling.  */
4768           --mips_opts.noreorder;
4769         }
4770       else
4771         {
4772           expr1.X_add_number = 8;
4773           macro_build ((char *) NULL, &icnt, &expr1, "bne", "s,t,p", treg, 0);
4774           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "z,s,t",
4775                        sreg, treg);
4776
4777           /* We want to close the noreorder block as soon as possible, so
4778              that later insns are available for delay slot filling.  */
4779           --mips_opts.noreorder;
4780           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
4781                        "c", 7);
4782         }
4783       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "d", dreg);
4784       return;
4785
4786     case M_DLA_AB:
4787       dbl = 1;
4788     case M_LA_AB:
4789       /* Load the address of a symbol into a register.  If breg is not
4790          zero, we then add a base register to it.  */
4791
4792       if (dbl && HAVE_32BIT_GPRS)
4793         as_warn (_("dla used to load 32-bit register"));
4794
4795       if (! dbl && HAVE_64BIT_OBJECTS)
4796         as_warn (_("la used to load 64-bit address"));
4797
4798       if (offset_expr.X_op == O_constant
4799           && offset_expr.X_add_number >= -0x8000
4800           && offset_expr.X_add_number < 0x8000)
4801         {
4802           macro_build ((char *) NULL, &icnt, &offset_expr,
4803                        (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4804                        "t,r,j", treg, sreg, (int) BFD_RELOC_LO16);
4805           return;
4806         }
4807
4808       if (treg == breg)
4809         {
4810           tempreg = AT;
4811           used_at = 1;
4812         }
4813       else
4814         {
4815           tempreg = treg;
4816           used_at = 0;
4817         }
4818
4819       /* When generating embedded PIC code, we permit expressions of
4820          the form
4821            la   $treg,foo-bar
4822            la   $treg,foo-bar($breg)
4823          where bar is an address in the current section.  These are used
4824          when getting the addresses of functions.  We don't permit
4825          X_add_number to be non-zero, because if the symbol is
4826          external the relaxing code needs to know that any addend is
4827          purely the offset to X_op_symbol.  */
4828       if (mips_pic == EMBEDDED_PIC
4829           && offset_expr.X_op == O_subtract
4830           && (symbol_constant_p (offset_expr.X_op_symbol)
4831               ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
4832               : (symbol_equated_p (offset_expr.X_op_symbol)
4833                  && (S_GET_SEGMENT
4834                      (symbol_get_value_expression (offset_expr.X_op_symbol)
4835                       ->X_add_symbol)
4836                      == now_seg)))
4837           && (offset_expr.X_add_number == 0
4838               || OUTPUT_FLAVOR == bfd_target_elf_flavour))
4839         {
4840           if (breg == 0)
4841             {
4842               tempreg = treg;
4843               used_at = 0;
4844               macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4845                            tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4846             }
4847           else
4848             {
4849               macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
4850                            tempreg, (int) BFD_RELOC_PCREL_HI16_S);
4851               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
4852                            (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu",
4853                            "d,v,t", tempreg, tempreg, breg);
4854             }
4855           macro_build ((char *) NULL, &icnt, &offset_expr,
4856                        (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4857                        "t,r,j", treg, tempreg, (int) BFD_RELOC_PCREL_LO16);
4858           if (! used_at)
4859             return;
4860           break;
4861         }
4862
4863       if (offset_expr.X_op != O_symbol
4864           && offset_expr.X_op != O_constant)
4865         {
4866           as_bad (_("expression too complex"));
4867           offset_expr.X_op = O_constant;
4868         }
4869
4870       if (offset_expr.X_op == O_constant)
4871         load_register (&icnt, tempreg, &offset_expr,
4872                        ((mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
4873                         ? (dbl || HAVE_64BIT_ADDRESSES)
4874                         : HAVE_64BIT_ADDRESSES));
4875       else if (mips_pic == NO_PIC)
4876         {
4877           /* If this is a reference to a GP relative symbol, we want
4878                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
4879              Otherwise we want
4880                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
4881                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4882              If we have a constant, we need two instructions anyhow,
4883              so we may as well always use the latter form.
4884
4885             With 64bit address space and a usable $at we want
4886               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4887               lui       $at,<sym>               (BFD_RELOC_HI16_S)
4888               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4889               daddiu    $at,<sym>               (BFD_RELOC_LO16)
4890               dsll32    $tempreg,0
4891               daddu     $tempreg,$tempreg,$at
4892
4893             If $at is already in use, we use a path which is suboptimal
4894             on superscalar processors.
4895               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4896               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4897               dsll      $tempreg,16
4898               daddiu    $tempreg,<sym>          (BFD_RELOC_HI16_S)
4899               dsll      $tempreg,16
4900               daddiu    $tempreg,<sym>          (BFD_RELOC_LO16)
4901           */
4902           char *p = NULL;
4903           if (HAVE_64BIT_ADDRESSES)
4904             {
4905               /* We don't do GP optimization for now because RELAX_ENCODE can't
4906                  hold the data for such large chunks.  */
4907
4908               if (used_at == 0 && ! mips_opts.noat)
4909                 {
4910                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4911                                tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
4912                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4913                                AT, (int) BFD_RELOC_HI16_S);
4914                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4915                                tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
4916                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4917                                AT, AT, (int) BFD_RELOC_LO16);
4918                   macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
4919                                "d,w,<", tempreg, tempreg, 0);
4920                   macro_build (p, &icnt, (expressionS *) NULL, "daddu",
4921                                "d,v,t", tempreg, tempreg, AT);
4922                   used_at = 1;
4923                 }
4924               else
4925                 {
4926                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
4927                                tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
4928                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4929                                tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
4930                   macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
4931                                tempreg, tempreg, 16);
4932                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4933                                tempreg, tempreg, (int) BFD_RELOC_HI16_S);
4934                   macro_build (p, &icnt, (expressionS *) NULL, "dsll", "d,w,<",
4935                                tempreg, tempreg, 16);
4936                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
4937                                tempreg, tempreg, (int) BFD_RELOC_LO16);
4938                 }
4939             }
4940           else
4941             {
4942               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
4943                   && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
4944                 {
4945                   frag_grow (20);
4946                   macro_build ((char *) NULL, &icnt, &offset_expr, "addiu",
4947                                "t,r,j", tempreg, mips_gp_register,
4948                                (int) BFD_RELOC_GPREL16);
4949                   p = frag_var (rs_machine_dependent, 8, 0,
4950                                 RELAX_ENCODE (4, 8, 0, 4, 0,
4951                                               mips_opts.warn_about_macros),
4952                                 offset_expr.X_add_symbol, 0, NULL);
4953                 }
4954               macro_build_lui (p, &icnt, &offset_expr, tempreg);
4955               if (p != NULL)
4956                 p += 4;
4957               macro_build (p, &icnt, &offset_expr, "addiu",
4958                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
4959             }
4960         }
4961       else if (mips_pic == SVR4_PIC && ! mips_big_got)
4962         {
4963           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
4964
4965           /* If this is a reference to an external symbol, and there
4966              is no constant, we want
4967                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4968              or if tempreg is PIC_CALL_REG
4969                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
4970              For a local symbol, we want
4971                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4972                nop
4973                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4974
4975              If we have a small constant, and this is a reference to
4976              an external symbol, we want
4977                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4978                nop
4979                addiu    $tempreg,$tempreg,<constant>
4980              For a local symbol, we want the same instruction
4981              sequence, but we output a BFD_RELOC_LO16 reloc on the
4982              addiu instruction.
4983
4984              If we have a large constant, and this is a reference to
4985              an external symbol, we want
4986                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4987                lui      $at,<hiconstant>
4988                addiu    $at,$at,<loconstant>
4989                addu     $tempreg,$tempreg,$at
4990              For a local symbol, we want the same instruction
4991              sequence, but we output a BFD_RELOC_LO16 reloc on the
4992              addiu instruction.
4993
4994              For NewABI, we want for local or external data addresses
4995                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4996              For a local function symbol, we want
4997                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
4998                nop
4999                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
5000            */
5001
5002           expr1.X_add_number = offset_expr.X_add_number;
5003           offset_expr.X_add_number = 0;
5004           frag_grow (32);
5005           if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5006             lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5007           else if (HAVE_NEWABI)
5008             lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
5009           macro_build ((char *) NULL, &icnt, &offset_expr,
5010                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5011                        "t,o(b)", tempreg, lw_reloc_type, mips_gp_register);
5012           if (expr1.X_add_number == 0)
5013             {
5014               int off;
5015               char *p;
5016
5017               if (breg == 0)
5018                 off = 0;
5019               else
5020                 {
5021                   /* We're going to put in an addu instruction using
5022                      tempreg, so we may as well insert the nop right
5023                      now.  */
5024                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5025                                "nop", "");
5026                   off = 4;
5027                 }
5028               p = frag_var (rs_machine_dependent, 8 - off, 0,
5029                             RELAX_ENCODE (0, 8 - off, -4 - off, 4 - off, 0,
5030                                           (breg == 0
5031                                            ? mips_opts.warn_about_macros
5032                                            : 0)),
5033                             offset_expr.X_add_symbol, 0, NULL);
5034               if (breg == 0)
5035                 {
5036                   macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5037                   p += 4;
5038                 }
5039               macro_build (p, &icnt, &expr1,
5040                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5041                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5042               /* FIXME: If breg == 0, and the next instruction uses
5043                  $tempreg, then if this variant case is used an extra
5044                  nop will be generated.  */
5045             }
5046           else if (expr1.X_add_number >= -0x8000
5047                    && expr1.X_add_number < 0x8000)
5048             {
5049               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5050                            "nop", "");
5051               macro_build ((char *) NULL, &icnt, &expr1,
5052                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5053                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5054               frag_var (rs_machine_dependent, 0, 0,
5055                         RELAX_ENCODE (0, 0, -12, -4, 0, 0),
5056                         offset_expr.X_add_symbol, 0, NULL);
5057             }
5058           else
5059             {
5060               int off1;
5061
5062               /* If we are going to add in a base register, and the
5063                  target register and the base register are the same,
5064                  then we are using AT as a temporary register.  Since
5065                  we want to load the constant into AT, we add our
5066                  current AT (from the global offset table) and the
5067                  register into the register now, and pretend we were
5068                  not using a base register.  */
5069               if (breg != treg)
5070                 off1 = 0;
5071               else
5072                 {
5073                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5074                                "nop", "");
5075                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5076                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5077                                "d,v,t", treg, AT, breg);
5078                   breg = 0;
5079                   tempreg = treg;
5080                   off1 = -8;
5081                 }
5082
5083               /* Set mips_optimize around the lui instruction to avoid
5084                  inserting an unnecessary nop after the lw.  */
5085               hold_mips_optimize = mips_optimize;
5086               mips_optimize = 2;
5087               macro_build_lui (NULL, &icnt, &expr1, AT);
5088               mips_optimize = hold_mips_optimize;
5089
5090               macro_build ((char *) NULL, &icnt, &expr1,
5091                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5092                            "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5093               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5094                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5095                            "d,v,t", tempreg, tempreg, AT);
5096               frag_var (rs_machine_dependent, 0, 0,
5097                         RELAX_ENCODE (0, 0, -16 + off1, -8, 0, 0),
5098                         offset_expr.X_add_symbol, 0, NULL);
5099               used_at = 1;
5100             }
5101         }
5102       else if (mips_pic == SVR4_PIC)
5103         {
5104           int gpdel;
5105           char *p;
5106           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5107           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5108           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5109
5110           /* This is the large GOT case.  If this is a reference to an
5111              external symbol, and there is no constant, we want
5112                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5113                addu     $tempreg,$tempreg,$gp
5114                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5115              or if tempreg is PIC_CALL_REG
5116                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5117                addu     $tempreg,$tempreg,$gp
5118                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5119              For a local symbol, we want
5120                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5121                nop
5122                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5123
5124              If we have a small constant, and this is a reference to
5125              an external symbol, we want
5126                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5127                addu     $tempreg,$tempreg,$gp
5128                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5129                nop
5130                addiu    $tempreg,$tempreg,<constant>
5131              For a local symbol, we want
5132                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5133                nop
5134                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5135
5136              If we have a large constant, and this is a reference to
5137              an external symbol, we want
5138                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5139                addu     $tempreg,$tempreg,$gp
5140                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5141                lui      $at,<hiconstant>
5142                addiu    $at,$at,<loconstant>
5143                addu     $tempreg,$tempreg,$at
5144              For a local symbol, we want
5145                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5146                lui      $at,<hiconstant>
5147                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5148                addu     $tempreg,$tempreg,$at
5149
5150              For NewABI, we want for local data addresses
5151               lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5152            */
5153
5154           expr1.X_add_number = offset_expr.X_add_number;
5155           offset_expr.X_add_number = 0;
5156           frag_grow (52);
5157           if (reg_needs_delay (mips_gp_register))
5158             gpdel = 4;
5159           else
5160             gpdel = 0;
5161           if (expr1.X_add_number == 0 && tempreg == PIC_CALL_REG)
5162             {
5163               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5164               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5165             }
5166           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5167                        tempreg, lui_reloc_type);
5168           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5169                        HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5170                        "d,v,t", tempreg, tempreg, mips_gp_register);
5171           macro_build ((char *) NULL, &icnt, &offset_expr,
5172                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5173                        "t,o(b)", tempreg, lw_reloc_type, tempreg);
5174           if (expr1.X_add_number == 0)
5175             {
5176               int off;
5177
5178               if (breg == 0)
5179                 off = 0;
5180               else
5181                 {
5182                   /* We're going to put in an addu instruction using
5183                      tempreg, so we may as well insert the nop right
5184                      now.  */
5185                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5186                                "nop", "");
5187                   off = 4;
5188                 }
5189
5190               p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5191                             RELAX_ENCODE (12 + off, 12 + gpdel, gpdel,
5192                                           8 + gpdel, 0,
5193                                           (breg == 0
5194                                            ? mips_opts.warn_about_macros
5195                                            : 0)),
5196                             offset_expr.X_add_symbol, 0, NULL);
5197             }
5198           else if (expr1.X_add_number >= -0x8000
5199                    && expr1.X_add_number < 0x8000)
5200             {
5201               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5202                            "nop", "");
5203               macro_build ((char *) NULL, &icnt, &expr1,
5204                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5205                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5206
5207               p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5208                             RELAX_ENCODE (20, 12 + gpdel, gpdel, 8 + gpdel, 0,
5209                                           (breg == 0
5210                                            ? mips_opts.warn_about_macros
5211                                            : 0)),
5212                             offset_expr.X_add_symbol, 0, NULL);
5213             }
5214           else
5215             {
5216               int adj, dreg;
5217
5218               /* If we are going to add in a base register, and the
5219                  target register and the base register are the same,
5220                  then we are using AT as a temporary register.  Since
5221                  we want to load the constant into AT, we add our
5222                  current AT (from the global offset table) and the
5223                  register into the register now, and pretend we were
5224                  not using a base register.  */
5225               if (breg != treg)
5226                 {
5227                   adj = 0;
5228                   dreg = tempreg;
5229                 }
5230               else
5231                 {
5232                   assert (tempreg == AT);
5233                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5234                                "nop", "");
5235                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5236                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5237                                "d,v,t", treg, AT, breg);
5238                   dreg = treg;
5239                   adj = 8;
5240                 }
5241
5242               /* Set mips_optimize around the lui instruction to avoid
5243                  inserting an unnecessary nop after the lw.  */
5244               hold_mips_optimize = mips_optimize;
5245               mips_optimize = 2;
5246               macro_build_lui (NULL, &icnt, &expr1, AT);
5247               mips_optimize = hold_mips_optimize;
5248
5249               macro_build ((char *) NULL, &icnt, &expr1,
5250                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5251                            "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5252               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5253                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5254                            "d,v,t", dreg, dreg, AT);
5255
5256               p = frag_var (rs_machine_dependent, 16 + gpdel + adj, 0,
5257                             RELAX_ENCODE (24 + adj, 16 + gpdel + adj, gpdel,
5258                                           8 + gpdel, 0,
5259                                           (breg == 0
5260                                            ? mips_opts.warn_about_macros
5261                                            : 0)),
5262                             offset_expr.X_add_symbol, 0, NULL);
5263
5264               used_at = 1;
5265             }
5266
5267           if (gpdel > 0)
5268             {
5269               /* This is needed because this instruction uses $gp, but
5270                  the first instruction on the main stream does not.  */
5271               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5272               p += 4;
5273             }
5274
5275           if (HAVE_NEWABI)
5276             local_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
5277           macro_build (p, &icnt, &offset_expr,
5278                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5279                        "t,o(b)", tempreg,
5280                        local_reloc_type,
5281                        mips_gp_register);
5282           p += 4;
5283           if (expr1.X_add_number == 0 && HAVE_NEWABI)
5284             {
5285               /* BFD_RELOC_MIPS_GOT_DISP is sufficient for newabi */
5286             }
5287          else
5288            if (expr1.X_add_number >= -0x8000
5289               && expr1.X_add_number < 0x8000)
5290             {
5291               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5292               p += 4;
5293               macro_build (p, &icnt, &expr1,
5294                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5295                            "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5296               /* FIXME: If add_number is 0, and there was no base
5297                  register, the external symbol case ended with a load,
5298                  so if the symbol turns out to not be external, and
5299                  the next instruction uses tempreg, an unnecessary nop
5300                  will be inserted.  */
5301             }
5302           else
5303             {
5304               if (breg == treg)
5305                 {
5306                   /* We must add in the base register now, as in the
5307                      external symbol case.  */
5308                   assert (tempreg == AT);
5309                   macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5310                   p += 4;
5311                   macro_build (p, &icnt, (expressionS *) NULL,
5312                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5313                                "d,v,t", treg, AT, breg);
5314                   p += 4;
5315                   tempreg = treg;
5316                   /* We set breg to 0 because we have arranged to add
5317                      it in in both cases.  */
5318                   breg = 0;
5319                 }
5320
5321               macro_build_lui (p, &icnt, &expr1, AT);
5322               p += 4;
5323               macro_build (p, &icnt, &expr1,
5324                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5325                            "t,r,j", AT, AT, (int) BFD_RELOC_LO16);
5326               p += 4;
5327               macro_build (p, &icnt, (expressionS *) NULL,
5328                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5329                            "d,v,t", tempreg, tempreg, AT);
5330               p += 4;
5331             }
5332         }
5333       else if (mips_pic == EMBEDDED_PIC)
5334         {
5335           /* We use
5336                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5337              */
5338           macro_build ((char *) NULL, &icnt, &offset_expr,
5339                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j",
5340                        tempreg, mips_gp_register, (int) BFD_RELOC_GPREL16);
5341         }
5342       else
5343         abort ();
5344
5345       if (breg != 0)
5346         {
5347           char *s;
5348
5349           if (mips_pic == EMBEDDED_PIC || mips_pic == NO_PIC)
5350             s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu";
5351           else
5352             s = HAVE_64BIT_ADDRESSES ? "daddu" : "addu";
5353
5354           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s,
5355                        "d,v,t", treg, tempreg, breg);
5356         }
5357
5358       if (! used_at)
5359         return;
5360
5361       break;
5362
5363     case M_J_A:
5364       /* The j instruction may not be used in PIC code, since it
5365          requires an absolute address.  We convert it to a b
5366          instruction.  */
5367       if (mips_pic == NO_PIC)
5368         macro_build ((char *) NULL, &icnt, &offset_expr, "j", "a");
5369       else
5370         macro_build ((char *) NULL, &icnt, &offset_expr, "b", "p");
5371       return;
5372
5373       /* The jal instructions must be handled as macros because when
5374          generating PIC code they expand to multi-instruction
5375          sequences.  Normally they are simple instructions.  */
5376     case M_JAL_1:
5377       dreg = RA;
5378       /* Fall through.  */
5379     case M_JAL_2:
5380       if (mips_pic == NO_PIC
5381           || mips_pic == EMBEDDED_PIC)
5382         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5383                      "d,s", dreg, sreg);
5384       else if (mips_pic == SVR4_PIC)
5385         {
5386           if (sreg != PIC_CALL_REG)
5387             as_warn (_("MIPS PIC call to register other than $25"));
5388
5389           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "jalr",
5390                        "d,s", dreg, sreg);
5391           if (! HAVE_NEWABI)
5392             {
5393               if (mips_cprestore_offset < 0)
5394                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5395               else
5396                 {
5397                   if (! mips_frame_reg_valid)
5398                     {
5399                       as_warn (_("No .frame pseudo-op used in PIC code"));
5400                       /* Quiet this warning.  */
5401                       mips_frame_reg_valid = 1;
5402                     }
5403                   if (! mips_cprestore_valid)
5404                     {
5405                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5406                       /* Quiet this warning.  */
5407                       mips_cprestore_valid = 1;
5408                     }
5409                   expr1.X_add_number = mips_cprestore_offset;
5410                   macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5411                                                 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5412                                                 mips_gp_register, mips_frame_reg);
5413                 }
5414             }
5415         }
5416       else
5417         abort ();
5418
5419       return;
5420
5421     case M_JAL_A:
5422       if (mips_pic == NO_PIC)
5423         macro_build ((char *) NULL, &icnt, &offset_expr, "jal", "a");
5424       else if (mips_pic == SVR4_PIC)
5425         {
5426           char *p;
5427
5428           /* If this is a reference to an external symbol, and we are
5429              using a small GOT, we want
5430                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5431                nop
5432                jalr     $ra,$25
5433                nop
5434                lw       $gp,cprestore($sp)
5435              The cprestore value is set using the .cprestore
5436              pseudo-op.  If we are using a big GOT, we want
5437                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5438                addu     $25,$25,$gp
5439                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5440                nop
5441                jalr     $ra,$25
5442                nop
5443                lw       $gp,cprestore($sp)
5444              If the symbol is not external, we want
5445                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5446                nop
5447                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5448                jalr     $ra,$25
5449                nop
5450                lw $gp,cprestore($sp)
5451              For NewABI, we want
5452                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT_DISP)
5453                jalr     $ra,$25                 (BFD_RELOC_MIPS_JALR)
5454            */
5455           if (HAVE_NEWABI)
5456             {
5457               macro_build ((char *) NULL, &icnt, &offset_expr,
5458                            HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5459                            "t,o(b)", PIC_CALL_REG,
5460                            (int) BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5461               macro_build_jalr (icnt, &offset_expr);
5462             }
5463           else
5464             {
5465               frag_grow (40);
5466               if (! mips_big_got)
5467                 {
5468                   macro_build ((char *) NULL, &icnt, &offset_expr,
5469                                HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5470                                "t,o(b)", PIC_CALL_REG,
5471                                (int) BFD_RELOC_MIPS_CALL16, mips_gp_register);
5472                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5473                                "nop", "");
5474                   p = frag_var (rs_machine_dependent, 4, 0,
5475                                 RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5476                                 offset_expr.X_add_symbol, 0, NULL);
5477                 }
5478               else
5479                 {
5480                   int gpdel;
5481
5482                   if (reg_needs_delay (mips_gp_register))
5483                     gpdel = 4;
5484                   else
5485                     gpdel = 0;
5486                   macro_build ((char *) NULL, &icnt, &offset_expr, "lui",
5487                                "t,u", PIC_CALL_REG,
5488                                (int) BFD_RELOC_MIPS_CALL_HI16);
5489                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5490                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5491                                "d,v,t", PIC_CALL_REG, PIC_CALL_REG,
5492                                mips_gp_register);
5493                   macro_build ((char *) NULL, &icnt, &offset_expr,
5494                                HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5495                                "t,o(b)", PIC_CALL_REG,
5496                                (int) BFD_RELOC_MIPS_CALL_LO16, PIC_CALL_REG);
5497                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5498                                "nop", "");
5499                   p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
5500                                 RELAX_ENCODE (16, 12 + gpdel, gpdel,
5501                                               8 + gpdel, 0, 0),
5502                                 offset_expr.X_add_symbol, 0, NULL);
5503                   if (gpdel > 0)
5504                     {
5505                       macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5506                       p += 4;
5507                     }
5508                   macro_build (p, &icnt, &offset_expr,
5509                                HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5510                                "t,o(b)", PIC_CALL_REG,
5511                                (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
5512                   p += 4;
5513                   macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
5514                   p += 4;
5515                 }
5516               macro_build (p, &icnt, &offset_expr,
5517                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5518                            "t,r,j", PIC_CALL_REG, PIC_CALL_REG,
5519                            (int) BFD_RELOC_LO16);
5520               macro_build_jalr (icnt, &offset_expr);
5521
5522               if (mips_cprestore_offset < 0)
5523                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5524               else
5525                 {
5526                   if (! mips_frame_reg_valid)
5527                     {
5528                       as_warn (_("No .frame pseudo-op used in PIC code"));
5529                       /* Quiet this warning.  */
5530                       mips_frame_reg_valid = 1;
5531                     }
5532                   if (! mips_cprestore_valid)
5533                     {
5534                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5535                       /* Quiet this warning.  */
5536                       mips_cprestore_valid = 1;
5537                     }
5538                   if (mips_opts.noreorder)
5539                     macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5540                                  "nop", "");
5541                   expr1.X_add_number = mips_cprestore_offset;
5542                   macro_build_ldst_constoffset ((char *) NULL, &icnt, &expr1,
5543                                                 HAVE_32BIT_ADDRESSES ? "lw" : "ld",
5544                                                 mips_gp_register, mips_frame_reg);
5545                 }
5546             }
5547         }
5548       else if (mips_pic == EMBEDDED_PIC)
5549         {
5550           macro_build ((char *) NULL, &icnt, &offset_expr, "bal", "p");
5551           /* The linker may expand the call to a longer sequence which
5552              uses $at, so we must break rather than return.  */
5553           break;
5554         }
5555       else
5556         abort ();
5557
5558       return;
5559
5560     case M_LB_AB:
5561       s = "lb";
5562       goto ld;
5563     case M_LBU_AB:
5564       s = "lbu";
5565       goto ld;
5566     case M_LH_AB:
5567       s = "lh";
5568       goto ld;
5569     case M_LHU_AB:
5570       s = "lhu";
5571       goto ld;
5572     case M_LW_AB:
5573       s = "lw";
5574       goto ld;
5575     case M_LWC0_AB:
5576       s = "lwc0";
5577       /* Itbl support may require additional care here.  */
5578       coproc = 1;
5579       goto ld;
5580     case M_LWC1_AB:
5581       s = "lwc1";
5582       /* Itbl support may require additional care here.  */
5583       coproc = 1;
5584       goto ld;
5585     case M_LWC2_AB:
5586       s = "lwc2";
5587       /* Itbl support may require additional care here.  */
5588       coproc = 1;
5589       goto ld;
5590     case M_LWC3_AB:
5591       s = "lwc3";
5592       /* Itbl support may require additional care here.  */
5593       coproc = 1;
5594       goto ld;
5595     case M_LWL_AB:
5596       s = "lwl";
5597       lr = 1;
5598       goto ld;
5599     case M_LWR_AB:
5600       s = "lwr";
5601       lr = 1;
5602       goto ld;
5603     case M_LDC1_AB:
5604       if (mips_arch == CPU_R4650)
5605         {
5606           as_bad (_("opcode not supported on this processor"));
5607           return;
5608         }
5609       s = "ldc1";
5610       /* Itbl support may require additional care here.  */
5611       coproc = 1;
5612       goto ld;
5613     case M_LDC2_AB:
5614       s = "ldc2";
5615       /* Itbl support may require additional care here.  */
5616       coproc = 1;
5617       goto ld;
5618     case M_LDC3_AB:
5619       s = "ldc3";
5620       /* Itbl support may require additional care here.  */
5621       coproc = 1;
5622       goto ld;
5623     case M_LDL_AB:
5624       s = "ldl";
5625       lr = 1;
5626       goto ld;
5627     case M_LDR_AB:
5628       s = "ldr";
5629       lr = 1;
5630       goto ld;
5631     case M_LL_AB:
5632       s = "ll";
5633       goto ld;
5634     case M_LLD_AB:
5635       s = "lld";
5636       goto ld;
5637     case M_LWU_AB:
5638       s = "lwu";
5639     ld:
5640       if (breg == treg || coproc || lr)
5641         {
5642           tempreg = AT;
5643           used_at = 1;
5644         }
5645       else
5646         {
5647           tempreg = treg;
5648           used_at = 0;
5649         }
5650       goto ld_st;
5651     case M_SB_AB:
5652       s = "sb";
5653       goto st;
5654     case M_SH_AB:
5655       s = "sh";
5656       goto st;
5657     case M_SW_AB:
5658       s = "sw";
5659       goto st;
5660     case M_SWC0_AB:
5661       s = "swc0";
5662       /* Itbl support may require additional care here.  */
5663       coproc = 1;
5664       goto st;
5665     case M_SWC1_AB:
5666       s = "swc1";
5667       /* Itbl support may require additional care here.  */
5668       coproc = 1;
5669       goto st;
5670     case M_SWC2_AB:
5671       s = "swc2";
5672       /* Itbl support may require additional care here.  */
5673       coproc = 1;
5674       goto st;
5675     case M_SWC3_AB:
5676       s = "swc3";
5677       /* Itbl support may require additional care here.  */
5678       coproc = 1;
5679       goto st;
5680     case M_SWL_AB:
5681       s = "swl";
5682       goto st;
5683     case M_SWR_AB:
5684       s = "swr";
5685       goto st;
5686     case M_SC_AB:
5687       s = "sc";
5688       goto st;
5689     case M_SCD_AB:
5690       s = "scd";
5691       goto st;
5692     case M_SDC1_AB:
5693       if (mips_arch == CPU_R4650)
5694         {
5695           as_bad (_("opcode not supported on this processor"));
5696           return;
5697         }
5698       s = "sdc1";
5699       coproc = 1;
5700       /* Itbl support may require additional care here.  */
5701       goto st;
5702     case M_SDC2_AB:
5703       s = "sdc2";
5704       /* Itbl support may require additional care here.  */
5705       coproc = 1;
5706       goto st;
5707     case M_SDC3_AB:
5708       s = "sdc3";
5709       /* Itbl support may require additional care here.  */
5710       coproc = 1;
5711       goto st;
5712     case M_SDL_AB:
5713       s = "sdl";
5714       goto st;
5715     case M_SDR_AB:
5716       s = "sdr";
5717     st:
5718       tempreg = AT;
5719       used_at = 1;
5720     ld_st:
5721       /* Itbl support may require additional care here.  */
5722       if (mask == M_LWC1_AB
5723           || mask == M_SWC1_AB
5724           || mask == M_LDC1_AB
5725           || mask == M_SDC1_AB
5726           || mask == M_L_DAB
5727           || mask == M_S_DAB)
5728         fmt = "T,o(b)";
5729       else if (coproc)
5730         fmt = "E,o(b)";
5731       else
5732         fmt = "t,o(b)";
5733
5734       /* For embedded PIC, we allow loads where the offset is calculated
5735          by subtracting a symbol in the current segment from an unknown
5736          symbol, relative to a base register, e.g.:
5737                 <op>    $treg, <sym>-<localsym>($breg)
5738          This is used by the compiler for switch statements.  */
5739       if (mips_pic == EMBEDDED_PIC
5740           && offset_expr.X_op == O_subtract
5741           && (symbol_constant_p (offset_expr.X_op_symbol)
5742               ? S_GET_SEGMENT (offset_expr.X_op_symbol) == now_seg
5743               : (symbol_equated_p (offset_expr.X_op_symbol)
5744                  && (S_GET_SEGMENT
5745                      (symbol_get_value_expression (offset_expr.X_op_symbol)
5746                       ->X_add_symbol)
5747                      == now_seg)))
5748           && breg != 0
5749           && (offset_expr.X_add_number == 0
5750               || OUTPUT_FLAVOR == bfd_target_elf_flavour))
5751         {
5752           /* For this case, we output the instructions:
5753                 lui     $tempreg,<sym>          (BFD_RELOC_PCREL_HI16_S)
5754                 addiu   $tempreg,$tempreg,$breg
5755                 <op>    $treg,<sym>($tempreg)   (BFD_RELOC_PCREL_LO16)
5756              If the relocation would fit entirely in 16 bits, it would be
5757              nice to emit:
5758                 <op>    $treg,<sym>($breg)      (BFD_RELOC_PCREL_LO16)
5759              instead, but that seems quite difficult.  */
5760           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
5761                        tempreg, (int) BFD_RELOC_PCREL_HI16_S);
5762           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5763                        ((bfd_arch_bits_per_address (stdoutput) == 32
5764                          || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
5765                         ? "addu" : "daddu"),
5766                        "d,v,t", tempreg, tempreg, breg);
5767           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt, treg,
5768                        (int) BFD_RELOC_PCREL_LO16, tempreg);
5769           if (! used_at)
5770             return;
5771           break;
5772         }
5773
5774       if (offset_expr.X_op != O_constant
5775           && offset_expr.X_op != O_symbol)
5776         {
5777           as_bad (_("expression too complex"));
5778           offset_expr.X_op = O_constant;
5779         }
5780
5781       /* A constant expression in PIC code can be handled just as it
5782          is in non PIC code.  */
5783       if (mips_pic == NO_PIC
5784           || offset_expr.X_op == O_constant)
5785         {
5786           char *p;
5787
5788           /* If this is a reference to a GP relative symbol, and there
5789              is no base register, we want
5790                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
5791              Otherwise, if there is no base register, we want
5792                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5793                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5794              If we have a constant, we need two instructions anyhow,
5795              so we always use the latter form.
5796
5797              If we have a base register, and this is a reference to a
5798              GP relative symbol, we want
5799                addu     $tempreg,$breg,$gp
5800                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
5801              Otherwise we want
5802                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5803                addu     $tempreg,$tempreg,$breg
5804                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5805              With a constant we always use the latter case.
5806
5807              With 64bit address space and no base register and $at usable,
5808              we want
5809                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5810                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5811                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5812                dsll32   $tempreg,0
5813                daddu    $tempreg,$at
5814                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5815              If we have a base register, we want
5816                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5817                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5818                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5819                daddu    $at,$breg
5820                dsll32   $tempreg,0
5821                daddu    $tempreg,$at
5822                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5823
5824              Without $at we can't generate the optimal path for superscalar
5825              processors here since this would require two temporary registers.
5826                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5827                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5828                dsll     $tempreg,16
5829                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5830                dsll     $tempreg,16
5831                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5832              If we have a base register, we want
5833                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5834                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5835                dsll     $tempreg,16
5836                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5837                dsll     $tempreg,16
5838                daddu    $tempreg,$tempreg,$breg
5839                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5840
5841              If we have 64-bit addresses, as an optimization, for
5842              addresses which are 32-bit constants (e.g. kseg0/kseg1
5843              addresses) we fall back to the 32-bit address generation
5844              mechanism since it is more efficient.  Note that due to
5845              the signed offset used by memory operations, the 32-bit
5846              range is shifted down by 32768 here.  This code should
5847              probably attempt to generate 64-bit constants more
5848              efficiently in general.
5849            */
5850           if ((offset_expr.X_op != O_constant && HAVE_64BIT_ADDRESSES)
5851               || (offset_expr.X_op == O_constant
5852                   && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number)
5853                   && HAVE_64BIT_ADDRESS_CONSTANTS))
5854             {
5855               p = NULL;
5856
5857               /* We don't do GP optimization for now because RELAX_ENCODE can't
5858                  hold the data for such large chunks.  */
5859
5860               if (used_at == 0 && ! mips_opts.noat)
5861                 {
5862                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5863                                tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5864                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5865                                AT, (int) BFD_RELOC_HI16_S);
5866                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5867                                tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5868                   if (breg != 0)
5869                     macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5870                                  "d,v,t", AT, AT, breg);
5871                   macro_build (p, &icnt, (expressionS *) NULL, "dsll32",
5872                                "d,w,<", tempreg, tempreg, 0);
5873                   macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5874                                "d,v,t", tempreg, tempreg, AT);
5875                   macro_build (p, &icnt, &offset_expr, s,
5876                                fmt, treg, (int) BFD_RELOC_LO16, tempreg);
5877                   used_at = 1;
5878                 }
5879               else
5880                 {
5881                   macro_build (p, &icnt, &offset_expr, "lui", "t,u",
5882                                tempreg, (int) BFD_RELOC_MIPS_HIGHEST);
5883                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5884                                tempreg, tempreg, (int) BFD_RELOC_MIPS_HIGHER);
5885                   macro_build (p, &icnt, (expressionS *) NULL, "dsll",
5886                                "d,w,<", tempreg, tempreg, 16);
5887                   macro_build (p, &icnt, &offset_expr, "daddiu", "t,r,j",
5888                                tempreg, tempreg, (int) BFD_RELOC_HI16_S);
5889                   macro_build (p, &icnt, (expressionS *) NULL, "dsll",
5890                                "d,w,<", tempreg, tempreg, 16);
5891                   if (breg != 0)
5892                     macro_build (p, &icnt, (expressionS *) NULL, "daddu",
5893                                  "d,v,t", tempreg, tempreg, breg);
5894                   macro_build (p, &icnt, &offset_expr, s,
5895                                fmt, treg, (int) BFD_RELOC_LO16, tempreg);
5896                 }
5897
5898               return;
5899             }
5900           else if (offset_expr.X_op == O_constant
5901                    && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5902             as_bad (_("load/store address overflow (max 32 bits)"));
5903
5904           if (breg == 0)
5905             {
5906               if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
5907                   || nopic_need_relax (offset_expr.X_add_symbol, 1))
5908                 p = NULL;
5909               else
5910                 {
5911                   frag_grow (20);
5912                   macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5913                                treg, (int) BFD_RELOC_GPREL16,
5914                                mips_gp_register);
5915                   p = frag_var (rs_machine_dependent, 8, 0,
5916                                 RELAX_ENCODE (4, 8, 0, 4, 0,
5917                                               (mips_opts.warn_about_macros
5918                                                || (used_at
5919                                                    && mips_opts.noat))),
5920                                 offset_expr.X_add_symbol, 0, NULL);
5921                   used_at = 0;
5922                 }
5923               macro_build_lui (p, &icnt, &offset_expr, tempreg);
5924               if (p != NULL)
5925                 p += 4;
5926               macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5927                            (int) BFD_RELOC_LO16, tempreg);
5928             }
5929           else
5930             {
5931               if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
5932                   || nopic_need_relax (offset_expr.X_add_symbol, 1))
5933                 p = NULL;
5934               else
5935                 {
5936                   frag_grow (28);
5937                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
5938                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5939                                "d,v,t", tempreg, breg, mips_gp_register);
5940                   macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
5941                                treg, (int) BFD_RELOC_GPREL16, tempreg);
5942                   p = frag_var (rs_machine_dependent, 12, 0,
5943                                 RELAX_ENCODE (8, 12, 0, 8, 0, 0),
5944                                 offset_expr.X_add_symbol, 0, NULL);
5945                 }
5946               macro_build_lui (p, &icnt, &offset_expr, tempreg);
5947               if (p != NULL)
5948                 p += 4;
5949               macro_build (p, &icnt, (expressionS *) NULL,
5950                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
5951                            "d,v,t", tempreg, tempreg, breg);
5952               if (p != NULL)
5953                 p += 4;
5954               macro_build (p, &icnt, &offset_expr, s, fmt, treg,
5955                            (int) BFD_RELOC_LO16, tempreg);
5956             }
5957         }
5958       else if (mips_pic == SVR4_PIC && ! mips_big_got)
5959         {
5960           char *p;
5961           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5962
5963           /* If this is a reference to an external symbol, we want
5964                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5965                nop
5966                <op>     $treg,0($tempreg)
5967              Otherwise we want
5968                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5969                nop
5970                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5971                <op>     $treg,0($tempreg)
5972              If we have NewABI, we want
5973                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_DISP)
5974              If there is a base register, we add it to $tempreg before
5975              the <op>.  If there is a constant, we stick it in the
5976              <op> instruction.  We don't handle constants larger than
5977              16 bits, because we have no way to load the upper 16 bits
5978              (actually, we could handle them for the subset of cases
5979              in which we are not using $at).  */
5980           assert (offset_expr.X_op == O_symbol);
5981           expr1.X_add_number = offset_expr.X_add_number;
5982           offset_expr.X_add_number = 0;
5983           if (HAVE_NEWABI)
5984             lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_DISP;
5985           if (expr1.X_add_number < -0x8000
5986               || expr1.X_add_number >= 0x8000)
5987             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
5988           frag_grow (20);
5989           macro_build ((char *) NULL, &icnt, &offset_expr,
5990                        HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", tempreg,
5991                        (int) lw_reloc_type, mips_gp_register);
5992           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
5993           p = frag_var (rs_machine_dependent, 4, 0,
5994                         RELAX_ENCODE (0, 4, -8, 0, 0, 0),
5995                         offset_expr.X_add_symbol, 0, NULL);
5996           macro_build (p, &icnt, &offset_expr,
5997                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
5998                        "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
5999           if (breg != 0)
6000             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6001                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6002                          "d,v,t", tempreg, tempreg, breg);
6003           macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6004                        (int) BFD_RELOC_LO16, tempreg);
6005         }
6006       else if (mips_pic == SVR4_PIC)
6007         {
6008           int gpdel;
6009           char *p;
6010
6011           /* If this is a reference to an external symbol, we want
6012                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6013                addu     $tempreg,$tempreg,$gp
6014                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6015                <op>     $treg,0($tempreg)
6016              Otherwise we want
6017                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6018                nop
6019                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6020                <op>     $treg,0($tempreg)
6021              If there is a base register, we add it to $tempreg before
6022              the <op>.  If there is a constant, we stick it in the
6023              <op> instruction.  We don't handle constants larger than
6024              16 bits, because we have no way to load the upper 16 bits
6025              (actually, we could handle them for the subset of cases
6026              in which we are not using $at).
6027
6028              For NewABI, we want
6029                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6030                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_MIPS_GOT_OFST)
6031                <op>     $treg,0($tempreg)
6032            */
6033           assert (offset_expr.X_op == O_symbol);
6034           expr1.X_add_number = offset_expr.X_add_number;
6035           offset_expr.X_add_number = 0;
6036           if (expr1.X_add_number < -0x8000
6037               || expr1.X_add_number >= 0x8000)
6038             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6039           if (HAVE_NEWABI)
6040             {
6041               macro_build ((char *) NULL, &icnt, &offset_expr,
6042                            HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6043                            "t,o(b)", tempreg, BFD_RELOC_MIPS_GOT_PAGE,
6044                            mips_gp_register);
6045               macro_build ((char *) NULL, &icnt, &offset_expr,
6046                            HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
6047                            "t,r,j", tempreg, tempreg,
6048                            BFD_RELOC_MIPS_GOT_OFST);
6049               if (breg != 0)
6050                 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6051                              HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6052                              "d,v,t", tempreg, tempreg, breg);
6053               macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6054                            (int) BFD_RELOC_LO16, tempreg);
6055
6056               if (! used_at)
6057                 return;
6058
6059               break;
6060             }
6061           if (reg_needs_delay (mips_gp_register))
6062             gpdel = 4;
6063           else
6064             gpdel = 0;
6065           frag_grow (36);
6066           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6067                        tempreg, (int) BFD_RELOC_MIPS_GOT_HI16);
6068           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6069                        HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6070                        "d,v,t", tempreg, tempreg, mips_gp_register);
6071           macro_build ((char *) NULL, &icnt, &offset_expr,
6072                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6073                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT_LO16,
6074                        tempreg);
6075           p = frag_var (rs_machine_dependent, 12 + gpdel, 0,
6076                         RELAX_ENCODE (12, 12 + gpdel, gpdel, 8 + gpdel, 0, 0),
6077                         offset_expr.X_add_symbol, 0, NULL);
6078           if (gpdel > 0)
6079             {
6080               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6081               p += 4;
6082             }
6083           macro_build (p, &icnt, &offset_expr,
6084                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6085                        "t,o(b)", tempreg, (int) BFD_RELOC_MIPS_GOT16,
6086                        mips_gp_register);
6087           p += 4;
6088           macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6089           p += 4;
6090           macro_build (p, &icnt, &offset_expr,
6091                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu",
6092                        "t,r,j", tempreg, tempreg, (int) BFD_RELOC_LO16);
6093           if (breg != 0)
6094             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6095                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6096                          "d,v,t", tempreg, tempreg, breg);
6097           macro_build ((char *) NULL, &icnt, &expr1, s, fmt, treg,
6098                        (int) BFD_RELOC_LO16, tempreg);
6099         }
6100       else if (mips_pic == EMBEDDED_PIC)
6101         {
6102           /* If there is no base register, we want
6103                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6104              If there is a base register, we want
6105                addu     $tempreg,$breg,$gp
6106                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6107              */
6108           assert (offset_expr.X_op == O_symbol);
6109           if (breg == 0)
6110             {
6111               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6112                            treg, (int) BFD_RELOC_GPREL16, mips_gp_register);
6113               used_at = 0;
6114             }
6115           else
6116             {
6117               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6118                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6119                            "d,v,t", tempreg, breg, mips_gp_register);
6120               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6121                            treg, (int) BFD_RELOC_GPREL16, tempreg);
6122             }
6123         }
6124       else
6125         abort ();
6126
6127       if (! used_at)
6128         return;
6129
6130       break;
6131
6132     case M_LI:
6133     case M_LI_S:
6134       load_register (&icnt, treg, &imm_expr, 0);
6135       return;
6136
6137     case M_DLI:
6138       load_register (&icnt, treg, &imm_expr, 1);
6139       return;
6140
6141     case M_LI_SS:
6142       if (imm_expr.X_op == O_constant)
6143         {
6144           load_register (&icnt, AT, &imm_expr, 0);
6145           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6146                        "mtc1", "t,G", AT, treg);
6147           break;
6148         }
6149       else
6150         {
6151           assert (offset_expr.X_op == O_symbol
6152                   && strcmp (segment_name (S_GET_SEGMENT
6153                                            (offset_expr.X_add_symbol)),
6154                              ".lit4") == 0
6155                   && offset_expr.X_add_number == 0);
6156           macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6157                        treg, (int) BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6158           return;
6159         }
6160
6161     case M_LI_D:
6162       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6163          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6164          order 32 bits of the value and the low order 32 bits are either
6165          zero or in OFFSET_EXPR.  */
6166       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6167         {
6168           if (HAVE_64BIT_GPRS)
6169             load_register (&icnt, treg, &imm_expr, 1);
6170           else
6171             {
6172               int hreg, lreg;
6173
6174               if (target_big_endian)
6175                 {
6176                   hreg = treg;
6177                   lreg = treg + 1;
6178                 }
6179               else
6180                 {
6181                   hreg = treg + 1;
6182                   lreg = treg;
6183                 }
6184
6185               if (hreg <= 31)
6186                 load_register (&icnt, hreg, &imm_expr, 0);
6187               if (lreg <= 31)
6188                 {
6189                   if (offset_expr.X_op == O_absent)
6190                     move_register (&icnt, lreg, 0);
6191                   else
6192                     {
6193                       assert (offset_expr.X_op == O_constant);
6194                       load_register (&icnt, lreg, &offset_expr, 0);
6195                     }
6196                 }
6197             }
6198           return;
6199         }
6200
6201       /* We know that sym is in the .rdata section.  First we get the
6202          upper 16 bits of the address.  */
6203       if (mips_pic == NO_PIC)
6204         {
6205           macro_build_lui (NULL, &icnt, &offset_expr, AT);
6206         }
6207       else if (mips_pic == SVR4_PIC)
6208         {
6209           macro_build ((char *) NULL, &icnt, &offset_expr,
6210                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6211                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6212                        mips_gp_register);
6213         }
6214       else if (mips_pic == EMBEDDED_PIC)
6215         {
6216           /* For embedded PIC we pick up the entire address off $gp in
6217              a single instruction.  */
6218           macro_build ((char *) NULL, &icnt, &offset_expr,
6219                        HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu", "t,r,j", AT,
6220                        mips_gp_register, (int) BFD_RELOC_GPREL16);
6221           offset_expr.X_op = O_constant;
6222           offset_expr.X_add_number = 0;
6223         }
6224       else
6225         abort ();
6226
6227       /* Now we load the register(s).  */
6228       if (HAVE_64BIT_GPRS)
6229         macro_build ((char *) NULL, &icnt, &offset_expr, "ld", "t,o(b)",
6230                      treg, (int) BFD_RELOC_LO16, AT);
6231       else
6232         {
6233           macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6234                        treg, (int) BFD_RELOC_LO16, AT);
6235           if (treg != RA)
6236             {
6237               /* FIXME: How in the world do we deal with the possible
6238                  overflow here?  */
6239               offset_expr.X_add_number += 4;
6240               macro_build ((char *) NULL, &icnt, &offset_expr, "lw", "t,o(b)",
6241                            treg + 1, (int) BFD_RELOC_LO16, AT);
6242             }
6243         }
6244
6245       /* To avoid confusion in tc_gen_reloc, we must ensure that this
6246          does not become a variant frag.  */
6247       frag_wane (frag_now);
6248       frag_new (0);
6249
6250       break;
6251
6252     case M_LI_DD:
6253       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6254          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6255          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6256          the value and the low order 32 bits are either zero or in
6257          OFFSET_EXPR.  */
6258       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6259         {
6260           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_FPRS);
6261           if (HAVE_64BIT_FPRS)
6262             {
6263               assert (HAVE_64BIT_GPRS);
6264               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6265                            "dmtc1", "t,S", AT, treg);
6266             }
6267           else
6268             {
6269               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6270                            "mtc1", "t,G", AT, treg + 1);
6271               if (offset_expr.X_op == O_absent)
6272                 macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6273                              "mtc1", "t,G", 0, treg);
6274               else
6275                 {
6276                   assert (offset_expr.X_op == O_constant);
6277                   load_register (&icnt, AT, &offset_expr, 0);
6278                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6279                                "mtc1", "t,G", AT, treg);
6280                 }
6281             }
6282           break;
6283         }
6284
6285       assert (offset_expr.X_op == O_symbol
6286               && offset_expr.X_add_number == 0);
6287       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6288       if (strcmp (s, ".lit8") == 0)
6289         {
6290           if (mips_opts.isa != ISA_MIPS1)
6291             {
6292               macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6293                            "T,o(b)", treg, (int) BFD_RELOC_MIPS_LITERAL,
6294                            mips_gp_register);
6295               return;
6296             }
6297           breg = mips_gp_register;
6298           r = BFD_RELOC_MIPS_LITERAL;
6299           goto dob;
6300         }
6301       else
6302         {
6303           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6304           if (mips_pic == SVR4_PIC)
6305             macro_build ((char *) NULL, &icnt, &offset_expr,
6306                          HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6307                          "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6308                          mips_gp_register);
6309           else
6310             {
6311               /* FIXME: This won't work for a 64 bit address.  */
6312               macro_build_lui (NULL, &icnt, &offset_expr, AT);
6313             }
6314
6315           if (mips_opts.isa != ISA_MIPS1)
6316             {
6317               macro_build ((char *) NULL, &icnt, &offset_expr, "ldc1",
6318                            "T,o(b)", treg, (int) BFD_RELOC_LO16, AT);
6319
6320               /* To avoid confusion in tc_gen_reloc, we must ensure
6321                  that this does not become a variant frag.  */
6322               frag_wane (frag_now);
6323               frag_new (0);
6324
6325               break;
6326             }
6327           breg = AT;
6328           r = BFD_RELOC_LO16;
6329           goto dob;
6330         }
6331
6332     case M_L_DOB:
6333       if (mips_arch == CPU_R4650)
6334         {
6335           as_bad (_("opcode not supported on this processor"));
6336           return;
6337         }
6338       /* Even on a big endian machine $fn comes before $fn+1.  We have
6339          to adjust when loading from memory.  */
6340       r = BFD_RELOC_LO16;
6341     dob:
6342       assert (mips_opts.isa == ISA_MIPS1);
6343       macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6344                    target_big_endian ? treg + 1 : treg,
6345                    (int) r, breg);
6346       /* FIXME: A possible overflow which I don't know how to deal
6347          with.  */
6348       offset_expr.X_add_number += 4;
6349       macro_build ((char *) NULL, &icnt, &offset_expr, "lwc1", "T,o(b)",
6350                    target_big_endian ? treg : treg + 1,
6351                    (int) r, breg);
6352
6353       /* To avoid confusion in tc_gen_reloc, we must ensure that this
6354          does not become a variant frag.  */
6355       frag_wane (frag_now);
6356       frag_new (0);
6357
6358       if (breg != AT)
6359         return;
6360       break;
6361
6362     case M_L_DAB:
6363       /*
6364        * The MIPS assembler seems to check for X_add_number not
6365        * being double aligned and generating:
6366        *        lui     at,%hi(foo+1)
6367        *        addu    at,at,v1
6368        *        addiu   at,at,%lo(foo+1)
6369        *        lwc1    f2,0(at)
6370        *        lwc1    f3,4(at)
6371        * But, the resulting address is the same after relocation so why
6372        * generate the extra instruction?
6373        */
6374       if (mips_arch == CPU_R4650)
6375         {
6376           as_bad (_("opcode not supported on this processor"));
6377           return;
6378         }
6379       /* Itbl support may require additional care here.  */
6380       coproc = 1;
6381       if (mips_opts.isa != ISA_MIPS1)
6382         {
6383           s = "ldc1";
6384           goto ld;
6385         }
6386
6387       s = "lwc1";
6388       fmt = "T,o(b)";
6389       goto ldd_std;
6390
6391     case M_S_DAB:
6392       if (mips_arch == CPU_R4650)
6393         {
6394           as_bad (_("opcode not supported on this processor"));
6395           return;
6396         }
6397
6398       if (mips_opts.isa != ISA_MIPS1)
6399         {
6400           s = "sdc1";
6401           goto st;
6402         }
6403
6404       s = "swc1";
6405       fmt = "T,o(b)";
6406       /* Itbl support may require additional care here.  */
6407       coproc = 1;
6408       goto ldd_std;
6409
6410     case M_LD_AB:
6411       if (HAVE_64BIT_GPRS)
6412         {
6413           s = "ld";
6414           goto ld;
6415         }
6416
6417       s = "lw";
6418       fmt = "t,o(b)";
6419       goto ldd_std;
6420
6421     case M_SD_AB:
6422       if (HAVE_64BIT_GPRS)
6423         {
6424           s = "sd";
6425           goto st;
6426         }
6427
6428       s = "sw";
6429       fmt = "t,o(b)";
6430
6431     ldd_std:
6432       /* We do _not_ bother to allow embedded PIC (symbol-local_symbol)
6433          loads for the case of doing a pair of loads to simulate an 'ld'.
6434          This is not currently done by the compiler, and assembly coders
6435          writing embedded-pic code can cope.  */
6436
6437       if (offset_expr.X_op != O_symbol
6438           && offset_expr.X_op != O_constant)
6439         {
6440           as_bad (_("expression too complex"));
6441           offset_expr.X_op = O_constant;
6442         }
6443
6444       /* Even on a big endian machine $fn comes before $fn+1.  We have
6445          to adjust when loading from memory.  We set coproc if we must
6446          load $fn+1 first.  */
6447       /* Itbl support may require additional care here.  */
6448       if (! target_big_endian)
6449         coproc = 0;
6450
6451       if (mips_pic == NO_PIC
6452           || offset_expr.X_op == O_constant)
6453         {
6454           char *p;
6455
6456           /* If this is a reference to a GP relative symbol, we want
6457                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6458                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6459              If we have a base register, we use this
6460                addu     $at,$breg,$gp
6461                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6462                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6463              If this is not a GP relative symbol, we want
6464                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6465                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6466                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6467              If there is a base register, we add it to $at after the
6468              lui instruction.  If there is a constant, we always use
6469              the last case.  */
6470           if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6471               || nopic_need_relax (offset_expr.X_add_symbol, 1))
6472             {
6473               p = NULL;
6474               used_at = 1;
6475             }
6476           else
6477             {
6478               int off;
6479
6480               if (breg == 0)
6481                 {
6482                   frag_grow (28);
6483                   tempreg = mips_gp_register;
6484                   off = 0;
6485                   used_at = 0;
6486                 }
6487               else
6488                 {
6489                   frag_grow (36);
6490                   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6491                                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6492                                "d,v,t", AT, breg, mips_gp_register);
6493                   tempreg = AT;
6494                   off = 4;
6495                   used_at = 1;
6496                 }
6497
6498               /* Itbl support may require additional care here.  */
6499               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6500                            coproc ? treg + 1 : treg,
6501                            (int) BFD_RELOC_GPREL16, tempreg);
6502               offset_expr.X_add_number += 4;
6503
6504               /* Set mips_optimize to 2 to avoid inserting an
6505                  undesired nop.  */
6506               hold_mips_optimize = mips_optimize;
6507               mips_optimize = 2;
6508               /* Itbl support may require additional care here.  */
6509               macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6510                            coproc ? treg : treg + 1,
6511                            (int) BFD_RELOC_GPREL16, tempreg);
6512               mips_optimize = hold_mips_optimize;
6513
6514               p = frag_var (rs_machine_dependent, 12 + off, 0,
6515                             RELAX_ENCODE (8 + off, 12 + off, 0, 4 + off, 1,
6516                                           used_at && mips_opts.noat),
6517                             offset_expr.X_add_symbol, 0, NULL);
6518
6519               /* We just generated two relocs.  When tc_gen_reloc
6520                  handles this case, it will skip the first reloc and
6521                  handle the second.  The second reloc already has an
6522                  extra addend of 4, which we added above.  We must
6523                  subtract it out, and then subtract another 4 to make
6524                  the first reloc come out right.  The second reloc
6525                  will come out right because we are going to add 4 to
6526                  offset_expr when we build its instruction below.
6527
6528                  If we have a symbol, then we don't want to include
6529                  the offset, because it will wind up being included
6530                  when we generate the reloc.  */
6531
6532               if (offset_expr.X_op == O_constant)
6533                 offset_expr.X_add_number -= 8;
6534               else
6535                 {
6536                   offset_expr.X_add_number = -4;
6537                   offset_expr.X_op = O_constant;
6538                 }
6539             }
6540           macro_build_lui (p, &icnt, &offset_expr, AT);
6541           if (p != NULL)
6542             p += 4;
6543           if (breg != 0)
6544             {
6545               macro_build (p, &icnt, (expressionS *) NULL,
6546                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6547                            "d,v,t", AT, breg, AT);
6548               if (p != NULL)
6549                 p += 4;
6550             }
6551           /* Itbl support may require additional care here.  */
6552           macro_build (p, &icnt, &offset_expr, s, fmt,
6553                        coproc ? treg + 1 : treg,
6554                        (int) BFD_RELOC_LO16, AT);
6555           if (p != NULL)
6556             p += 4;
6557           /* FIXME: How do we handle overflow here?  */
6558           offset_expr.X_add_number += 4;
6559           /* Itbl support may require additional care here.  */
6560           macro_build (p, &icnt, &offset_expr, s, fmt,
6561                        coproc ? treg : treg + 1,
6562                        (int) BFD_RELOC_LO16, AT);
6563         }
6564       else if (mips_pic == SVR4_PIC && ! mips_big_got)
6565         {
6566           int off;
6567
6568           /* If this is a reference to an external symbol, we want
6569                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6570                nop
6571                <op>     $treg,0($at)
6572                <op>     $treg+1,4($at)
6573              Otherwise we want
6574                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6575                nop
6576                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6577                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6578              If there is a base register we add it to $at before the
6579              lwc1 instructions.  If there is a constant we include it
6580              in the lwc1 instructions.  */
6581           used_at = 1;
6582           expr1.X_add_number = offset_expr.X_add_number;
6583           offset_expr.X_add_number = 0;
6584           if (expr1.X_add_number < -0x8000
6585               || expr1.X_add_number >= 0x8000 - 4)
6586             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6587           if (breg == 0)
6588             off = 0;
6589           else
6590             off = 4;
6591           frag_grow (24 + off);
6592           macro_build ((char *) NULL, &icnt, &offset_expr,
6593                        HAVE_32BIT_ADDRESSES ? "lw" : "ld", "t,o(b)", AT,
6594                        (int) BFD_RELOC_MIPS_GOT16, mips_gp_register);
6595           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6596           if (breg != 0)
6597             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6598                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6599                          "d,v,t", AT, breg, AT);
6600           /* Itbl support may require additional care here.  */
6601           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6602                        coproc ? treg + 1 : treg,
6603                        (int) BFD_RELOC_LO16, AT);
6604           expr1.X_add_number += 4;
6605
6606           /* Set mips_optimize to 2 to avoid inserting an undesired
6607              nop.  */
6608           hold_mips_optimize = mips_optimize;
6609           mips_optimize = 2;
6610           /* Itbl support may require additional care here.  */
6611           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6612                        coproc ? treg : treg + 1,
6613                        (int) BFD_RELOC_LO16, AT);
6614           mips_optimize = hold_mips_optimize;
6615
6616           (void) frag_var (rs_machine_dependent, 0, 0,
6617                            RELAX_ENCODE (0, 0, -16 - off, -8, 1, 0),
6618                            offset_expr.X_add_symbol, 0, NULL);
6619         }
6620       else if (mips_pic == SVR4_PIC)
6621         {
6622           int gpdel, off;
6623           char *p;
6624
6625           /* If this is a reference to an external symbol, we want
6626                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
6627                addu     $at,$at,$gp
6628                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
6629                nop
6630                <op>     $treg,0($at)
6631                <op>     $treg+1,4($at)
6632              Otherwise we want
6633                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6634                nop
6635                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6636                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6637              If there is a base register we add it to $at before the
6638              lwc1 instructions.  If there is a constant we include it
6639              in the lwc1 instructions.  */
6640           used_at = 1;
6641           expr1.X_add_number = offset_expr.X_add_number;
6642           offset_expr.X_add_number = 0;
6643           if (expr1.X_add_number < -0x8000
6644               || expr1.X_add_number >= 0x8000 - 4)
6645             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6646           if (reg_needs_delay (mips_gp_register))
6647             gpdel = 4;
6648           else
6649             gpdel = 0;
6650           if (breg == 0)
6651             off = 0;
6652           else
6653             off = 4;
6654           frag_grow (56);
6655           macro_build ((char *) NULL, &icnt, &offset_expr, "lui", "t,u",
6656                        AT, (int) BFD_RELOC_MIPS_GOT_HI16);
6657           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6658                        HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6659                        "d,v,t", AT, AT, mips_gp_register);
6660           macro_build ((char *) NULL, &icnt, &offset_expr,
6661                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6662                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT_LO16, AT);
6663           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
6664           if (breg != 0)
6665             macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6666                          HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6667                          "d,v,t", AT, breg, AT);
6668           /* Itbl support may require additional care here.  */
6669           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6670                        coproc ? treg + 1 : treg,
6671                        (int) BFD_RELOC_LO16, AT);
6672           expr1.X_add_number += 4;
6673
6674           /* Set mips_optimize to 2 to avoid inserting an undesired
6675              nop.  */
6676           hold_mips_optimize = mips_optimize;
6677           mips_optimize = 2;
6678           /* Itbl support may require additional care here.  */
6679           macro_build ((char *) NULL, &icnt, &expr1, s, fmt,
6680                        coproc ? treg : treg + 1,
6681                        (int) BFD_RELOC_LO16, AT);
6682           mips_optimize = hold_mips_optimize;
6683           expr1.X_add_number -= 4;
6684
6685           p = frag_var (rs_machine_dependent, 16 + gpdel + off, 0,
6686                         RELAX_ENCODE (24 + off, 16 + gpdel + off, gpdel,
6687                                       8 + gpdel + off, 1, 0),
6688                         offset_expr.X_add_symbol, 0, NULL);
6689           if (gpdel > 0)
6690             {
6691               macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6692               p += 4;
6693             }
6694           macro_build (p, &icnt, &offset_expr,
6695                        HAVE_32BIT_ADDRESSES ? "lw" : "ld",
6696                        "t,o(b)", AT, (int) BFD_RELOC_MIPS_GOT16,
6697                        mips_gp_register);
6698           p += 4;
6699           macro_build (p, &icnt, (expressionS *) NULL, "nop", "");
6700           p += 4;
6701           if (breg != 0)
6702             {
6703               macro_build (p, &icnt, (expressionS *) NULL,
6704                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6705                            "d,v,t", AT, breg, AT);
6706               p += 4;
6707             }
6708           /* Itbl support may require additional care here.  */
6709           macro_build (p, &icnt, &expr1, s, fmt,
6710                        coproc ? treg + 1 : treg,
6711                        (int) BFD_RELOC_LO16, AT);
6712           p += 4;
6713           expr1.X_add_number += 4;
6714
6715           /* Set mips_optimize to 2 to avoid inserting an undesired
6716              nop.  */
6717           hold_mips_optimize = mips_optimize;
6718           mips_optimize = 2;
6719           /* Itbl support may require additional care here.  */
6720           macro_build (p, &icnt, &expr1, s, fmt,
6721                        coproc ? treg : treg + 1,
6722                        (int) BFD_RELOC_LO16, AT);
6723           mips_optimize = hold_mips_optimize;
6724         }
6725       else if (mips_pic == EMBEDDED_PIC)
6726         {
6727           /* If there is no base register, we use
6728                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6729                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6730              If we have a base register, we use
6731                addu     $at,$breg,$gp
6732                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6733                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6734              */
6735           if (breg == 0)
6736             {
6737               tempreg = mips_gp_register;
6738               used_at = 0;
6739             }
6740           else
6741             {
6742               macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6743                            HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
6744                            "d,v,t", AT, breg, mips_gp_register);
6745               tempreg = AT;
6746               used_at = 1;
6747             }
6748
6749           /* Itbl support may require additional care here.  */
6750           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6751                        coproc ? treg + 1 : treg,
6752                        (int) BFD_RELOC_GPREL16, tempreg);
6753           offset_expr.X_add_number += 4;
6754           /* Itbl support may require additional care here.  */
6755           macro_build ((char *) NULL, &icnt, &offset_expr, s, fmt,
6756                        coproc ? treg : treg + 1,
6757                        (int) BFD_RELOC_GPREL16, tempreg);
6758         }
6759       else
6760         abort ();
6761
6762       if (! used_at)
6763         return;
6764
6765       break;
6766
6767     case M_LD_OB:
6768       s = "lw";
6769       goto sd_ob;
6770     case M_SD_OB:
6771       s = "sw";
6772     sd_ob:
6773       assert (HAVE_32BIT_ADDRESSES);
6774       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
6775                    (int) BFD_RELOC_LO16, breg);
6776       offset_expr.X_add_number += 4;
6777       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg + 1,
6778                    (int) BFD_RELOC_LO16, breg);
6779       return;
6780
6781    /* New code added to support COPZ instructions.
6782       This code builds table entries out of the macros in mip_opcodes.
6783       R4000 uses interlocks to handle coproc delays.
6784       Other chips (like the R3000) require nops to be inserted for delays.
6785
6786       FIXME: Currently, we require that the user handle delays.
6787       In order to fill delay slots for non-interlocked chips,
6788       we must have a way to specify delays based on the coprocessor.
6789       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6790       What are the side-effects of the cop instruction?
6791       What cache support might we have and what are its effects?
6792       Both coprocessor & memory require delays. how long???
6793       What registers are read/set/modified?
6794
6795       If an itbl is provided to interpret cop instructions,
6796       this knowledge can be encoded in the itbl spec.  */
6797
6798     case M_COP0:
6799       s = "c0";
6800       goto copz;
6801     case M_COP1:
6802       s = "c1";
6803       goto copz;
6804     case M_COP2:
6805       s = "c2";
6806       goto copz;
6807     case M_COP3:
6808       s = "c3";
6809     copz:
6810       /* For now we just do C (same as Cz).  The parameter will be
6811          stored in insn_opcode by mips_ip.  */
6812       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "C",
6813                    ip->insn_opcode);
6814       return;
6815
6816     case M_MOVE:
6817       move_register (&icnt, dreg, sreg);
6818       return;
6819
6820 #ifdef LOSING_COMPILER
6821     default:
6822       /* Try and see if this is a new itbl instruction.
6823          This code builds table entries out of the macros in mip_opcodes.
6824          FIXME: For now we just assemble the expression and pass it's
6825          value along as a 32-bit immediate.
6826          We may want to have the assembler assemble this value,
6827          so that we gain the assembler's knowledge of delay slots,
6828          symbols, etc.
6829          Would it be more efficient to use mask (id) here? */
6830       if (itbl_have_entries
6831           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
6832         {
6833           s = ip->insn_mo->name;
6834           s2 = "cop3";
6835           coproc = ITBL_DECODE_PNUM (immed_expr);;
6836           macro_build ((char *) NULL, &icnt, &immed_expr, s, "C");
6837           return;
6838         }
6839       macro2 (ip);
6840       return;
6841     }
6842   if (mips_opts.noat)
6843     as_warn (_("Macro used $at after \".set noat\""));
6844 }
6845
6846 static void
6847 macro2 (ip)
6848      struct mips_cl_insn *ip;
6849 {
6850   register int treg, sreg, dreg, breg;
6851   int tempreg;
6852   int mask;
6853   int icnt = 0;
6854   int used_at;
6855   expressionS expr1;
6856   const char *s;
6857   const char *s2;
6858   const char *fmt;
6859   int likely = 0;
6860   int dbl = 0;
6861   int coproc = 0;
6862   int lr = 0;
6863   int imm = 0;
6864   int off;
6865   offsetT maxnum;
6866   bfd_reloc_code_real_type r;
6867   char *p;
6868
6869   treg = (ip->insn_opcode >> 16) & 0x1f;
6870   dreg = (ip->insn_opcode >> 11) & 0x1f;
6871   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
6872   mask = ip->insn_mo->mask;
6873
6874   expr1.X_op = O_constant;
6875   expr1.X_op_symbol = NULL;
6876   expr1.X_add_symbol = NULL;
6877   expr1.X_add_number = 1;
6878
6879   switch (mask)
6880     {
6881 #endif /* LOSING_COMPILER */
6882
6883     case M_DMUL:
6884       dbl = 1;
6885     case M_MUL:
6886       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6887                    dbl ? "dmultu" : "multu", "s,t", sreg, treg);
6888       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6889                    dreg);
6890       return;
6891
6892     case M_DMUL_I:
6893       dbl = 1;
6894     case M_MUL_I:
6895       /* The MIPS assembler some times generates shifts and adds.  I'm
6896          not trying to be that fancy. GCC should do this for us
6897          anyway.  */
6898       load_register (&icnt, AT, &imm_expr, dbl);
6899       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6900                    dbl ? "dmult" : "mult", "s,t", sreg, AT);
6901       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6902                    dreg);
6903       break;
6904
6905     case M_DMULO_I:
6906       dbl = 1;
6907     case M_MULO_I:
6908       imm = 1;
6909       goto do_mulo;
6910
6911     case M_DMULO:
6912       dbl = 1;
6913     case M_MULO:
6914     do_mulo:
6915       mips_emit_delays (TRUE);
6916       ++mips_opts.noreorder;
6917       mips_any_noreorder = 1;
6918       if (imm)
6919         load_register (&icnt, AT, &imm_expr, dbl);
6920       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6921                    dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
6922       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6923                    dreg);
6924       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6925                    dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
6926       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
6927                    AT);
6928       if (mips_trap)
6929         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
6930                      "s,t,q", dreg, AT, 6);
6931       else
6932         {
6933           expr1.X_add_number = 8;
6934           macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", dreg,
6935                        AT);
6936           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
6937                        0);
6938           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
6939                        "c", 6);
6940         }
6941       --mips_opts.noreorder;
6942       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d", dreg);
6943       break;
6944
6945     case M_DMULOU_I:
6946       dbl = 1;
6947     case M_MULOU_I:
6948       imm = 1;
6949       goto do_mulou;
6950
6951     case M_DMULOU:
6952       dbl = 1;
6953     case M_MULOU:
6954     do_mulou:
6955       mips_emit_delays (TRUE);
6956       ++mips_opts.noreorder;
6957       mips_any_noreorder = 1;
6958       if (imm)
6959         load_register (&icnt, AT, &imm_expr, dbl);
6960       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
6961                    dbl ? "dmultu" : "multu",
6962                    "s,t", sreg, imm ? AT : treg);
6963       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mfhi", "d",
6964                    AT);
6965       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "d",
6966                    dreg);
6967       if (mips_trap)
6968         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "tne",
6969                      "s,t,q", AT, 0, 6);
6970       else
6971         {
6972           expr1.X_add_number = 8;
6973           macro_build ((char *) NULL, &icnt, &expr1, "beq", "s,t,p", AT, 0);
6974           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "",
6975                        0);
6976           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
6977                        "c", 6);
6978         }
6979       --mips_opts.noreorder;
6980       break;
6981
6982     case M_DROL:
6983       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
6984         {
6985           if (dreg == sreg)
6986             {
6987               tempreg = AT;
6988               used_at = 1;
6989             }
6990           else
6991             {
6992               tempreg = dreg;
6993               used_at = 0;
6994             }
6995           macro_build ((char *) NULL, &icnt, NULL, "dnegu",
6996                        "d,w", tempreg, treg);
6997           macro_build ((char *) NULL, &icnt, NULL, "drorv",
6998                        "d,t,s", dreg, sreg, tempreg);
6999           if (used_at)
7000             break;
7001           return;
7002         }
7003       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
7004                    "d,v,t", AT, 0, treg);
7005       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
7006                    "d,t,s", AT, sreg, AT);
7007       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
7008                    "d,t,s", dreg, sreg, treg);
7009       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7010                    "d,v,t", dreg, dreg, AT);
7011       break;
7012
7013     case M_ROL:
7014       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7015         {
7016           if (dreg == sreg)
7017             {
7018               tempreg = AT;
7019               used_at = 1;
7020             }
7021           else
7022             {
7023               tempreg = dreg;
7024               used_at = 0;
7025             }
7026           macro_build ((char *) NULL, &icnt, NULL, "negu",
7027                        "d,w", tempreg, treg);
7028           macro_build ((char *) NULL, &icnt, NULL, "rorv",
7029                        "d,t,s", dreg, sreg, tempreg);
7030           if (used_at)
7031             break;
7032           return;
7033         }
7034       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7035                    "d,v,t", AT, 0, treg);
7036       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7037                    "d,t,s", AT, sreg, AT);
7038       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7039                    "d,t,s", dreg, sreg, treg);
7040       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7041                    "d,v,t", dreg, dreg, AT);
7042       break;
7043
7044     case M_DROL_I:
7045       {
7046         unsigned int rot;
7047         char *l, *r;
7048
7049         if (imm_expr.X_op != O_constant)
7050           as_bad (_("Improper rotate count"));
7051         rot = imm_expr.X_add_number & 0x3f;
7052         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7053           {
7054             rot = (64 - rot) & 0x3f;
7055             if (rot >= 32)
7056               macro_build ((char *) NULL, &icnt, NULL, "dror32",
7057                            "d,w,<", dreg, sreg, rot - 32);
7058             else
7059               macro_build ((char *) NULL, &icnt, NULL, "dror",
7060                            "d,w,<", dreg, sreg, rot);
7061             return;
7062           }
7063         if (rot == 0)
7064           {
7065             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7066                          "d,w,<", dreg, sreg, 0);
7067             return;
7068           }
7069         l = (rot < 0x20) ? "dsll" : "dsll32";
7070         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7071         rot &= 0x1f;
7072         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7073                      "d,w,<", AT, sreg, rot);
7074         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7075                      "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7076         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7077                      "d,v,t", dreg, dreg, AT);
7078       }
7079       break;
7080
7081     case M_ROL_I:
7082       {
7083         unsigned int rot;
7084
7085         if (imm_expr.X_op != O_constant)
7086           as_bad (_("Improper rotate count"));
7087         rot = imm_expr.X_add_number & 0x1f;
7088         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7089           {
7090             macro_build ((char *) NULL, &icnt, NULL, "ror",
7091                          "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7092             return;
7093           }
7094         if (rot == 0)
7095           {
7096             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7097                          "d,w,<", dreg, sreg, 0);
7098             return;
7099           }
7100         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7101                      "d,w,<", AT, sreg, rot);
7102         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7103                      "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7104         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7105                      "d,v,t", dreg, dreg, AT);
7106       }
7107       break;
7108
7109     case M_DROR:
7110       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7111         {
7112           macro_build ((char *) NULL, &icnt, NULL, "drorv",
7113                        "d,t,s", dreg, sreg, treg);
7114           return;
7115         }
7116       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsubu",
7117                    "d,v,t", AT, 0, treg);
7118       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsllv",
7119                    "d,t,s", AT, sreg, AT);
7120       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrlv",
7121                    "d,t,s", dreg, sreg, treg);
7122       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7123                    "d,v,t", dreg, dreg, AT);
7124       break;
7125
7126     case M_ROR:
7127       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7128         {
7129           macro_build ((char *) NULL, &icnt, NULL, "rorv",
7130                        "d,t,s", dreg, sreg, treg);
7131           return;
7132         }
7133       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "subu",
7134                    "d,v,t", AT, 0, treg);
7135       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sllv",
7136                    "d,t,s", AT, sreg, AT);
7137       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srlv",
7138                    "d,t,s", dreg, sreg, treg);
7139       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7140                    "d,v,t", dreg, dreg, AT);
7141       break;
7142
7143     case M_DROR_I:
7144       {
7145         unsigned int rot;
7146         char *l, *r;
7147
7148         if (imm_expr.X_op != O_constant)
7149           as_bad (_("Improper rotate count"));
7150         rot = imm_expr.X_add_number & 0x3f;
7151         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_arch))
7152           {
7153             if (rot >= 32)
7154               macro_build ((char *) NULL, &icnt, NULL, "dror32",
7155                            "d,w,<", dreg, sreg, rot - 32);
7156             else
7157               macro_build ((char *) NULL, &icnt, NULL, "dror",
7158                            "d,w,<", dreg, sreg, rot);
7159             return;
7160           }
7161         if (rot == 0)
7162           {
7163             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "dsrl",
7164                          "d,w,<", dreg, sreg, 0);
7165             return;
7166           }
7167         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7168         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7169         rot &= 0x1f;
7170         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, r,
7171                      "d,w,<", AT, sreg, rot);
7172         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, l,
7173                      "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7174         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7175                      "d,v,t", dreg, dreg, AT);
7176       }
7177       break;
7178
7179     case M_ROR_I:
7180       {
7181         unsigned int rot;
7182
7183         if (imm_expr.X_op != O_constant)
7184           as_bad (_("Improper rotate count"));
7185         rot = imm_expr.X_add_number & 0x1f;
7186         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_arch))
7187           {
7188             macro_build ((char *) NULL, &icnt, NULL, "ror",
7189                          "d,w,<", dreg, sreg, rot);
7190             return;
7191           }
7192         if (rot == 0)
7193           {
7194             macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7195                          "d,w,<", dreg, sreg, 0);
7196             return;
7197           }
7198         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl",
7199                      "d,w,<", AT, sreg, rot);
7200         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll",
7201                      "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7202         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or",
7203                      "d,v,t", dreg, dreg, AT);
7204       }
7205       break;
7206
7207     case M_S_DOB:
7208       if (mips_arch == CPU_R4650)
7209         {
7210           as_bad (_("opcode not supported on this processor"));
7211           return;
7212         }
7213       assert (mips_opts.isa == ISA_MIPS1);
7214       /* Even on a big endian machine $fn comes before $fn+1.  We have
7215          to adjust when storing to memory.  */
7216       macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7217                    target_big_endian ? treg + 1 : treg,
7218                    (int) BFD_RELOC_LO16, breg);
7219       offset_expr.X_add_number += 4;
7220       macro_build ((char *) NULL, &icnt, &offset_expr, "swc1", "T,o(b)",
7221                    target_big_endian ? treg : treg + 1,
7222                    (int) BFD_RELOC_LO16, breg);
7223       return;
7224
7225     case M_SEQ:
7226       if (sreg == 0)
7227         macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7228                      treg, (int) BFD_RELOC_LO16);
7229       else if (treg == 0)
7230         macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7231                      sreg, (int) BFD_RELOC_LO16);
7232       else
7233         {
7234           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7235                        "d,v,t", dreg, sreg, treg);
7236           macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7237                        dreg, (int) BFD_RELOC_LO16);
7238         }
7239       return;
7240
7241     case M_SEQ_I:
7242       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7243         {
7244           macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg,
7245                        sreg, (int) BFD_RELOC_LO16);
7246           return;
7247         }
7248       if (sreg == 0)
7249         {
7250           as_warn (_("Instruction %s: result is always false"),
7251                    ip->insn_mo->name);
7252           move_register (&icnt, dreg, 0);
7253           return;
7254         }
7255       if (imm_expr.X_op == O_constant
7256           && imm_expr.X_add_number >= 0
7257           && imm_expr.X_add_number < 0x10000)
7258         {
7259           macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i", dreg,
7260                        sreg, (int) BFD_RELOC_LO16);
7261           used_at = 0;
7262         }
7263       else if (imm_expr.X_op == O_constant
7264                && imm_expr.X_add_number > -0x8000
7265                && imm_expr.X_add_number < 0)
7266         {
7267           imm_expr.X_add_number = -imm_expr.X_add_number;
7268           macro_build ((char *) NULL, &icnt, &imm_expr,
7269                        HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7270                        "t,r,j", dreg, sreg,
7271                        (int) BFD_RELOC_LO16);
7272           used_at = 0;
7273         }
7274       else
7275         {
7276           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7277           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7278                        "d,v,t", dreg, sreg, AT);
7279           used_at = 1;
7280         }
7281       macro_build ((char *) NULL, &icnt, &expr1, "sltiu", "t,r,j", dreg, dreg,
7282                    (int) BFD_RELOC_LO16);
7283       if (used_at)
7284         break;
7285       return;
7286
7287     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7288       s = "slt";
7289       goto sge;
7290     case M_SGEU:
7291       s = "sltu";
7292     sge:
7293       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7294                    dreg, sreg, treg);
7295       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7296                    (int) BFD_RELOC_LO16);
7297       return;
7298
7299     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7300     case M_SGEU_I:
7301       if (imm_expr.X_op == O_constant
7302           && imm_expr.X_add_number >= -0x8000
7303           && imm_expr.X_add_number < 0x8000)
7304         {
7305           macro_build ((char *) NULL, &icnt, &imm_expr,
7306                        mask == M_SGE_I ? "slti" : "sltiu",
7307                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7308           used_at = 0;
7309         }
7310       else
7311         {
7312           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7313           macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7314                        mask == M_SGE_I ? "slt" : "sltu", "d,v,t", dreg, sreg,
7315                        AT);
7316           used_at = 1;
7317         }
7318       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7319                    (int) BFD_RELOC_LO16);
7320       if (used_at)
7321         break;
7322       return;
7323
7324     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7325       s = "slt";
7326       goto sgt;
7327     case M_SGTU:
7328       s = "sltu";
7329     sgt:
7330       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7331                    dreg, treg, sreg);
7332       return;
7333
7334     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7335       s = "slt";
7336       goto sgti;
7337     case M_SGTU_I:
7338       s = "sltu";
7339     sgti:
7340       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7341       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7342                    dreg, AT, sreg);
7343       break;
7344
7345     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7346       s = "slt";
7347       goto sle;
7348     case M_SLEU:
7349       s = "sltu";
7350     sle:
7351       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7352                    dreg, treg, sreg);
7353       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7354                    (int) BFD_RELOC_LO16);
7355       return;
7356
7357     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7358       s = "slt";
7359       goto slei;
7360     case M_SLEU_I:
7361       s = "sltu";
7362     slei:
7363       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7364       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "d,v,t",
7365                    dreg, AT, sreg);
7366       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", dreg, dreg,
7367                    (int) BFD_RELOC_LO16);
7368       break;
7369
7370     case M_SLT_I:
7371       if (imm_expr.X_op == O_constant
7372           && imm_expr.X_add_number >= -0x8000
7373           && imm_expr.X_add_number < 0x8000)
7374         {
7375           macro_build ((char *) NULL, &icnt, &imm_expr, "slti", "t,r,j",
7376                        dreg, sreg, (int) BFD_RELOC_LO16);
7377           return;
7378         }
7379       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7380       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "slt", "d,v,t",
7381                    dreg, sreg, AT);
7382       break;
7383
7384     case M_SLTU_I:
7385       if (imm_expr.X_op == O_constant
7386           && imm_expr.X_add_number >= -0x8000
7387           && imm_expr.X_add_number < 0x8000)
7388         {
7389           macro_build ((char *) NULL, &icnt, &imm_expr, "sltiu", "t,r,j",
7390                        dreg, sreg, (int) BFD_RELOC_LO16);
7391           return;
7392         }
7393       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7394       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7395                    "d,v,t", dreg, sreg, AT);
7396       break;
7397
7398     case M_SNE:
7399       if (sreg == 0)
7400         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7401                      "d,v,t", dreg, 0, treg);
7402       else if (treg == 0)
7403         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7404                      "d,v,t", dreg, 0, sreg);
7405       else
7406         {
7407           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7408                        "d,v,t", dreg, sreg, treg);
7409           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7410                        "d,v,t", dreg, 0, dreg);
7411         }
7412       return;
7413
7414     case M_SNE_I:
7415       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7416         {
7417           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7418                        "d,v,t", dreg, 0, sreg);
7419           return;
7420         }
7421       if (sreg == 0)
7422         {
7423           as_warn (_("Instruction %s: result is always true"),
7424                    ip->insn_mo->name);
7425           macro_build ((char *) NULL, &icnt, &expr1,
7426                        HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7427                        "t,r,j", dreg, 0, (int) BFD_RELOC_LO16);
7428           return;
7429         }
7430       if (imm_expr.X_op == O_constant
7431           && imm_expr.X_add_number >= 0
7432           && imm_expr.X_add_number < 0x10000)
7433         {
7434           macro_build ((char *) NULL, &icnt, &imm_expr, "xori", "t,r,i",
7435                        dreg, sreg, (int) BFD_RELOC_LO16);
7436           used_at = 0;
7437         }
7438       else if (imm_expr.X_op == O_constant
7439                && imm_expr.X_add_number > -0x8000
7440                && imm_expr.X_add_number < 0)
7441         {
7442           imm_expr.X_add_number = -imm_expr.X_add_number;
7443           macro_build ((char *) NULL, &icnt, &imm_expr,
7444                        HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7445                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7446           used_at = 0;
7447         }
7448       else
7449         {
7450           load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7451           macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "xor",
7452                        "d,v,t", dreg, sreg, AT);
7453           used_at = 1;
7454         }
7455       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sltu",
7456                    "d,v,t", dreg, 0, dreg);
7457       if (used_at)
7458         break;
7459       return;
7460
7461     case M_DSUB_I:
7462       dbl = 1;
7463     case M_SUB_I:
7464       if (imm_expr.X_op == O_constant
7465           && imm_expr.X_add_number > -0x8000
7466           && imm_expr.X_add_number <= 0x8000)
7467         {
7468           imm_expr.X_add_number = -imm_expr.X_add_number;
7469           macro_build ((char *) NULL, &icnt, &imm_expr,
7470                        dbl ? "daddi" : "addi",
7471                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7472           return;
7473         }
7474       load_register (&icnt, AT, &imm_expr, dbl);
7475       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7476                    dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7477       break;
7478
7479     case M_DSUBU_I:
7480       dbl = 1;
7481     case M_SUBU_I:
7482       if (imm_expr.X_op == O_constant
7483           && imm_expr.X_add_number > -0x8000
7484           && imm_expr.X_add_number <= 0x8000)
7485         {
7486           imm_expr.X_add_number = -imm_expr.X_add_number;
7487           macro_build ((char *) NULL, &icnt, &imm_expr,
7488                        dbl ? "daddiu" : "addiu",
7489                        "t,r,j", dreg, sreg, (int) BFD_RELOC_LO16);
7490           return;
7491         }
7492       load_register (&icnt, AT, &imm_expr, dbl);
7493       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7494                    dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7495       break;
7496
7497     case M_TEQ_I:
7498       s = "teq";
7499       goto trap;
7500     case M_TGE_I:
7501       s = "tge";
7502       goto trap;
7503     case M_TGEU_I:
7504       s = "tgeu";
7505       goto trap;
7506     case M_TLT_I:
7507       s = "tlt";
7508       goto trap;
7509     case M_TLTU_I:
7510       s = "tltu";
7511       goto trap;
7512     case M_TNE_I:
7513       s = "tne";
7514     trap:
7515       load_register (&icnt, AT, &imm_expr, HAVE_64BIT_GPRS);
7516       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "s,t", sreg,
7517                    AT);
7518       break;
7519
7520     case M_TRUNCWS:
7521     case M_TRUNCWD:
7522       assert (mips_opts.isa == ISA_MIPS1);
7523       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7524       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7525
7526       /*
7527        * Is the double cfc1 instruction a bug in the mips assembler;
7528        * or is there a reason for it?
7529        */
7530       mips_emit_delays (TRUE);
7531       ++mips_opts.noreorder;
7532       mips_any_noreorder = 1;
7533       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7534                    treg, RA);
7535       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "cfc1", "t,G",
7536                    treg, RA);
7537       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7538       expr1.X_add_number = 3;
7539       macro_build ((char *) NULL, &icnt, &expr1, "ori", "t,r,i", AT, treg,
7540                    (int) BFD_RELOC_LO16);
7541       expr1.X_add_number = 2;
7542       macro_build ((char *) NULL, &icnt, &expr1, "xori", "t,r,i", AT, AT,
7543                      (int) BFD_RELOC_LO16);
7544       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
7545                    AT, RA);
7546       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7547       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7548               mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S", dreg, sreg);
7549       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "ctc1", "t,G",
7550                    treg, RA);
7551       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7552       --mips_opts.noreorder;
7553       break;
7554
7555     case M_ULH:
7556       s = "lb";
7557       goto ulh;
7558     case M_ULHU:
7559       s = "lbu";
7560     ulh:
7561       if (offset_expr.X_add_number >= 0x7fff)
7562         as_bad (_("operand overflow"));
7563       if (! target_big_endian)
7564         ++offset_expr.X_add_number;
7565       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", AT,
7566                    (int) BFD_RELOC_LO16, breg);
7567       if (! target_big_endian)
7568         --offset_expr.X_add_number;
7569       else
7570         ++offset_expr.X_add_number;
7571       macro_build ((char *) NULL, &icnt, &offset_expr, "lbu", "t,o(b)", treg,
7572                    (int) BFD_RELOC_LO16, breg);
7573       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7574                    AT, AT, 8);
7575       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7576                    treg, treg, AT);
7577       break;
7578
7579     case M_ULD:
7580       s = "ldl";
7581       s2 = "ldr";
7582       off = 7;
7583       goto ulw;
7584     case M_ULW:
7585       s = "lwl";
7586       s2 = "lwr";
7587       off = 3;
7588     ulw:
7589       if (offset_expr.X_add_number >= 0x8000 - off)
7590         as_bad (_("operand overflow"));
7591       if (treg != breg)
7592         tempreg = treg;
7593       else
7594         tempreg = AT;
7595       if (! target_big_endian)
7596         offset_expr.X_add_number += off;
7597       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", tempreg,
7598                    (int) BFD_RELOC_LO16, breg);
7599       if (! target_big_endian)
7600         offset_expr.X_add_number -= off;
7601       else
7602         offset_expr.X_add_number += off;
7603       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", tempreg,
7604                    (int) BFD_RELOC_LO16, breg);
7605
7606       /* If necessary, move the result in tempreg the final destination.  */
7607       if (treg == tempreg)
7608         return;
7609       /* Protect second load's delay slot.  */
7610       if (!gpr_interlocks)
7611         macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "nop", "");
7612       move_register (&icnt, treg, tempreg);
7613       break;
7614
7615     case M_ULD_A:
7616       s = "ldl";
7617       s2 = "ldr";
7618       off = 7;
7619       goto ulwa;
7620     case M_ULW_A:
7621       s = "lwl";
7622       s2 = "lwr";
7623       off = 3;
7624     ulwa:
7625       used_at = 1;
7626       load_address (&icnt, AT, &offset_expr, &used_at);
7627       if (breg != 0)
7628         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7629                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7630                      "d,v,t", AT, AT, breg);
7631       if (! target_big_endian)
7632         expr1.X_add_number = off;
7633       else
7634         expr1.X_add_number = 0;
7635       macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
7636                    (int) BFD_RELOC_LO16, AT);
7637       if (! target_big_endian)
7638         expr1.X_add_number = 0;
7639       else
7640         expr1.X_add_number = off;
7641       macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
7642                    (int) BFD_RELOC_LO16, AT);
7643       break;
7644
7645     case M_ULH_A:
7646     case M_ULHU_A:
7647       used_at = 1;
7648       load_address (&icnt, AT, &offset_expr, &used_at);
7649       if (breg != 0)
7650         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7651                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7652                      "d,v,t", AT, AT, breg);
7653       if (target_big_endian)
7654         expr1.X_add_number = 0;
7655       macro_build ((char *) NULL, &icnt, &expr1,
7656                    mask == M_ULH_A ? "lb" : "lbu", "t,o(b)", treg,
7657                    (int) BFD_RELOC_LO16, AT);
7658       if (target_big_endian)
7659         expr1.X_add_number = 1;
7660       else
7661         expr1.X_add_number = 0;
7662       macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
7663                    (int) BFD_RELOC_LO16, AT);
7664       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7665                    treg, treg, 8);
7666       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7667                    treg, treg, AT);
7668       break;
7669
7670     case M_USH:
7671       if (offset_expr.X_add_number >= 0x7fff)
7672         as_bad (_("operand overflow"));
7673       if (target_big_endian)
7674         ++offset_expr.X_add_number;
7675       macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", treg,
7676                    (int) BFD_RELOC_LO16, breg);
7677       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
7678                    AT, treg, 8);
7679       if (target_big_endian)
7680         --offset_expr.X_add_number;
7681       else
7682         ++offset_expr.X_add_number;
7683       macro_build ((char *) NULL, &icnt, &offset_expr, "sb", "t,o(b)", AT,
7684                    (int) BFD_RELOC_LO16, breg);
7685       break;
7686
7687     case M_USD:
7688       s = "sdl";
7689       s2 = "sdr";
7690       off = 7;
7691       goto usw;
7692     case M_USW:
7693       s = "swl";
7694       s2 = "swr";
7695       off = 3;
7696     usw:
7697       if (offset_expr.X_add_number >= 0x8000 - off)
7698         as_bad (_("operand overflow"));
7699       if (! target_big_endian)
7700         offset_expr.X_add_number += off;
7701       macro_build ((char *) NULL, &icnt, &offset_expr, s, "t,o(b)", treg,
7702                    (int) BFD_RELOC_LO16, breg);
7703       if (! target_big_endian)
7704         offset_expr.X_add_number -= off;
7705       else
7706         offset_expr.X_add_number += off;
7707       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "t,o(b)", treg,
7708                    (int) BFD_RELOC_LO16, breg);
7709       return;
7710
7711     case M_USD_A:
7712       s = "sdl";
7713       s2 = "sdr";
7714       off = 7;
7715       goto uswa;
7716     case M_USW_A:
7717       s = "swl";
7718       s2 = "swr";
7719       off = 3;
7720     uswa:
7721       used_at = 1;
7722       load_address (&icnt, AT, &offset_expr, &used_at);
7723       if (breg != 0)
7724         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7725                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7726                      "d,v,t", AT, AT, breg);
7727       if (! target_big_endian)
7728         expr1.X_add_number = off;
7729       else
7730         expr1.X_add_number = 0;
7731       macro_build ((char *) NULL, &icnt, &expr1, s, "t,o(b)", treg,
7732                    (int) BFD_RELOC_LO16, AT);
7733       if (! target_big_endian)
7734         expr1.X_add_number = 0;
7735       else
7736         expr1.X_add_number = off;
7737       macro_build ((char *) NULL, &icnt, &expr1, s2, "t,o(b)", treg,
7738                    (int) BFD_RELOC_LO16, AT);
7739       break;
7740
7741     case M_USH_A:
7742       used_at = 1;
7743       load_address (&icnt, AT, &offset_expr, &used_at);
7744       if (breg != 0)
7745         macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7746                      HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
7747                      "d,v,t", AT, AT, breg);
7748       if (! target_big_endian)
7749         expr1.X_add_number = 0;
7750       macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
7751                    (int) BFD_RELOC_LO16, AT);
7752       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "srl", "d,w,<",
7753                    treg, treg, 8);
7754       if (! target_big_endian)
7755         expr1.X_add_number = 1;
7756       else
7757         expr1.X_add_number = 0;
7758       macro_build ((char *) NULL, &icnt, &expr1, "sb", "t,o(b)", treg,
7759                    (int) BFD_RELOC_LO16, AT);
7760       if (! target_big_endian)
7761         expr1.X_add_number = 0;
7762       else
7763         expr1.X_add_number = 1;
7764       macro_build ((char *) NULL, &icnt, &expr1, "lbu", "t,o(b)", AT,
7765                    (int) BFD_RELOC_LO16, AT);
7766       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "sll", "d,w,<",
7767                    treg, treg, 8);
7768       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "or", "d,v,t",
7769                    treg, treg, AT);
7770       break;
7771
7772     default:
7773       /* FIXME: Check if this is one of the itbl macros, since they
7774          are added dynamically.  */
7775       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7776       break;
7777     }
7778   if (mips_opts.noat)
7779     as_warn (_("Macro used $at after \".set noat\""));
7780 }
7781
7782 /* Implement macros in mips16 mode.  */
7783
7784 static void
7785 mips16_macro (ip)
7786      struct mips_cl_insn *ip;
7787 {
7788   int mask;
7789   int xreg, yreg, zreg, tmp;
7790   int icnt;
7791   expressionS expr1;
7792   int dbl;
7793   const char *s, *s2, *s3;
7794
7795   mask = ip->insn_mo->mask;
7796
7797   xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
7798   yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
7799   zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
7800
7801   icnt = 0;
7802
7803   expr1.X_op = O_constant;
7804   expr1.X_op_symbol = NULL;
7805   expr1.X_add_symbol = NULL;
7806   expr1.X_add_number = 1;
7807
7808   dbl = 0;
7809
7810   switch (mask)
7811     {
7812     default:
7813       internalError ();
7814
7815     case M_DDIV_3:
7816       dbl = 1;
7817     case M_DIV_3:
7818       s = "mflo";
7819       goto do_div3;
7820     case M_DREM_3:
7821       dbl = 1;
7822     case M_REM_3:
7823       s = "mfhi";
7824     do_div3:
7825       mips_emit_delays (TRUE);
7826       ++mips_opts.noreorder;
7827       mips_any_noreorder = 1;
7828       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7829                    dbl ? "ddiv" : "div",
7830                    "0,x,y", xreg, yreg);
7831       expr1.X_add_number = 2;
7832       macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
7833       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break", "6",
7834                    7);
7835
7836       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7837          since that causes an overflow.  We should do that as well,
7838          but I don't see how to do the comparisons without a temporary
7839          register.  */
7840       --mips_opts.noreorder;
7841       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x", zreg);
7842       break;
7843
7844     case M_DIVU_3:
7845       s = "divu";
7846       s2 = "mflo";
7847       goto do_divu3;
7848     case M_REMU_3:
7849       s = "divu";
7850       s2 = "mfhi";
7851       goto do_divu3;
7852     case M_DDIVU_3:
7853       s = "ddivu";
7854       s2 = "mflo";
7855       goto do_divu3;
7856     case M_DREMU_3:
7857       s = "ddivu";
7858       s2 = "mfhi";
7859     do_divu3:
7860       mips_emit_delays (TRUE);
7861       ++mips_opts.noreorder;
7862       mips_any_noreorder = 1;
7863       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "0,x,y",
7864                    xreg, yreg);
7865       expr1.X_add_number = 2;
7866       macro_build ((char *) NULL, &icnt, &expr1, "bnez", "x,p", yreg);
7867       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "break",
7868                    "6", 7);
7869       --mips_opts.noreorder;
7870       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s2, "x", zreg);
7871       break;
7872
7873     case M_DMUL:
7874       dbl = 1;
7875     case M_MUL:
7876       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
7877                    dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7878       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "mflo", "x",
7879                    zreg);
7880       return;
7881
7882     case M_DSUBU_I:
7883       dbl = 1;
7884       goto do_subu;
7885     case M_SUBU_I:
7886     do_subu:
7887       if (imm_expr.X_op != O_constant)
7888         as_bad (_("Unsupported large constant"));
7889       imm_expr.X_add_number = -imm_expr.X_add_number;
7890       macro_build ((char *) NULL, &icnt, &imm_expr,
7891                    dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7892       break;
7893
7894     case M_SUBU_I_2:
7895       if (imm_expr.X_op != O_constant)
7896         as_bad (_("Unsupported large constant"));
7897       imm_expr.X_add_number = -imm_expr.X_add_number;
7898       macro_build ((char *) NULL, &icnt, &imm_expr, "addiu",
7899                    "x,k", xreg);
7900       break;
7901
7902     case M_DSUBU_I_2:
7903       if (imm_expr.X_op != O_constant)
7904         as_bad (_("Unsupported large constant"));
7905       imm_expr.X_add_number = -imm_expr.X_add_number;
7906       macro_build ((char *) NULL, &icnt, &imm_expr, "daddiu",
7907                    "y,j", yreg);
7908       break;
7909
7910     case M_BEQ:
7911       s = "cmp";
7912       s2 = "bteqz";
7913       goto do_branch;
7914     case M_BNE:
7915       s = "cmp";
7916       s2 = "btnez";
7917       goto do_branch;
7918     case M_BLT:
7919       s = "slt";
7920       s2 = "btnez";
7921       goto do_branch;
7922     case M_BLTU:
7923       s = "sltu";
7924       s2 = "btnez";
7925       goto do_branch;
7926     case M_BLE:
7927       s = "slt";
7928       s2 = "bteqz";
7929       goto do_reverse_branch;
7930     case M_BLEU:
7931       s = "sltu";
7932       s2 = "bteqz";
7933       goto do_reverse_branch;
7934     case M_BGE:
7935       s = "slt";
7936       s2 = "bteqz";
7937       goto do_branch;
7938     case M_BGEU:
7939       s = "sltu";
7940       s2 = "bteqz";
7941       goto do_branch;
7942     case M_BGT:
7943       s = "slt";
7944       s2 = "btnez";
7945       goto do_reverse_branch;
7946     case M_BGTU:
7947       s = "sltu";
7948       s2 = "btnez";
7949
7950     do_reverse_branch:
7951       tmp = xreg;
7952       xreg = yreg;
7953       yreg = tmp;
7954
7955     do_branch:
7956       macro_build ((char *) NULL, &icnt, (expressionS *) NULL, s, "x,y",
7957                    xreg, yreg);
7958       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
7959       break;
7960
7961     case M_BEQ_I:
7962       s = "cmpi";
7963       s2 = "bteqz";
7964       s3 = "x,U";
7965       goto do_branch_i;
7966     case M_BNE_I:
7967       s = "cmpi";
7968       s2 = "btnez";
7969       s3 = "x,U";
7970       goto do_branch_i;
7971     case M_BLT_I:
7972       s = "slti";
7973       s2 = "btnez";
7974       s3 = "x,8";
7975       goto do_branch_i;
7976     case M_BLTU_I:
7977       s = "sltiu";
7978       s2 = "btnez";
7979       s3 = "x,8";
7980       goto do_branch_i;
7981     case M_BLE_I:
7982       s = "slti";
7983       s2 = "btnez";
7984       s3 = "x,8";
7985       goto do_addone_branch_i;
7986     case M_BLEU_I:
7987       s = "sltiu";
7988       s2 = "btnez";
7989       s3 = "x,8";
7990       goto do_addone_branch_i;
7991     case M_BGE_I:
7992       s = "slti";
7993       s2 = "bteqz";
7994       s3 = "x,8";
7995       goto do_branch_i;
7996     case M_BGEU_I:
7997       s = "sltiu";
7998       s2 = "bteqz";
7999       s3 = "x,8";
8000       goto do_branch_i;
8001     case M_BGT_I:
8002       s = "slti";
8003       s2 = "bteqz";
8004       s3 = "x,8";
8005       goto do_addone_branch_i;
8006     case M_BGTU_I:
8007       s = "sltiu";
8008       s2 = "bteqz";
8009       s3 = "x,8";
8010
8011     do_addone_branch_i:
8012       if (imm_expr.X_op != O_constant)
8013         as_bad (_("Unsupported large constant"));
8014       ++imm_expr.X_add_number;
8015
8016     do_branch_i:
8017       macro_build ((char *) NULL, &icnt, &imm_expr, s, s3, xreg);
8018       macro_build ((char *) NULL, &icnt, &offset_expr, s2, "p");
8019       break;
8020
8021     case M_ABS:
8022       expr1.X_add_number = 0;
8023       macro_build ((char *) NULL, &icnt, &expr1, "slti", "x,8", yreg);
8024       if (xreg != yreg)
8025         move_register (&icnt, xreg, yreg);
8026       expr1.X_add_number = 2;
8027       macro_build ((char *) NULL, &icnt, &expr1, "bteqz", "p");
8028       macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
8029                    "neg", "x,w", xreg, xreg);
8030     }
8031 }
8032
8033 /* For consistency checking, verify that all bits are specified either
8034    by the match/mask part of the instruction definition, or by the
8035    operand list.  */
8036 static int
8037 validate_mips_insn (opc)
8038      const struct mips_opcode *opc;
8039 {
8040   const char *p = opc->args;
8041   char c;
8042   unsigned long used_bits = opc->mask;
8043
8044   if ((used_bits & opc->match) != opc->match)
8045     {
8046       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8047               opc->name, opc->args);
8048       return 0;
8049     }
8050 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8051   while (*p)
8052     switch (c = *p++)
8053       {
8054       case ',': break;
8055       case '(': break;
8056       case ')': break;
8057       case '+':
8058         switch (c = *p++)
8059           {
8060           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8061           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8062           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8063           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8064                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8065           default:
8066             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8067                     c, opc->name, opc->args);
8068             return 0;
8069           }
8070         break;
8071       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8072       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8073       case 'A': break;
8074       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8075       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8076       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8077       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8078       case 'F': break;
8079       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8080       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8081       case 'I': break;
8082       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8083       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8084       case 'L': break;
8085       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8086       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8087       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8088       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8089                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8090       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8091       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8092       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8093       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8094       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8095       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8096       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8097       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8098       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8099       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8100       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8101       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8102       case 'f': break;
8103       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8104       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8105       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8106       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8107       case 'l': break;
8108       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8109       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8110       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8111       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8112       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8113       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8114       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8115       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8116       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8117       case 'x': break;
8118       case 'z': break;
8119       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8120       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8121                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8122       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8123       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8124       case '[': break;
8125       case ']': break;
8126       default:
8127         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8128                 c, opc->name, opc->args);
8129         return 0;
8130       }
8131 #undef USE_BITS
8132   if (used_bits != 0xffffffff)
8133     {
8134       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8135               ~used_bits & 0xffffffff, opc->name, opc->args);
8136       return 0;
8137     }
8138   return 1;
8139 }
8140
8141 /* This routine assembles an instruction into its binary format.  As a
8142    side effect, it sets one of the global variables imm_reloc or
8143    offset_reloc to the type of relocation to do if one of the operands
8144    is an address expression.  */
8145
8146 static void
8147 mips_ip (str, ip)
8148      char *str;
8149      struct mips_cl_insn *ip;
8150 {
8151   char *s;
8152   const char *args;
8153   char c = 0;
8154   struct mips_opcode *insn;
8155   char *argsStart;
8156   unsigned int regno;
8157   unsigned int lastregno = 0;
8158   unsigned int lastpos = 0;
8159   unsigned int limlo, limhi;
8160   char *s_reset;
8161   char save_c = 0;
8162
8163   insn_error = NULL;
8164
8165   /* If the instruction contains a '.', we first try to match an instruction
8166      including the '.'.  Then we try again without the '.'.  */
8167   insn = NULL;
8168   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8169     continue;
8170
8171   /* If we stopped on whitespace, then replace the whitespace with null for
8172      the call to hash_find.  Save the character we replaced just in case we
8173      have to re-parse the instruction.  */
8174   if (ISSPACE (*s))
8175     {
8176       save_c = *s;
8177       *s++ = '\0';
8178     }
8179
8180   insn = (struct mips_opcode *) hash_find (op_hash, str);
8181
8182   /* If we didn't find the instruction in the opcode table, try again, but
8183      this time with just the instruction up to, but not including the
8184      first '.'.  */
8185   if (insn == NULL)
8186     {
8187       /* Restore the character we overwrite above (if any).  */
8188       if (save_c)
8189         *(--s) = save_c;
8190
8191       /* Scan up to the first '.' or whitespace.  */
8192       for (s = str;
8193            *s != '\0' && *s != '.' && !ISSPACE (*s);
8194            ++s)
8195         continue;
8196
8197       /* If we did not find a '.', then we can quit now.  */
8198       if (*s != '.')
8199         {
8200           insn_error = "unrecognized opcode";
8201           return;
8202         }
8203
8204       /* Lookup the instruction in the hash table.  */
8205       *s++ = '\0';
8206       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8207         {
8208           insn_error = "unrecognized opcode";
8209           return;
8210         }
8211     }
8212
8213   argsStart = s;
8214   for (;;)
8215     {
8216       bfd_boolean ok;
8217
8218       assert (strcmp (insn->name, str) == 0);
8219
8220       if (OPCODE_IS_MEMBER (insn,
8221                             (mips_opts.isa
8222                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8223                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8224                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
8225                             mips_arch))
8226         ok = TRUE;
8227       else
8228         ok = FALSE;
8229
8230       if (insn->pinfo != INSN_MACRO)
8231         {
8232           if (mips_arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8233             ok = FALSE;
8234         }
8235
8236       if (! ok)
8237         {
8238           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8239               && strcmp (insn->name, insn[1].name) == 0)
8240             {
8241               ++insn;
8242               continue;
8243             }
8244           else
8245             {
8246               if (!insn_error)
8247                 {
8248                   static char buf[100];
8249                   if (mips_arch_info->is_isa)
8250                     sprintf (buf,
8251                              _("opcode not supported at this ISA level (%s)"),
8252                              mips_cpu_info_from_isa (mips_opts.isa)->name);
8253                   else
8254                     sprintf (buf,
8255                              _("opcode not supported on this processor: %s (%s)"),
8256                              mips_arch_info->name,
8257                              mips_cpu_info_from_isa (mips_opts.isa)->name);
8258                   insn_error = buf;
8259                 }
8260               if (save_c)
8261                 *(--s) = save_c;
8262               return;
8263             }
8264         }
8265
8266       ip->insn_mo = insn;
8267       ip->insn_opcode = insn->match;
8268       insn_error = NULL;
8269       for (args = insn->args;; ++args)
8270         {
8271           int is_mdmx;
8272
8273           s += strspn (s, " \t");
8274           is_mdmx = 0;
8275           switch (*args)
8276             {
8277             case '\0':          /* end of args */
8278               if (*s == '\0')
8279                 return;
8280               break;
8281
8282             case ',':
8283               if (*s++ == *args)
8284                 continue;
8285               s--;
8286               switch (*++args)
8287                 {
8288                 case 'r':
8289                 case 'v':
8290                   ip->insn_opcode |= lastregno << OP_SH_RS;
8291                   continue;
8292
8293                 case 'w':
8294                   ip->insn_opcode |= lastregno << OP_SH_RT;
8295                   continue;
8296
8297                 case 'W':
8298                   ip->insn_opcode |= lastregno << OP_SH_FT;
8299                   continue;
8300
8301                 case 'V':
8302                   ip->insn_opcode |= lastregno << OP_SH_FS;
8303                   continue;
8304                 }
8305               break;
8306
8307             case '(':
8308               /* Handle optional base register.
8309                  Either the base register is omitted or
8310                  we must have a left paren.  */
8311               /* This is dependent on the next operand specifier
8312                  is a base register specification.  */
8313               assert (args[1] == 'b' || args[1] == '5'
8314                       || args[1] == '-' || args[1] == '4');
8315               if (*s == '\0')
8316                 return;
8317
8318             case ')':           /* these must match exactly */
8319             case '[':
8320             case ']':
8321               if (*s++ == *args)
8322                 continue;
8323               break;
8324
8325             case '+':           /* Opcode extension character.  */
8326               switch (*++args)
8327                 {
8328                 case 'A':               /* ins/ext position, becomes LSB.  */
8329                   limlo = 0;
8330                   limhi = 31;
8331                   my_getExpression (&imm_expr, s);
8332                   check_absolute_expr (ip, &imm_expr);
8333                   if ((unsigned long) imm_expr.X_add_number < limlo
8334                       || (unsigned long) imm_expr.X_add_number > limhi)
8335                     {
8336                       as_bad (_("Improper position (%lu)"),
8337                               (unsigned long) imm_expr.X_add_number);
8338                       imm_expr.X_add_number = limlo;
8339                     }
8340                   lastpos = imm_expr.X_add_number;
8341                   ip->insn_opcode |= (imm_expr.X_add_number
8342                                       & OP_MASK_SHAMT) << OP_SH_SHAMT;
8343                   imm_expr.X_op = O_absent;
8344                   s = expr_end;
8345                   continue;
8346
8347                 case 'B':               /* ins size, becomes MSB.  */
8348                   limlo = 1;
8349                   limhi = 32;
8350                   my_getExpression (&imm_expr, s);
8351                   check_absolute_expr (ip, &imm_expr);
8352                   /* Check for negative input so that small negative numbers
8353                      will not succeed incorrectly.  The checks against
8354                      (pos+size) transitively check "size" itself,
8355                      assuming that "pos" is reasonable.  */
8356                   if ((long) imm_expr.X_add_number < 0
8357                       || ((unsigned long) imm_expr.X_add_number
8358                           + lastpos) < limlo
8359                       || ((unsigned long) imm_expr.X_add_number
8360                           + lastpos) > limhi)
8361                     {
8362                       as_bad (_("Improper insert size (%lu, position %lu)"),
8363                               (unsigned long) imm_expr.X_add_number,
8364                               (unsigned long) lastpos);
8365                       imm_expr.X_add_number = limlo - lastpos;
8366                     }
8367                   ip->insn_opcode |= ((lastpos + imm_expr.X_add_number - 1)
8368                                       & OP_MASK_INSMSB) << OP_SH_INSMSB;
8369                   imm_expr.X_op = O_absent;
8370                   s = expr_end;
8371                   continue;
8372
8373                 case 'C':               /* ext size, becomes MSBD.  */
8374                   limlo = 1;
8375                   limhi = 32;
8376                   my_getExpression (&imm_expr, s);
8377                   check_absolute_expr (ip, &imm_expr);
8378                   /* Check for negative input so that small negative numbers
8379                      will not succeed incorrectly.  The checks against
8380                      (pos+size) transitively check "size" itself,
8381                      assuming that "pos" is reasonable.  */
8382                   if ((long) imm_expr.X_add_number < 0
8383                       || ((unsigned long) imm_expr.X_add_number
8384                           + lastpos) < limlo
8385                       || ((unsigned long) imm_expr.X_add_number
8386                           + lastpos) > limhi)
8387                     {
8388                       as_bad (_("Improper extract size (%lu, position %lu)"),
8389                               (unsigned long) imm_expr.X_add_number,
8390                               (unsigned long) lastpos);
8391                       imm_expr.X_add_number = limlo - lastpos;
8392                     }
8393                   ip->insn_opcode |= ((imm_expr.X_add_number - 1)
8394                                       & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
8395                   imm_expr.X_op = O_absent;
8396                   s = expr_end;
8397                   continue;
8398
8399                 case 'D':
8400                   /* +D is for disassembly only; never match.  */
8401                   break;
8402
8403                 default:
8404                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8405                     *args, insn->name, insn->args);
8406                   /* Further processing is fruitless.  */
8407                   return;
8408                 }
8409               break;
8410
8411             case '<':           /* must be at least one digit */
8412               /*
8413                * According to the manual, if the shift amount is greater
8414                * than 31 or less than 0, then the shift amount should be
8415                * mod 32.  In reality the mips assembler issues an error.
8416                * We issue a warning and mask out all but the low 5 bits.
8417                */
8418               my_getExpression (&imm_expr, s);
8419               check_absolute_expr (ip, &imm_expr);
8420               if ((unsigned long) imm_expr.X_add_number > 31)
8421                 {
8422                   as_warn (_("Improper shift amount (%lu)"),
8423                            (unsigned long) imm_expr.X_add_number);
8424                   imm_expr.X_add_number &= OP_MASK_SHAMT;
8425                 }
8426               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
8427               imm_expr.X_op = O_absent;
8428               s = expr_end;
8429               continue;
8430
8431             case '>':           /* shift amount minus 32 */
8432               my_getExpression (&imm_expr, s);
8433               check_absolute_expr (ip, &imm_expr);
8434               if ((unsigned long) imm_expr.X_add_number < 32
8435                   || (unsigned long) imm_expr.X_add_number > 63)
8436                 break;
8437               ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
8438               imm_expr.X_op = O_absent;
8439               s = expr_end;
8440               continue;
8441
8442             case 'k':           /* cache code */
8443             case 'h':           /* prefx code */
8444               my_getExpression (&imm_expr, s);
8445               check_absolute_expr (ip, &imm_expr);
8446               if ((unsigned long) imm_expr.X_add_number > 31)
8447                 {
8448                   as_warn (_("Invalid value for `%s' (%lu)"),
8449                            ip->insn_mo->name,
8450                            (unsigned long) imm_expr.X_add_number);
8451                   imm_expr.X_add_number &= 0x1f;
8452                 }
8453               if (*args == 'k')
8454                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
8455               else
8456                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
8457               imm_expr.X_op = O_absent;
8458               s = expr_end;
8459               continue;
8460
8461             case 'c':           /* break code */
8462               my_getExpression (&imm_expr, s);
8463               check_absolute_expr (ip, &imm_expr);
8464               if ((unsigned long) imm_expr.X_add_number > 1023)
8465                 {
8466                   as_warn (_("Illegal break code (%lu)"),
8467                            (unsigned long) imm_expr.X_add_number);
8468                   imm_expr.X_add_number &= OP_MASK_CODE;
8469                 }
8470               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
8471               imm_expr.X_op = O_absent;
8472               s = expr_end;
8473               continue;
8474
8475             case 'q':           /* lower break code */
8476               my_getExpression (&imm_expr, s);
8477               check_absolute_expr (ip, &imm_expr);
8478               if ((unsigned long) imm_expr.X_add_number > 1023)
8479                 {
8480                   as_warn (_("Illegal lower break code (%lu)"),
8481                            (unsigned long) imm_expr.X_add_number);
8482                   imm_expr.X_add_number &= OP_MASK_CODE2;
8483                 }
8484               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
8485               imm_expr.X_op = O_absent;
8486               s = expr_end;
8487               continue;
8488
8489             case 'B':           /* 20-bit syscall/break code.  */
8490               my_getExpression (&imm_expr, s);
8491               check_absolute_expr (ip, &imm_expr);
8492               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8493                 as_warn (_("Illegal 20-bit code (%lu)"),
8494                          (unsigned long) imm_expr.X_add_number);
8495               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
8496               imm_expr.X_op = O_absent;
8497               s = expr_end;
8498               continue;
8499
8500             case 'C':           /* Coprocessor code */
8501               my_getExpression (&imm_expr, s);
8502               check_absolute_expr (ip, &imm_expr);
8503               if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8504                 {
8505                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
8506                            (unsigned long) imm_expr.X_add_number);
8507                   imm_expr.X_add_number &= ((1 << 25) - 1);
8508                 }
8509               ip->insn_opcode |= imm_expr.X_add_number;
8510               imm_expr.X_op = O_absent;
8511               s = expr_end;
8512               continue;
8513
8514             case 'J':           /* 19-bit wait code.  */
8515               my_getExpression (&imm_expr, s);
8516               check_absolute_expr (ip, &imm_expr);
8517               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8518                 as_warn (_("Illegal 19-bit code (%lu)"),
8519                          (unsigned long) imm_expr.X_add_number);
8520               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
8521               imm_expr.X_op = O_absent;
8522               s = expr_end;
8523               continue;
8524
8525             case 'P':           /* Performance register */
8526               my_getExpression (&imm_expr, s);
8527               check_absolute_expr (ip, &imm_expr);
8528               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8529                 {
8530                   as_warn (_("Invalid performance register (%lu)"),
8531                            (unsigned long) imm_expr.X_add_number);
8532                   imm_expr.X_add_number &= OP_MASK_PERFREG;
8533                 }
8534               ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
8535               imm_expr.X_op = O_absent;
8536               s = expr_end;
8537               continue;
8538
8539             case 'b':           /* base register */
8540             case 'd':           /* destination register */
8541             case 's':           /* source register */
8542             case 't':           /* target register */
8543             case 'r':           /* both target and source */
8544             case 'v':           /* both dest and source */
8545             case 'w':           /* both dest and target */
8546             case 'E':           /* coprocessor target register */
8547             case 'G':           /* coprocessor destination register */
8548             case 'K':           /* 'rdhwr' destination register */
8549             case 'x':           /* ignore register name */
8550             case 'z':           /* must be zero register */
8551             case 'U':           /* destination register (clo/clz).  */
8552               s_reset = s;
8553               if (s[0] == '$')
8554                 {
8555
8556                   if (ISDIGIT (s[1]))
8557                     {
8558                       ++s;
8559                       regno = 0;
8560                       do
8561                         {
8562                           regno *= 10;
8563                           regno += *s - '0';
8564                           ++s;
8565                         }
8566                       while (ISDIGIT (*s));
8567                       if (regno > 31)
8568                         as_bad (_("Invalid register number (%d)"), regno);
8569                     }
8570                   else if (*args == 'E' || *args == 'G' || *args == 'K')
8571                     goto notreg;
8572                   else
8573                     {
8574                       if (s[1] == 'r' && s[2] == 'a')
8575                         {
8576                           s += 3;
8577                           regno = RA;
8578                         }
8579                       else if (s[1] == 'f' && s[2] == 'p')
8580                         {
8581                           s += 3;
8582                           regno = FP;
8583                         }
8584                       else if (s[1] == 's' && s[2] == 'p')
8585                         {
8586                           s += 3;
8587                           regno = SP;
8588                         }
8589                       else if (s[1] == 'g' && s[2] == 'p')
8590                         {
8591                           s += 3;
8592                           regno = GP;
8593                         }
8594                       else if (s[1] == 'a' && s[2] == 't')
8595                         {
8596                           s += 3;
8597                           regno = AT;
8598                         }
8599                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8600                         {
8601                           s += 4;
8602                           regno = KT0;
8603                         }
8604                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8605                         {
8606                           s += 4;
8607                           regno = KT1;
8608                         }
8609                       else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
8610                         {
8611                           s += 5;
8612                           regno = ZERO;
8613                         }
8614                       else if (itbl_have_entries)
8615                         {
8616                           char *p, *n;
8617                           unsigned long r;
8618
8619                           p = s + 1;    /* advance past '$' */
8620                           n = itbl_get_field (&p);  /* n is name */
8621
8622                           /* See if this is a register defined in an
8623                              itbl entry.  */
8624                           if (itbl_get_reg_val (n, &r))
8625                             {
8626                               /* Get_field advances to the start of
8627                                  the next field, so we need to back
8628                                  rack to the end of the last field.  */
8629                               if (p)
8630                                 s = p - 1;
8631                               else
8632                                 s = strchr (s, '\0');
8633                               regno = r;
8634                             }
8635                           else
8636                             goto notreg;
8637                         }
8638                       else
8639                         goto notreg;
8640                     }
8641                   if (regno == AT
8642                       && ! mips_opts.noat
8643                       && *args != 'E'
8644                       && *args != 'G'
8645                       && *args != 'K')
8646                     as_warn (_("Used $at without \".set noat\""));
8647                   c = *args;
8648                   if (*s == ' ')
8649                     ++s;
8650                   if (args[1] != *s)
8651                     {
8652                       if (c == 'r' || c == 'v' || c == 'w')
8653                         {
8654                           regno = lastregno;
8655                           s = s_reset;
8656                           ++args;
8657                         }
8658                     }
8659                   /* 'z' only matches $0.  */
8660                   if (c == 'z' && regno != 0)
8661                     break;
8662
8663         /* Now that we have assembled one operand, we use the args string
8664          * to figure out where it goes in the instruction.  */
8665                   switch (c)
8666                     {
8667                     case 'r':
8668                     case 's':
8669                     case 'v':
8670                     case 'b':
8671                       ip->insn_opcode |= regno << OP_SH_RS;
8672                       break;
8673                     case 'd':
8674                     case 'G':
8675                     case 'K':
8676                       ip->insn_opcode |= regno << OP_SH_RD;
8677                       break;
8678                     case 'U':
8679                       ip->insn_opcode |= regno << OP_SH_RD;
8680                       ip->insn_opcode |= regno << OP_SH_RT;
8681                       break;
8682                     case 'w':
8683                     case 't':
8684                     case 'E':
8685                       ip->insn_opcode |= regno << OP_SH_RT;
8686                       break;
8687                     case 'x':
8688                       /* This case exists because on the r3000 trunc
8689                          expands into a macro which requires a gp
8690                          register.  On the r6000 or r4000 it is
8691                          assembled into a single instruction which
8692                          ignores the register.  Thus the insn version
8693                          is MIPS_ISA2 and uses 'x', and the macro
8694                          version is MIPS_ISA1 and uses 't'.  */
8695                       break;
8696                     case 'z':
8697                       /* This case is for the div instruction, which
8698                          acts differently if the destination argument
8699                          is $0.  This only matches $0, and is checked
8700                          outside the switch.  */
8701                       break;
8702                     case 'D':
8703                       /* Itbl operand; not yet implemented. FIXME ?? */
8704                       break;
8705                       /* What about all other operands like 'i', which
8706                          can be specified in the opcode table? */
8707                     }
8708                   lastregno = regno;
8709                   continue;
8710                 }
8711             notreg:
8712               switch (*args++)
8713                 {
8714                 case 'r':
8715                 case 'v':
8716                   ip->insn_opcode |= lastregno << OP_SH_RS;
8717                   continue;
8718                 case 'w':
8719                   ip->insn_opcode |= lastregno << OP_SH_RT;
8720                   continue;
8721                 }
8722               break;
8723
8724             case 'O':           /* MDMX alignment immediate constant.  */
8725               my_getExpression (&imm_expr, s);
8726               check_absolute_expr (ip, &imm_expr);
8727               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
8728                 {
8729                   as_warn ("Improper align amount (%ld), using low bits",
8730                            (long) imm_expr.X_add_number);
8731                   imm_expr.X_add_number &= OP_MASK_ALN;
8732                 }
8733               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
8734               imm_expr.X_op = O_absent;
8735               s = expr_end;
8736               continue;
8737
8738             case 'Q':           /* MDMX vector, element sel, or const.  */
8739               if (s[0] != '$')
8740                 {
8741                   /* MDMX Immediate.  */
8742                   my_getExpression (&imm_expr, s);
8743                   check_absolute_expr (ip, &imm_expr);
8744                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
8745                     {
8746                       as_warn (_("Invalid MDMX Immediate (%ld)"),
8747                                (long) imm_expr.X_add_number);
8748                       imm_expr.X_add_number &= OP_MASK_FT;
8749                     }
8750                   imm_expr.X_add_number &= OP_MASK_FT;
8751                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8752                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
8753                   else
8754                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
8755                   ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
8756                   imm_expr.X_op = O_absent;
8757                   s = expr_end;
8758                   continue;
8759                 }
8760               /* Not MDMX Immediate.  Fall through.  */
8761             case 'X':           /* MDMX destination register.  */
8762             case 'Y':           /* MDMX source register.  */
8763             case 'Z':           /* MDMX target register.  */
8764               is_mdmx = 1;
8765             case 'D':           /* floating point destination register */
8766             case 'S':           /* floating point source register */
8767             case 'T':           /* floating point target register */
8768             case 'R':           /* floating point source register */
8769             case 'V':
8770             case 'W':
8771               s_reset = s;
8772               /* Accept $fN for FP and MDMX register numbers, and in
8773                  addition accept $vN for MDMX register numbers.  */
8774               if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
8775                   || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
8776                       && ISDIGIT (s[2])))
8777                 {
8778                   s += 2;
8779                   regno = 0;
8780                   do
8781                     {
8782                       regno *= 10;
8783                       regno += *s - '0';
8784                       ++s;
8785                     }
8786                   while (ISDIGIT (*s));
8787
8788                   if (regno > 31)
8789                     as_bad (_("Invalid float register number (%d)"), regno);
8790
8791                   if ((regno & 1) != 0
8792                       && HAVE_32BIT_FPRS
8793                       && ! (strcmp (str, "mtc1") == 0
8794                             || strcmp (str, "mfc1") == 0
8795                             || strcmp (str, "lwc1") == 0
8796                             || strcmp (str, "swc1") == 0
8797                             || strcmp (str, "l.s") == 0
8798                             || strcmp (str, "s.s") == 0))
8799                     as_warn (_("Float register should be even, was %d"),
8800                              regno);
8801
8802                   c = *args;
8803                   if (*s == ' ')
8804                     ++s;
8805                   if (args[1] != *s)
8806                     {
8807                       if (c == 'V' || c == 'W')
8808                         {
8809                           regno = lastregno;
8810                           s = s_reset;
8811                           ++args;
8812                         }
8813                     }
8814                   switch (c)
8815                     {
8816                     case 'D':
8817                     case 'X':
8818                       ip->insn_opcode |= regno << OP_SH_FD;
8819                       break;
8820                     case 'V':
8821                     case 'S':
8822                     case 'Y':
8823                       ip->insn_opcode |= regno << OP_SH_FS;
8824                       break;
8825                     case 'Q':
8826                       /* This is like 'Z', but also needs to fix the MDMX
8827                          vector/scalar select bits.  Note that the
8828                          scalar immediate case is handled above.  */
8829                       if (*s == '[')
8830                         {
8831                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
8832                           int max_el = (is_qh ? 3 : 7);
8833                           s++;
8834                           my_getExpression(&imm_expr, s);
8835                           check_absolute_expr (ip, &imm_expr);
8836                           s = expr_end;
8837                           if (imm_expr.X_add_number > max_el)
8838                             as_bad(_("Bad element selector %ld"),
8839                                    (long) imm_expr.X_add_number);
8840                           imm_expr.X_add_number &= max_el;
8841                           ip->insn_opcode |= (imm_expr.X_add_number
8842                                               << (OP_SH_VSEL +
8843                                                   (is_qh ? 2 : 1)));
8844                           if (*s != ']')
8845                             as_warn(_("Expecting ']' found '%s'"), s);
8846                           else
8847                             s++;
8848                         }
8849                       else
8850                         {
8851                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8852                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
8853                                                 << OP_SH_VSEL);
8854                           else
8855                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
8856                                                 OP_SH_VSEL);
8857                         }
8858                       /* Fall through */
8859                     case 'W':
8860                     case 'T':
8861                     case 'Z':
8862                       ip->insn_opcode |= regno << OP_SH_FT;
8863                       break;
8864                     case 'R':
8865                       ip->insn_opcode |= regno << OP_SH_FR;
8866                       break;
8867                     }
8868                   lastregno = regno;
8869                   continue;
8870                 }
8871
8872               switch (*args++)
8873                 {
8874                 case 'V':
8875                   ip->insn_opcode |= lastregno << OP_SH_FS;
8876                   continue;
8877                 case 'W':
8878                   ip->insn_opcode |= lastregno << OP_SH_FT;
8879                   continue;
8880                 }
8881               break;
8882
8883             case 'I':
8884               my_getExpression (&imm_expr, s);
8885               if (imm_expr.X_op != O_big
8886                   && imm_expr.X_op != O_constant)
8887                 insn_error = _("absolute expression required");
8888               s = expr_end;
8889               continue;
8890
8891             case 'A':
8892               my_getExpression (&offset_expr, s);
8893               *imm_reloc = BFD_RELOC_32;
8894               s = expr_end;
8895               continue;
8896
8897             case 'F':
8898             case 'L':
8899             case 'f':
8900             case 'l':
8901               {
8902                 int f64;
8903                 int using_gprs;
8904                 char *save_in;
8905                 char *err;
8906                 unsigned char temp[8];
8907                 int len;
8908                 unsigned int length;
8909                 segT seg;
8910                 subsegT subseg;
8911                 char *p;
8912
8913                 /* These only appear as the last operand in an
8914                    instruction, and every instruction that accepts
8915                    them in any variant accepts them in all variants.
8916                    This means we don't have to worry about backing out
8917                    any changes if the instruction does not match.
8918
8919                    The difference between them is the size of the
8920                    floating point constant and where it goes.  For 'F'
8921                    and 'L' the constant is 64 bits; for 'f' and 'l' it
8922                    is 32 bits.  Where the constant is placed is based
8923                    on how the MIPS assembler does things:
8924                     F -- .rdata
8925                     L -- .lit8
8926                     f -- immediate value
8927                     l -- .lit4
8928
8929                     The .lit4 and .lit8 sections are only used if
8930                     permitted by the -G argument.
8931
8932                     When generating embedded PIC code, we use the
8933                     .lit8 section but not the .lit4 section (we can do
8934                     .lit4 inline easily; we need to put .lit8
8935                     somewhere in the data segment, and using .lit8
8936                     permits the linker to eventually combine identical
8937                     .lit8 entries).
8938
8939                     The code below needs to know whether the target register
8940                     is 32 or 64 bits wide.  It relies on the fact 'f' and
8941                     'F' are used with GPR-based instructions and 'l' and
8942                     'L' are used with FPR-based instructions.  */
8943
8944                 f64 = *args == 'F' || *args == 'L';
8945                 using_gprs = *args == 'F' || *args == 'f';
8946
8947                 save_in = input_line_pointer;
8948                 input_line_pointer = s;
8949                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
8950                 length = len;
8951                 s = input_line_pointer;
8952                 input_line_pointer = save_in;
8953                 if (err != NULL && *err != '\0')
8954                   {
8955                     as_bad (_("Bad floating point constant: %s"), err);
8956                     memset (temp, '\0', sizeof temp);
8957                     length = f64 ? 8 : 4;
8958                   }
8959
8960                 assert (length == (unsigned) (f64 ? 8 : 4));
8961
8962                 if (*args == 'f'
8963                     || (*args == 'l'
8964                         && (! USE_GLOBAL_POINTER_OPT
8965                             || mips_pic == EMBEDDED_PIC
8966                             || g_switch_value < 4
8967                             || (temp[0] == 0 && temp[1] == 0)
8968                             || (temp[2] == 0 && temp[3] == 0))))
8969                   {
8970                     imm_expr.X_op = O_constant;
8971                     if (! target_big_endian)
8972                       imm_expr.X_add_number = bfd_getl32 (temp);
8973                     else
8974                       imm_expr.X_add_number = bfd_getb32 (temp);
8975                   }
8976                 else if (length > 4
8977                          && ! mips_disable_float_construction
8978                          /* Constants can only be constructed in GPRs and
8979                             copied to FPRs if the GPRs are at least as wide
8980                             as the FPRs.  Force the constant into memory if
8981                             we are using 64-bit FPRs but the GPRs are only
8982                             32 bits wide.  */
8983                          && (using_gprs
8984                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
8985                          && ((temp[0] == 0 && temp[1] == 0)
8986                              || (temp[2] == 0 && temp[3] == 0))
8987                          && ((temp[4] == 0 && temp[5] == 0)
8988                              || (temp[6] == 0 && temp[7] == 0)))
8989                   {
8990                     /* The value is simple enough to load with a couple of
8991                        instructions.  If using 32-bit registers, set
8992                        imm_expr to the high order 32 bits and offset_expr to
8993                        the low order 32 bits.  Otherwise, set imm_expr to
8994                        the entire 64 bit constant.  */
8995                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
8996                       {
8997                         imm_expr.X_op = O_constant;
8998                         offset_expr.X_op = O_constant;
8999                         if (! target_big_endian)
9000                           {
9001                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9002                             offset_expr.X_add_number = bfd_getl32 (temp);
9003                           }
9004                         else
9005                           {
9006                             imm_expr.X_add_number = bfd_getb32 (temp);
9007                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9008                           }
9009                         if (offset_expr.X_add_number == 0)
9010                           offset_expr.X_op = O_absent;
9011                       }
9012                     else if (sizeof (imm_expr.X_add_number) > 4)
9013                       {
9014                         imm_expr.X_op = O_constant;
9015                         if (! target_big_endian)
9016                           imm_expr.X_add_number = bfd_getl64 (temp);
9017                         else
9018                           imm_expr.X_add_number = bfd_getb64 (temp);
9019                       }
9020                     else
9021                       {
9022                         imm_expr.X_op = O_big;
9023                         imm_expr.X_add_number = 4;
9024                         if (! target_big_endian)
9025                           {
9026                             generic_bignum[0] = bfd_getl16 (temp);
9027                             generic_bignum[1] = bfd_getl16 (temp + 2);
9028                             generic_bignum[2] = bfd_getl16 (temp + 4);
9029                             generic_bignum[3] = bfd_getl16 (temp + 6);
9030                           }
9031                         else
9032                           {
9033                             generic_bignum[0] = bfd_getb16 (temp + 6);
9034                             generic_bignum[1] = bfd_getb16 (temp + 4);
9035                             generic_bignum[2] = bfd_getb16 (temp + 2);
9036                             generic_bignum[3] = bfd_getb16 (temp);
9037                           }
9038                       }
9039                   }
9040                 else
9041                   {
9042                     const char *newname;
9043                     segT new_seg;
9044
9045                     /* Switch to the right section.  */
9046                     seg = now_seg;
9047                     subseg = now_subseg;
9048                     switch (*args)
9049                       {
9050                       default: /* unused default case avoids warnings.  */
9051                       case 'L':
9052                         newname = RDATA_SECTION_NAME;
9053                         if ((USE_GLOBAL_POINTER_OPT && g_switch_value >= 8)
9054                             || mips_pic == EMBEDDED_PIC)
9055                           newname = ".lit8";
9056                         break;
9057                       case 'F':
9058                         if (mips_pic == EMBEDDED_PIC)
9059                           newname = ".lit8";
9060                         else
9061                           newname = RDATA_SECTION_NAME;
9062                         break;
9063                       case 'l':
9064                         assert (!USE_GLOBAL_POINTER_OPT
9065                                 || g_switch_value >= 4);
9066                         newname = ".lit4";
9067                         break;
9068                       }
9069                     new_seg = subseg_new (newname, (subsegT) 0);
9070                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
9071                       bfd_set_section_flags (stdoutput, new_seg,
9072                                              (SEC_ALLOC
9073                                               | SEC_LOAD
9074                                               | SEC_READONLY
9075                                               | SEC_DATA));
9076                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9077                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour
9078                         && strcmp (TARGET_OS, "elf") != 0)
9079                       record_alignment (new_seg, 4);
9080                     else
9081                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9082                     if (seg == now_seg)
9083                       as_bad (_("Can't use floating point insn in this section"));
9084
9085                     /* Set the argument to the current address in the
9086                        section.  */
9087                     offset_expr.X_op = O_symbol;
9088                     offset_expr.X_add_symbol =
9089                       symbol_new ("L0\001", now_seg,
9090                                   (valueT) frag_now_fix (), frag_now);
9091                     offset_expr.X_add_number = 0;
9092
9093                     /* Put the floating point number into the section.  */
9094                     p = frag_more ((int) length);
9095                     memcpy (p, temp, length);
9096
9097                     /* Switch back to the original section.  */
9098                     subseg_set (seg, subseg);
9099                   }
9100               }
9101               continue;
9102
9103             case 'i':           /* 16 bit unsigned immediate */
9104             case 'j':           /* 16 bit signed immediate */
9105               *imm_reloc = BFD_RELOC_LO16;
9106               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9107                 {
9108                   int more;
9109                   offsetT minval, maxval;
9110
9111                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9112                           && strcmp (insn->name, insn[1].name) == 0);
9113
9114                   /* If the expression was written as an unsigned number,
9115                      only treat it as signed if there are no more
9116                      alternatives.  */
9117                   if (more
9118                       && *args == 'j'
9119                       && sizeof (imm_expr.X_add_number) <= 4
9120                       && imm_expr.X_op == O_constant
9121                       && imm_expr.X_add_number < 0
9122                       && imm_expr.X_unsigned
9123                       && HAVE_64BIT_GPRS)
9124                     break;
9125
9126                   /* For compatibility with older assemblers, we accept
9127                      0x8000-0xffff as signed 16-bit numbers when only
9128                      signed numbers are allowed.  */
9129                   if (*args == 'i')
9130                     minval = 0, maxval = 0xffff;
9131                   else if (more)
9132                     minval = -0x8000, maxval = 0x7fff;
9133                   else
9134                     minval = -0x8000, maxval = 0xffff;
9135
9136                   if (imm_expr.X_op != O_constant
9137                       || imm_expr.X_add_number < minval
9138                       || imm_expr.X_add_number > maxval)
9139                     {
9140                       if (more)
9141                         break;
9142                       if (imm_expr.X_op == O_constant
9143                           || imm_expr.X_op == O_big)
9144                         as_bad (_("expression out of range"));
9145                     }
9146                 }
9147               s = expr_end;
9148               continue;
9149
9150             case 'o':           /* 16 bit offset */
9151               /* Check whether there is only a single bracketed expression
9152                  left.  If so, it must be the base register and the
9153                  constant must be zero.  */
9154               if (*s == '(' && strchr (s + 1, '(') == 0)
9155                 {
9156                   offset_expr.X_op = O_constant;
9157                   offset_expr.X_add_number = 0;
9158                   continue;
9159                 }
9160
9161               /* If this value won't fit into a 16 bit offset, then go
9162                  find a macro that will generate the 32 bit offset
9163                  code pattern.  */
9164               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9165                   && (offset_expr.X_op != O_constant
9166                       || offset_expr.X_add_number >= 0x8000
9167                       || offset_expr.X_add_number < -0x8000))
9168                 break;
9169
9170               s = expr_end;
9171               continue;
9172
9173             case 'p':           /* pc relative offset */
9174               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9175               my_getExpression (&offset_expr, s);
9176               s = expr_end;
9177               continue;
9178
9179             case 'u':           /* upper 16 bits */
9180               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9181                   && imm_expr.X_op == O_constant
9182                   && (imm_expr.X_add_number < 0
9183                       || imm_expr.X_add_number >= 0x10000))
9184                 as_bad (_("lui expression not in range 0..65535"));
9185               s = expr_end;
9186               continue;
9187
9188             case 'a':           /* 26 bit address */
9189               my_getExpression (&offset_expr, s);
9190               s = expr_end;
9191               *offset_reloc = BFD_RELOC_MIPS_JMP;
9192               continue;
9193
9194             case 'N':           /* 3 bit branch condition code */
9195             case 'M':           /* 3 bit compare condition code */
9196               if (strncmp (s, "$fcc", 4) != 0)
9197                 break;
9198               s += 4;
9199               regno = 0;
9200               do
9201                 {
9202                   regno *= 10;
9203                   regno += *s - '0';
9204                   ++s;
9205                 }
9206               while (ISDIGIT (*s));
9207               if (regno > 7)
9208                 as_bad (_("invalid condition code register $fcc%d"), regno);
9209               if (*args == 'N')
9210                 ip->insn_opcode |= regno << OP_SH_BCC;
9211               else
9212                 ip->insn_opcode |= regno << OP_SH_CCC;
9213               continue;
9214
9215             case 'H':
9216               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9217                 s += 2;
9218               if (ISDIGIT (*s))
9219                 {
9220                   c = 0;
9221                   do
9222                     {
9223                       c *= 10;
9224                       c += *s - '0';
9225                       ++s;
9226                     }
9227                   while (ISDIGIT (*s));
9228                 }
9229               else
9230                 c = 8; /* Invalid sel value.  */
9231
9232               if (c > 7)
9233                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9234               ip->insn_opcode |= c;
9235               continue;
9236
9237             case 'e':
9238               /* Must be at least one digit.  */
9239               my_getExpression (&imm_expr, s);
9240               check_absolute_expr (ip, &imm_expr);
9241
9242               if ((unsigned long) imm_expr.X_add_number
9243                   > (unsigned long) OP_MASK_VECBYTE)
9244                 {
9245                   as_bad (_("bad byte vector index (%ld)"),
9246                            (long) imm_expr.X_add_number);
9247                   imm_expr.X_add_number = 0;
9248                 }
9249
9250               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECBYTE;
9251               imm_expr.X_op = O_absent;
9252               s = expr_end;
9253               continue;
9254
9255             case '%':
9256               my_getExpression (&imm_expr, s);
9257               check_absolute_expr (ip, &imm_expr);
9258
9259               if ((unsigned long) imm_expr.X_add_number
9260                   > (unsigned long) OP_MASK_VECALIGN)
9261                 {
9262                   as_bad (_("bad byte vector index (%ld)"),
9263                            (long) imm_expr.X_add_number);
9264                   imm_expr.X_add_number = 0;
9265                 }
9266
9267               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECALIGN;
9268               imm_expr.X_op = O_absent;
9269               s = expr_end;
9270               continue;
9271
9272             default:
9273               as_bad (_("bad char = '%c'\n"), *args);
9274               internalError ();
9275             }
9276           break;
9277         }
9278       /* Args don't match.  */
9279       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9280           !strcmp (insn->name, insn[1].name))
9281         {
9282           ++insn;
9283           s = argsStart;
9284           insn_error = _("illegal operands");
9285           continue;
9286         }
9287       if (save_c)
9288         *(--s) = save_c;
9289       insn_error = _("illegal operands");
9290       return;
9291     }
9292 }
9293
9294 /* This routine assembles an instruction into its binary format when
9295    assembling for the mips16.  As a side effect, it sets one of the
9296    global variables imm_reloc or offset_reloc to the type of
9297    relocation to do if one of the operands is an address expression.
9298    It also sets mips16_small and mips16_ext if the user explicitly
9299    requested a small or extended instruction.  */
9300
9301 static void
9302 mips16_ip (str, ip)
9303      char *str;
9304      struct mips_cl_insn *ip;
9305 {
9306   char *s;
9307   const char *args;
9308   struct mips_opcode *insn;
9309   char *argsstart;
9310   unsigned int regno;
9311   unsigned int lastregno = 0;
9312   char *s_reset;
9313
9314   insn_error = NULL;
9315
9316   mips16_small = FALSE;
9317   mips16_ext = FALSE;
9318
9319   for (s = str; ISLOWER (*s); ++s)
9320     ;
9321   switch (*s)
9322     {
9323     case '\0':
9324       break;
9325
9326     case ' ':
9327       *s++ = '\0';
9328       break;
9329
9330     case '.':
9331       if (s[1] == 't' && s[2] == ' ')
9332         {
9333           *s = '\0';
9334           mips16_small = TRUE;
9335           s += 3;
9336           break;
9337         }
9338       else if (s[1] == 'e' && s[2] == ' ')
9339         {
9340           *s = '\0';
9341           mips16_ext = TRUE;
9342           s += 3;
9343           break;
9344         }
9345       /* Fall through.  */
9346     default:
9347       insn_error = _("unknown opcode");
9348       return;
9349     }
9350
9351   if (mips_opts.noautoextend && ! mips16_ext)
9352     mips16_small = TRUE;
9353
9354   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9355     {
9356       insn_error = _("unrecognized opcode");
9357       return;
9358     }
9359
9360   argsstart = s;
9361   for (;;)
9362     {
9363       assert (strcmp (insn->name, str) == 0);
9364
9365       ip->insn_mo = insn;
9366       ip->insn_opcode = insn->match;
9367       ip->use_extend = FALSE;
9368       imm_expr.X_op = O_absent;
9369       imm_reloc[0] = BFD_RELOC_UNUSED;
9370       imm_reloc[1] = BFD_RELOC_UNUSED;
9371       imm_reloc[2] = BFD_RELOC_UNUSED;
9372       offset_expr.X_op = O_absent;
9373       offset_reloc[0] = BFD_RELOC_UNUSED;
9374       offset_reloc[1] = BFD_RELOC_UNUSED;
9375       offset_reloc[2] = BFD_RELOC_UNUSED;
9376       for (args = insn->args; 1; ++args)
9377         {
9378           int c;
9379
9380           if (*s == ' ')
9381             ++s;
9382
9383           /* In this switch statement we call break if we did not find
9384              a match, continue if we did find a match, or return if we
9385              are done.  */
9386
9387           c = *args;
9388           switch (c)
9389             {
9390             case '\0':
9391               if (*s == '\0')
9392                 {
9393                   /* Stuff the immediate value in now, if we can.  */
9394                   if (imm_expr.X_op == O_constant
9395                       && *imm_reloc > BFD_RELOC_UNUSED
9396                       && insn->pinfo != INSN_MACRO)
9397                     {
9398                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9399                                     imm_expr.X_add_number, TRUE, mips16_small,
9400                                     mips16_ext, &ip->insn_opcode,
9401                                     &ip->use_extend, &ip->extend);
9402                       imm_expr.X_op = O_absent;
9403                       *imm_reloc = BFD_RELOC_UNUSED;
9404                     }
9405
9406                   return;
9407                 }
9408               break;
9409
9410             case ',':
9411               if (*s++ == c)
9412                 continue;
9413               s--;
9414               switch (*++args)
9415                 {
9416                 case 'v':
9417                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9418                   continue;
9419                 case 'w':
9420                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9421                   continue;
9422                 }
9423               break;
9424
9425             case '(':
9426             case ')':
9427               if (*s++ == c)
9428                 continue;
9429               break;
9430
9431             case 'v':
9432             case 'w':
9433               if (s[0] != '$')
9434                 {
9435                   if (c == 'v')
9436                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9437                   else
9438                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9439                   ++args;
9440                   continue;
9441                 }
9442               /* Fall through.  */
9443             case 'x':
9444             case 'y':
9445             case 'z':
9446             case 'Z':
9447             case '0':
9448             case 'S':
9449             case 'R':
9450             case 'X':
9451             case 'Y':
9452               if (s[0] != '$')
9453                 break;
9454               s_reset = s;
9455               if (ISDIGIT (s[1]))
9456                 {
9457                   ++s;
9458                   regno = 0;
9459                   do
9460                     {
9461                       regno *= 10;
9462                       regno += *s - '0';
9463                       ++s;
9464                     }
9465                   while (ISDIGIT (*s));
9466                   if (regno > 31)
9467                     {
9468                       as_bad (_("invalid register number (%d)"), regno);
9469                       regno = 2;
9470                     }
9471                 }
9472               else
9473                 {
9474                   if (s[1] == 'r' && s[2] == 'a')
9475                     {
9476                       s += 3;
9477                       regno = RA;
9478                     }
9479                   else if (s[1] == 'f' && s[2] == 'p')
9480                     {
9481                       s += 3;
9482                       regno = FP;
9483                     }
9484                   else if (s[1] == 's' && s[2] == 'p')
9485                     {
9486                       s += 3;
9487                       regno = SP;
9488                     }
9489                   else if (s[1] == 'g' && s[2] == 'p')
9490                     {
9491                       s += 3;
9492                       regno = GP;
9493                     }
9494                   else if (s[1] == 'a' && s[2] == 't')
9495                     {
9496                       s += 3;
9497                       regno = AT;
9498                     }
9499                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9500                     {
9501                       s += 4;
9502                       regno = KT0;
9503                     }
9504                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9505                     {
9506                       s += 4;
9507                       regno = KT1;
9508                     }
9509                   else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9510                     {
9511                       s += 5;
9512                       regno = ZERO;
9513                     }
9514                   else
9515                     break;
9516                 }
9517
9518               if (*s == ' ')
9519                 ++s;
9520               if (args[1] != *s)
9521                 {
9522                   if (c == 'v' || c == 'w')
9523                     {
9524                       regno = mips16_to_32_reg_map[lastregno];
9525                       s = s_reset;
9526                       ++args;
9527                     }
9528                 }
9529
9530               switch (c)
9531                 {
9532                 case 'x':
9533                 case 'y':
9534                 case 'z':
9535                 case 'v':
9536                 case 'w':
9537                 case 'Z':
9538                   regno = mips32_to_16_reg_map[regno];
9539                   break;
9540
9541                 case '0':
9542                   if (regno != 0)
9543                     regno = ILLEGAL_REG;
9544                   break;
9545
9546                 case 'S':
9547                   if (regno != SP)
9548                     regno = ILLEGAL_REG;
9549                   break;
9550
9551                 case 'R':
9552                   if (regno != RA)
9553                     regno = ILLEGAL_REG;
9554                   break;
9555
9556                 case 'X':
9557                 case 'Y':
9558                   if (regno == AT && ! mips_opts.noat)
9559                     as_warn (_("used $at without \".set noat\""));
9560                   break;
9561
9562                 default:
9563                   internalError ();
9564                 }
9565
9566               if (regno == ILLEGAL_REG)
9567                 break;
9568
9569               switch (c)
9570                 {
9571                 case 'x':
9572                 case 'v':
9573                   ip->insn_opcode |= regno << MIPS16OP_SH_RX;
9574                   break;
9575                 case 'y':
9576                 case 'w':
9577                   ip->insn_opcode |= regno << MIPS16OP_SH_RY;
9578                   break;
9579                 case 'z':
9580                   ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
9581                   break;
9582                 case 'Z':
9583                   ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
9584                 case '0':
9585                 case 'S':
9586                 case 'R':
9587                   break;
9588                 case 'X':
9589                   ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
9590                   break;
9591                 case 'Y':
9592                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9593                   ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
9594                   break;
9595                 default:
9596                   internalError ();
9597                 }
9598
9599               lastregno = regno;
9600               continue;
9601
9602             case 'P':
9603               if (strncmp (s, "$pc", 3) == 0)
9604                 {
9605                   s += 3;
9606                   continue;
9607                 }
9608               break;
9609
9610             case '<':
9611             case '>':
9612             case '[':
9613             case ']':
9614             case '4':
9615             case '5':
9616             case 'H':
9617             case 'W':
9618             case 'D':
9619             case 'j':
9620             case '8':
9621             case 'V':
9622             case 'C':
9623             case 'U':
9624             case 'k':
9625             case 'K':
9626               if (s[0] == '%'
9627                   && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
9628                 {
9629                   /* This is %gprel(SYMBOL).  We need to read SYMBOL,
9630                      and generate the appropriate reloc.  If the text
9631                      inside %gprel is not a symbol name with an
9632                      optional offset, then we generate a normal reloc
9633                      and will probably fail later.  */
9634                   my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
9635                   if (imm_expr.X_op == O_symbol)
9636                     {
9637                       mips16_ext = TRUE;
9638                       *imm_reloc = BFD_RELOC_MIPS16_GPREL;
9639                       s = expr_end;
9640                       ip->use_extend = TRUE;
9641                       ip->extend = 0;
9642                       continue;
9643                     }
9644                 }
9645               else
9646                 {
9647                   /* Just pick up a normal expression.  */
9648                   my_getExpression (&imm_expr, s);
9649                 }
9650
9651               if (imm_expr.X_op == O_register)
9652                 {
9653                   /* What we thought was an expression turned out to
9654                      be a register.  */
9655
9656                   if (s[0] == '(' && args[1] == '(')
9657                     {
9658                       /* It looks like the expression was omitted
9659                          before a register indirection, which means
9660                          that the expression is implicitly zero.  We
9661                          still set up imm_expr, so that we handle
9662                          explicit extensions correctly.  */
9663                       imm_expr.X_op = O_constant;
9664                       imm_expr.X_add_number = 0;
9665                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9666                       continue;
9667                     }
9668
9669                   break;
9670                 }
9671
9672               /* We need to relax this instruction.  */
9673               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9674               s = expr_end;
9675               continue;
9676
9677             case 'p':
9678             case 'q':
9679             case 'A':
9680             case 'B':
9681             case 'E':
9682               /* We use offset_reloc rather than imm_reloc for the PC
9683                  relative operands.  This lets macros with both
9684                  immediate and address operands work correctly.  */
9685               my_getExpression (&offset_expr, s);
9686
9687               if (offset_expr.X_op == O_register)
9688                 break;
9689
9690               /* We need to relax this instruction.  */
9691               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
9692               s = expr_end;
9693               continue;
9694
9695             case '6':           /* break code */
9696               my_getExpression (&imm_expr, s);
9697               check_absolute_expr (ip, &imm_expr);
9698               if ((unsigned long) imm_expr.X_add_number > 63)
9699                 {
9700                   as_warn (_("Invalid value for `%s' (%lu)"),
9701                            ip->insn_mo->name,
9702                            (unsigned long) imm_expr.X_add_number);
9703                   imm_expr.X_add_number &= 0x3f;
9704                 }
9705               ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
9706               imm_expr.X_op = O_absent;
9707               s = expr_end;
9708               continue;
9709
9710             case 'a':           /* 26 bit address */
9711               my_getExpression (&offset_expr, s);
9712               s = expr_end;
9713               *offset_reloc = BFD_RELOC_MIPS16_JMP;
9714               ip->insn_opcode <<= 16;
9715               continue;
9716
9717             case 'l':           /* register list for entry macro */
9718             case 'L':           /* register list for exit macro */
9719               {
9720                 int mask;
9721
9722                 if (c == 'l')
9723                   mask = 0;
9724                 else
9725                   mask = 7 << 3;
9726                 while (*s != '\0')
9727                   {
9728                     int freg, reg1, reg2;
9729
9730                     while (*s == ' ' || *s == ',')
9731                       ++s;
9732                     if (*s != '$')
9733                       {
9734                         as_bad (_("can't parse register list"));
9735                         break;
9736                       }
9737                     ++s;
9738                     if (*s != 'f')
9739                       freg = 0;
9740                     else
9741                       {
9742                         freg = 1;
9743                         ++s;
9744                       }
9745                     reg1 = 0;
9746                     while (ISDIGIT (*s))
9747                       {
9748                         reg1 *= 10;
9749                         reg1 += *s - '0';
9750                         ++s;
9751                       }
9752                     if (*s == ' ')
9753                       ++s;
9754                     if (*s != '-')
9755                       reg2 = reg1;
9756                     else
9757                       {
9758                         ++s;
9759                         if (*s != '$')
9760                           break;
9761                         ++s;
9762                         if (freg)
9763                           {
9764                             if (*s == 'f')
9765                               ++s;
9766                             else
9767                               {
9768                                 as_bad (_("invalid register list"));
9769                                 break;
9770                               }
9771                           }
9772                         reg2 = 0;
9773                         while (ISDIGIT (*s))
9774                           {
9775                             reg2 *= 10;
9776                             reg2 += *s - '0';
9777                             ++s;
9778                           }
9779                       }
9780                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
9781                       {
9782                         mask &= ~ (7 << 3);
9783                         mask |= 5 << 3;
9784                       }
9785                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
9786                       {
9787                         mask &= ~ (7 << 3);
9788                         mask |= 6 << 3;
9789                       }
9790                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
9791                       mask |= (reg2 - 3) << 3;
9792                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
9793                       mask |= (reg2 - 15) << 1;
9794                     else if (reg1 == RA && reg2 == RA)
9795                       mask |= 1;
9796                     else
9797                       {
9798                         as_bad (_("invalid register list"));
9799                         break;
9800                       }
9801                   }
9802                 /* The mask is filled in in the opcode table for the
9803                    benefit of the disassembler.  We remove it before
9804                    applying the actual mask.  */
9805                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
9806                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
9807               }
9808             continue;
9809
9810             case 'e':           /* extend code */
9811               my_getExpression (&imm_expr, s);
9812               check_absolute_expr (ip, &imm_expr);
9813               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
9814                 {
9815                   as_warn (_("Invalid value for `%s' (%lu)"),
9816                            ip->insn_mo->name,
9817                            (unsigned long) imm_expr.X_add_number);
9818                   imm_expr.X_add_number &= 0x7ff;
9819                 }
9820               ip->insn_opcode |= imm_expr.X_add_number;
9821               imm_expr.X_op = O_absent;
9822               s = expr_end;
9823               continue;
9824
9825             default:
9826               internalError ();
9827             }
9828           break;
9829         }
9830
9831       /* Args don't match.  */
9832       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
9833           strcmp (insn->name, insn[1].name) == 0)
9834         {
9835           ++insn;
9836           s = argsstart;
9837           continue;
9838         }
9839
9840       insn_error = _("illegal operands");
9841
9842       return;
9843     }
9844 }
9845
9846 /* This structure holds information we know about a mips16 immediate
9847    argument type.  */
9848
9849 struct mips16_immed_operand
9850 {
9851   /* The type code used in the argument string in the opcode table.  */
9852   int type;
9853   /* The number of bits in the short form of the opcode.  */
9854   int nbits;
9855   /* The number of bits in the extended form of the opcode.  */
9856   int extbits;
9857   /* The amount by which the short form is shifted when it is used;
9858      for example, the sw instruction has a shift count of 2.  */
9859   int shift;
9860   /* The amount by which the short form is shifted when it is stored
9861      into the instruction code.  */
9862   int op_shift;
9863   /* Non-zero if the short form is unsigned.  */
9864   int unsp;
9865   /* Non-zero if the extended form is unsigned.  */
9866   int extu;
9867   /* Non-zero if the value is PC relative.  */
9868   int pcrel;
9869 };
9870
9871 /* The mips16 immediate operand types.  */
9872
9873 static const struct mips16_immed_operand mips16_immed_operands[] =
9874 {
9875   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9876   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9877   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9878   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9879   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
9880   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
9881   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
9882   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
9883   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
9884   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
9885   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
9886   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
9887   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
9888   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
9889   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
9890   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
9891   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9892   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9893   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
9894   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
9895   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
9896 };
9897
9898 #define MIPS16_NUM_IMMED \
9899   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
9900
9901 /* Handle a mips16 instruction with an immediate value.  This or's the
9902    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
9903    whether an extended value is needed; if one is needed, it sets
9904    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
9905    If SMALL is true, an unextended opcode was explicitly requested.
9906    If EXT is true, an extended opcode was explicitly requested.  If
9907    WARN is true, warn if EXT does not match reality.  */
9908
9909 static void
9910 mips16_immed (file, line, type, val, warn, small, ext, insn, use_extend,
9911               extend)
9912      char *file;
9913      unsigned int line;
9914      int type;
9915      offsetT val;
9916      bfd_boolean warn;
9917      bfd_boolean small;
9918      bfd_boolean ext;
9919      unsigned long *insn;
9920      bfd_boolean *use_extend;
9921      unsigned short *extend;
9922 {
9923   register const struct mips16_immed_operand *op;
9924   int mintiny, maxtiny;
9925   bfd_boolean needext;
9926
9927   op = mips16_immed_operands;
9928   while (op->type != type)
9929     {
9930       ++op;
9931       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
9932     }
9933
9934   if (op->unsp)
9935     {
9936       if (type == '<' || type == '>' || type == '[' || type == ']')
9937         {
9938           mintiny = 1;
9939           maxtiny = 1 << op->nbits;
9940         }
9941       else
9942         {
9943           mintiny = 0;
9944           maxtiny = (1 << op->nbits) - 1;
9945         }
9946     }
9947   else
9948     {
9949       mintiny = - (1 << (op->nbits - 1));
9950       maxtiny = (1 << (op->nbits - 1)) - 1;
9951     }
9952
9953   /* Branch offsets have an implicit 0 in the lowest bit.  */
9954   if (type == 'p' || type == 'q')
9955     val /= 2;
9956
9957   if ((val & ((1 << op->shift) - 1)) != 0
9958       || val < (mintiny << op->shift)
9959       || val > (maxtiny << op->shift))
9960     needext = TRUE;
9961   else
9962     needext = FALSE;
9963
9964   if (warn && ext && ! needext)
9965     as_warn_where (file, line,
9966                    _("extended operand requested but not required"));
9967   if (small && needext)
9968     as_bad_where (file, line, _("invalid unextended operand value"));
9969
9970   if (small || (! ext && ! needext))
9971     {
9972       int insnval;
9973
9974       *use_extend = FALSE;
9975       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
9976       insnval <<= op->op_shift;
9977       *insn |= insnval;
9978     }
9979   else
9980     {
9981       long minext, maxext;
9982       int extval;
9983
9984       if (op->extu)
9985         {
9986           minext = 0;
9987           maxext = (1 << op->extbits) - 1;
9988         }
9989       else
9990         {
9991           minext = - (1 << (op->extbits - 1));
9992           maxext = (1 << (op->extbits - 1)) - 1;
9993         }
9994       if (val < minext || val > maxext)
9995         as_bad_where (file, line,
9996                       _("operand value out of range for instruction"));
9997
9998       *use_extend = TRUE;
9999       if (op->extbits == 16)
10000         {
10001           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10002           val &= 0x1f;
10003         }
10004       else if (op->extbits == 15)
10005         {
10006           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10007           val &= 0xf;
10008         }
10009       else
10010         {
10011           extval = ((val & 0x1f) << 6) | (val & 0x20);
10012           val = 0;
10013         }
10014
10015       *extend = (unsigned short) extval;
10016       *insn |= val;
10017     }
10018 }
10019 \f
10020 static const struct percent_op_match
10021 {
10022   const char *str;
10023   bfd_reloc_code_real_type reloc;
10024 } percent_op[] =
10025 {
10026   {"%lo", BFD_RELOC_LO16},
10027 #ifdef OBJ_ELF
10028   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10029   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10030   {"%call16", BFD_RELOC_MIPS_CALL16},
10031   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10032   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10033   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10034   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10035   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10036   {"%got", BFD_RELOC_MIPS_GOT16},
10037   {"%gp_rel", BFD_RELOC_GPREL16},
10038   {"%half", BFD_RELOC_16},
10039   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10040   {"%higher", BFD_RELOC_MIPS_HIGHER},
10041   {"%neg", BFD_RELOC_MIPS_SUB},
10042 #endif
10043   {"%hi", BFD_RELOC_HI16_S}
10044 };
10045
10046
10047 /* Return true if *STR points to a relocation operator.  When returning true,
10048    move *STR over the operator and store its relocation code in *RELOC.
10049    Leave both *STR and *RELOC alone when returning false.  */
10050
10051 static bfd_boolean
10052 parse_relocation (str, reloc)
10053      char **str;
10054      bfd_reloc_code_real_type *reloc;
10055 {
10056   size_t i;
10057
10058   for (i = 0; i < ARRAY_SIZE (percent_op); i++)
10059     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10060       {
10061         *str += strlen (percent_op[i].str);
10062         *reloc = percent_op[i].reloc;
10063
10064         /* Check whether the output BFD supports this relocation.
10065            If not, issue an error and fall back on something safe.  */
10066         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10067           {
10068             as_bad ("relocation %s isn't supported by the current ABI",
10069                     percent_op[i].str);
10070             *reloc = BFD_RELOC_LO16;
10071           }
10072         return TRUE;
10073       }
10074   return FALSE;
10075 }
10076
10077
10078 /* Parse string STR as a 16-bit relocatable operand.  Store the
10079    expression in *EP and the relocations in the array starting
10080    at RELOC.  Return the number of relocation operators used.
10081
10082    On exit, EXPR_END points to the first character after the expression.
10083    If no relocation operators are used, RELOC[0] is set to BFD_RELOC_LO16.  */
10084
10085 static size_t
10086 my_getSmallExpression (ep, reloc, str)
10087      expressionS *ep;
10088      bfd_reloc_code_real_type *reloc;
10089      char *str;
10090 {
10091   bfd_reloc_code_real_type reversed_reloc[3];
10092   size_t reloc_index, i;
10093   int crux_depth, str_depth;
10094   char *crux;
10095
10096   /* Search for the start of the main expression, recoding relocations
10097      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10098      of the main expression and with CRUX_DEPTH containing the number
10099      of open brackets at that point.  */
10100   reloc_index = -1;
10101   str_depth = 0;
10102   do
10103     {
10104       reloc_index++;
10105       crux = str;
10106       crux_depth = str_depth;
10107
10108       /* Skip over whitespace and brackets, keeping count of the number
10109          of brackets.  */
10110       while (*str == ' ' || *str == '\t' || *str == '(')
10111         if (*str++ == '(')
10112           str_depth++;
10113     }
10114   while (*str == '%'
10115          && reloc_index < (HAVE_NEWABI ? 3 : 1)
10116          && parse_relocation (&str, &reversed_reloc[reloc_index]));
10117
10118   my_getExpression (ep, crux);
10119   str = expr_end;
10120
10121   /* Match every open bracket.  */
10122   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10123     if (*str++ == ')')
10124       crux_depth--;
10125
10126   if (crux_depth > 0)
10127     as_bad ("unclosed '('");
10128
10129   expr_end = str;
10130
10131   if (reloc_index == 0)
10132     reloc[0] = BFD_RELOC_LO16;
10133   else
10134     {
10135       prev_reloc_op_frag = frag_now;
10136       for (i = 0; i < reloc_index; i++)
10137         reloc[i] = reversed_reloc[reloc_index - 1 - i];
10138     }
10139
10140   return reloc_index;
10141 }
10142
10143 static void
10144 my_getExpression (ep, str)
10145      expressionS *ep;
10146      char *str;
10147 {
10148   char *save_in;
10149   valueT val;
10150
10151   save_in = input_line_pointer;
10152   input_line_pointer = str;
10153   expression (ep);
10154   expr_end = input_line_pointer;
10155   input_line_pointer = save_in;
10156
10157   /* If we are in mips16 mode, and this is an expression based on `.',
10158      then we bump the value of the symbol by 1 since that is how other
10159      text symbols are handled.  We don't bother to handle complex
10160      expressions, just `.' plus or minus a constant.  */
10161   if (mips_opts.mips16
10162       && ep->X_op == O_symbol
10163       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10164       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10165       && symbol_get_frag (ep->X_add_symbol) == frag_now
10166       && symbol_constant_p (ep->X_add_symbol)
10167       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10168     S_SET_VALUE (ep->X_add_symbol, val + 1);
10169 }
10170
10171 /* Turn a string in input_line_pointer into a floating point constant
10172    of type TYPE, and store the appropriate bytes in *LITP.  The number
10173    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
10174    returned, or NULL on OK.  */
10175
10176 char *
10177 md_atof (type, litP, sizeP)
10178      int type;
10179      char *litP;
10180      int *sizeP;
10181 {
10182   int prec;
10183   LITTLENUM_TYPE words[4];
10184   char *t;
10185   int i;
10186
10187   switch (type)
10188     {
10189     case 'f':
10190       prec = 2;
10191       break;
10192
10193     case 'd':
10194       prec = 4;
10195       break;
10196
10197     default:
10198       *sizeP = 0;
10199       return _("bad call to md_atof");
10200     }
10201
10202   t = atof_ieee (input_line_pointer, type, words);
10203   if (t)
10204     input_line_pointer = t;
10205
10206   *sizeP = prec * 2;
10207
10208   if (! target_big_endian)
10209     {
10210       for (i = prec - 1; i >= 0; i--)
10211         {
10212           md_number_to_chars (litP, (valueT) words[i], 2);
10213           litP += 2;
10214         }
10215     }
10216   else
10217     {
10218       for (i = 0; i < prec; i++)
10219         {
10220           md_number_to_chars (litP, (valueT) words[i], 2);
10221           litP += 2;
10222         }
10223     }
10224
10225   return NULL;
10226 }
10227
10228 void
10229 md_number_to_chars (buf, val, n)
10230      char *buf;
10231      valueT val;
10232      int n;
10233 {
10234   if (target_big_endian)
10235     number_to_chars_bigendian (buf, val, n);
10236   else
10237     number_to_chars_littleendian (buf, val, n);
10238 }
10239 \f
10240 #ifdef OBJ_ELF
10241 static int support_64bit_objects(void)
10242 {
10243   const char **list, **l;
10244   int yes;
10245
10246   list = bfd_target_list ();
10247   for (l = list; *l != NULL; l++)
10248 #ifdef TE_TMIPS
10249     /* This is traditional mips */
10250     if (strcmp (*l, "elf64-tradbigmips") == 0
10251         || strcmp (*l, "elf64-tradlittlemips") == 0)
10252 #else
10253     if (strcmp (*l, "elf64-bigmips") == 0
10254         || strcmp (*l, "elf64-littlemips") == 0)
10255 #endif
10256       break;
10257   yes = (*l != NULL);
10258   free (list);
10259   return yes;
10260 }
10261 #endif /* OBJ_ELF */
10262
10263 const char *md_shortopts = "nO::g::G:";
10264
10265 struct option md_longopts[] =
10266 {
10267 #define OPTION_MIPS1 (OPTION_MD_BASE + 1)
10268   {"mips0", no_argument, NULL, OPTION_MIPS1},
10269   {"mips1", no_argument, NULL, OPTION_MIPS1},
10270 #define OPTION_MIPS2 (OPTION_MD_BASE + 2)
10271   {"mips2", no_argument, NULL, OPTION_MIPS2},
10272 #define OPTION_MIPS3 (OPTION_MD_BASE + 3)
10273   {"mips3", no_argument, NULL, OPTION_MIPS3},
10274 #define OPTION_MIPS4 (OPTION_MD_BASE + 4)
10275   {"mips4", no_argument, NULL, OPTION_MIPS4},
10276 #define OPTION_MIPS5 (OPTION_MD_BASE + 5)
10277   {"mips5", no_argument, NULL, OPTION_MIPS5},
10278 #define OPTION_MIPS32 (OPTION_MD_BASE + 6)
10279   {"mips32", no_argument, NULL, OPTION_MIPS32},
10280 #define OPTION_MIPS64 (OPTION_MD_BASE + 7)
10281   {"mips64", no_argument, NULL, OPTION_MIPS64},
10282 #define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 8)
10283   {"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
10284 #define OPTION_TRAP (OPTION_MD_BASE + 9)
10285   {"trap", no_argument, NULL, OPTION_TRAP},
10286   {"no-break", no_argument, NULL, OPTION_TRAP},
10287 #define OPTION_BREAK (OPTION_MD_BASE + 10)
10288   {"break", no_argument, NULL, OPTION_BREAK},
10289   {"no-trap", no_argument, NULL, OPTION_BREAK},
10290 #define OPTION_EB (OPTION_MD_BASE + 11)
10291   {"EB", no_argument, NULL, OPTION_EB},
10292 #define OPTION_EL (OPTION_MD_BASE + 12)
10293   {"EL", no_argument, NULL, OPTION_EL},
10294 #define OPTION_MIPS16 (OPTION_MD_BASE + 13)
10295   {"mips16", no_argument, NULL, OPTION_MIPS16},
10296 #define OPTION_NO_MIPS16 (OPTION_MD_BASE + 14)
10297   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10298 #define OPTION_M7000_HILO_FIX (OPTION_MD_BASE + 15)
10299   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10300 #define OPTION_MNO_7000_HILO_FIX (OPTION_MD_BASE + 16)
10301   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10302   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10303 #define OPTION_FP32 (OPTION_MD_BASE + 17)
10304   {"mfp32", no_argument, NULL, OPTION_FP32},
10305 #define OPTION_GP32 (OPTION_MD_BASE + 18)
10306   {"mgp32", no_argument, NULL, OPTION_GP32},
10307 #define OPTION_CONSTRUCT_FLOATS (OPTION_MD_BASE + 19)
10308   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10309 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MD_BASE + 20)
10310   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10311 #define OPTION_MARCH (OPTION_MD_BASE + 21)
10312   {"march", required_argument, NULL, OPTION_MARCH},
10313 #define OPTION_MTUNE (OPTION_MD_BASE + 22)
10314   {"mtune", required_argument, NULL, OPTION_MTUNE},
10315 #define OPTION_FP64 (OPTION_MD_BASE + 23)
10316   {"mfp64", no_argument, NULL, OPTION_FP64},
10317 #define OPTION_M4650 (OPTION_MD_BASE + 24)
10318   {"m4650", no_argument, NULL, OPTION_M4650},
10319 #define OPTION_NO_M4650 (OPTION_MD_BASE + 25)
10320   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10321 #define OPTION_M4010 (OPTION_MD_BASE + 26)
10322   {"m4010", no_argument, NULL, OPTION_M4010},
10323 #define OPTION_NO_M4010 (OPTION_MD_BASE + 27)
10324   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10325 #define OPTION_M4100 (OPTION_MD_BASE + 28)
10326   {"m4100", no_argument, NULL, OPTION_M4100},
10327 #define OPTION_NO_M4100 (OPTION_MD_BASE + 29)
10328   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10329 #define OPTION_M3900 (OPTION_MD_BASE + 30)
10330   {"m3900", no_argument, NULL, OPTION_M3900},
10331 #define OPTION_NO_M3900 (OPTION_MD_BASE + 31)
10332   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10333 #define OPTION_GP64 (OPTION_MD_BASE + 32)
10334   {"mgp64", no_argument, NULL, OPTION_GP64},
10335 #define OPTION_MIPS3D (OPTION_MD_BASE + 33)
10336   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10337 #define OPTION_NO_MIPS3D (OPTION_MD_BASE + 34)
10338   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10339 #define OPTION_MDMX (OPTION_MD_BASE + 35)
10340   {"mdmx", no_argument, NULL, OPTION_MDMX},
10341 #define OPTION_NO_MDMX (OPTION_MD_BASE + 36)
10342   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10343 #define OPTION_FIX_VR4122 (OPTION_MD_BASE + 37)
10344 #define OPTION_NO_FIX_VR4122 (OPTION_MD_BASE + 38)
10345   {"mfix-vr4122-bugs",    no_argument, NULL, OPTION_FIX_VR4122},
10346   {"no-mfix-vr4122-bugs", no_argument, NULL, OPTION_NO_FIX_VR4122},
10347 #define OPTION_RELAX_BRANCH (OPTION_MD_BASE + 39)
10348 #define OPTION_NO_RELAX_BRANCH (OPTION_MD_BASE + 40)
10349   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10350   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10351 #define OPTION_MIPS32R2 (OPTION_MD_BASE + 41)
10352   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10353 #ifdef OBJ_ELF
10354 #define OPTION_ELF_BASE    (OPTION_MD_BASE + 42)
10355 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10356   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10357   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10358 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10359   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10360 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10361   {"xgot",        no_argument, NULL, OPTION_XGOT},
10362 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10363   {"mabi", required_argument, NULL, OPTION_MABI},
10364 #define OPTION_32          (OPTION_ELF_BASE + 4)
10365   {"32",          no_argument, NULL, OPTION_32},
10366 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10367   {"n32",         no_argument, NULL, OPTION_N32},
10368 #define OPTION_64          (OPTION_ELF_BASE + 6)
10369   {"64",          no_argument, NULL, OPTION_64},
10370 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10371   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10372 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10373   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10374 #endif /* OBJ_ELF */
10375   {NULL, no_argument, NULL, 0}
10376 };
10377 size_t md_longopts_size = sizeof (md_longopts);
10378
10379 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10380    NEW_VALUE.  Warn if another value was already specified.  Note:
10381    we have to defer parsing the -march and -mtune arguments in order
10382    to handle 'from-abi' correctly, since the ABI might be specified
10383    in a later argument.  */
10384
10385 static void
10386 mips_set_option_string (string_ptr, new_value)
10387      const char **string_ptr, *new_value;
10388 {
10389   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10390     as_warn (_("A different %s was already specified, is now %s"),
10391              string_ptr == &mips_arch_string ? "-march" : "-mtune",
10392              new_value);
10393
10394   *string_ptr = new_value;
10395 }
10396
10397 int
10398 md_parse_option (c, arg)
10399      int c;
10400      char *arg;
10401 {
10402   switch (c)
10403     {
10404     case OPTION_CONSTRUCT_FLOATS:
10405       mips_disable_float_construction = 0;
10406       break;
10407
10408     case OPTION_NO_CONSTRUCT_FLOATS:
10409       mips_disable_float_construction = 1;
10410       break;
10411
10412     case OPTION_TRAP:
10413       mips_trap = 1;
10414       break;
10415
10416     case OPTION_BREAK:
10417       mips_trap = 0;
10418       break;
10419
10420     case OPTION_EB:
10421       target_big_endian = 1;
10422       break;
10423
10424     case OPTION_EL:
10425       target_big_endian = 0;
10426       break;
10427
10428     case 'n':
10429       warn_nops = 1;
10430       break;
10431
10432     case 'O':
10433       if (arg && arg[1] == '0')
10434         mips_optimize = 1;
10435       else
10436         mips_optimize = 2;
10437       break;
10438
10439     case 'g':
10440       if (arg == NULL)
10441         mips_debug = 2;
10442       else
10443         mips_debug = atoi (arg);
10444       /* When the MIPS assembler sees -g or -g2, it does not do
10445          optimizations which limit full symbolic debugging.  We take
10446          that to be equivalent to -O0.  */
10447       if (mips_debug == 2)
10448         mips_optimize = 1;
10449       break;
10450
10451     case OPTION_MIPS1:
10452       file_mips_isa = ISA_MIPS1;
10453       break;
10454
10455     case OPTION_MIPS2:
10456       file_mips_isa = ISA_MIPS2;
10457       break;
10458
10459     case OPTION_MIPS3:
10460       file_mips_isa = ISA_MIPS3;
10461       break;
10462
10463     case OPTION_MIPS4:
10464       file_mips_isa = ISA_MIPS4;
10465       break;
10466
10467     case OPTION_MIPS5:
10468       file_mips_isa = ISA_MIPS5;
10469       break;
10470
10471     case OPTION_MIPS32:
10472       file_mips_isa = ISA_MIPS32;
10473       break;
10474
10475     case OPTION_MIPS32R2:
10476       file_mips_isa = ISA_MIPS32R2;
10477       break;
10478
10479     case OPTION_MIPS64:
10480       file_mips_isa = ISA_MIPS64;
10481       break;
10482
10483     case OPTION_MTUNE:
10484       mips_set_option_string (&mips_tune_string, arg);
10485       break;
10486
10487     case OPTION_MARCH:
10488       mips_set_option_string (&mips_arch_string, arg);
10489       break;
10490
10491     case OPTION_M4650:
10492       mips_set_option_string (&mips_arch_string, "4650");
10493       mips_set_option_string (&mips_tune_string, "4650");
10494       break;
10495
10496     case OPTION_NO_M4650:
10497       break;
10498
10499     case OPTION_M4010:
10500       mips_set_option_string (&mips_arch_string, "4010");
10501       mips_set_option_string (&mips_tune_string, "4010");
10502       break;
10503
10504     case OPTION_NO_M4010:
10505       break;
10506
10507     case OPTION_M4100:
10508       mips_set_option_string (&mips_arch_string, "4100");
10509       mips_set_option_string (&mips_tune_string, "4100");
10510       break;
10511
10512     case OPTION_NO_M4100:
10513       break;
10514
10515     case OPTION_M3900:
10516       mips_set_option_string (&mips_arch_string, "3900");
10517       mips_set_option_string (&mips_tune_string, "3900");
10518       break;
10519
10520     case OPTION_NO_M3900:
10521       break;
10522
10523     case OPTION_MDMX:
10524       mips_opts.ase_mdmx = 1;
10525       break;
10526
10527     case OPTION_NO_MDMX:
10528       mips_opts.ase_mdmx = 0;
10529       break;
10530
10531     case OPTION_MIPS16:
10532       mips_opts.mips16 = 1;
10533       mips_no_prev_insn (FALSE);
10534       break;
10535
10536     case OPTION_NO_MIPS16:
10537       mips_opts.mips16 = 0;
10538       mips_no_prev_insn (FALSE);
10539       break;
10540
10541     case OPTION_MIPS3D:
10542       mips_opts.ase_mips3d = 1;
10543       break;
10544
10545     case OPTION_NO_MIPS3D:
10546       mips_opts.ase_mips3d = 0;
10547       break;
10548
10549     case OPTION_MEMBEDDED_PIC:
10550       mips_pic = EMBEDDED_PIC;
10551       if (USE_GLOBAL_POINTER_OPT && g_switch_seen)
10552         {
10553           as_bad (_("-G may not be used with embedded PIC code"));
10554           return 0;
10555         }
10556       g_switch_value = 0x7fffffff;
10557       break;
10558
10559     case OPTION_FIX_VR4122:
10560       mips_fix_4122_bugs = 1;
10561       break;
10562
10563     case OPTION_NO_FIX_VR4122:
10564       mips_fix_4122_bugs = 0;
10565       break;
10566
10567     case OPTION_RELAX_BRANCH:
10568       mips_relax_branch = 1;
10569       break;
10570
10571     case OPTION_NO_RELAX_BRANCH:
10572       mips_relax_branch = 0;
10573       break;
10574
10575 #ifdef OBJ_ELF
10576       /* When generating ELF code, we permit -KPIC and -call_shared to
10577          select SVR4_PIC, and -non_shared to select no PIC.  This is
10578          intended to be compatible with Irix 5.  */
10579     case OPTION_CALL_SHARED:
10580       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10581         {
10582           as_bad (_("-call_shared is supported only for ELF format"));
10583           return 0;
10584         }
10585       mips_pic = SVR4_PIC;
10586       if (g_switch_seen && g_switch_value != 0)
10587         {
10588           as_bad (_("-G may not be used with SVR4 PIC code"));
10589           return 0;
10590         }
10591       g_switch_value = 0;
10592       break;
10593
10594     case OPTION_NON_SHARED:
10595       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10596         {
10597           as_bad (_("-non_shared is supported only for ELF format"));
10598           return 0;
10599         }
10600       mips_pic = NO_PIC;
10601       break;
10602
10603       /* The -xgot option tells the assembler to use 32 offsets when
10604          accessing the got in SVR4_PIC mode.  It is for Irix
10605          compatibility.  */
10606     case OPTION_XGOT:
10607       mips_big_got = 1;
10608       break;
10609 #endif /* OBJ_ELF */
10610
10611     case 'G':
10612       if (! USE_GLOBAL_POINTER_OPT)
10613         {
10614           as_bad (_("-G is not supported for this configuration"));
10615           return 0;
10616         }
10617       else if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
10618         {
10619           as_bad (_("-G may not be used with SVR4 or embedded PIC code"));
10620           return 0;
10621         }
10622       else
10623         g_switch_value = atoi (arg);
10624       g_switch_seen = 1;
10625       break;
10626
10627 #ifdef OBJ_ELF
10628       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
10629          and -mabi=64.  */
10630     case OPTION_32:
10631       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10632         {
10633           as_bad (_("-32 is supported for ELF format only"));
10634           return 0;
10635         }
10636       mips_abi = O32_ABI;
10637       break;
10638
10639     case OPTION_N32:
10640       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10641         {
10642           as_bad (_("-n32 is supported for ELF format only"));
10643           return 0;
10644         }
10645       mips_abi = N32_ABI;
10646       break;
10647
10648     case OPTION_64:
10649       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10650         {
10651           as_bad (_("-64 is supported for ELF format only"));
10652           return 0;
10653         }
10654       mips_abi = N64_ABI;
10655       if (! support_64bit_objects())
10656         as_fatal (_("No compiled in support for 64 bit object file format"));
10657       break;
10658 #endif /* OBJ_ELF */
10659
10660     case OPTION_GP32:
10661       file_mips_gp32 = 1;
10662       break;
10663
10664     case OPTION_GP64:
10665       file_mips_gp32 = 0;
10666       break;
10667
10668     case OPTION_FP32:
10669       file_mips_fp32 = 1;
10670       break;
10671
10672     case OPTION_FP64:
10673       file_mips_fp32 = 0;
10674       break;
10675
10676 #ifdef OBJ_ELF
10677     case OPTION_MABI:
10678       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10679         {
10680           as_bad (_("-mabi is supported for ELF format only"));
10681           return 0;
10682         }
10683       if (strcmp (arg, "32") == 0)
10684         mips_abi = O32_ABI;
10685       else if (strcmp (arg, "o64") == 0)
10686         mips_abi = O64_ABI;
10687       else if (strcmp (arg, "n32") == 0)
10688         mips_abi = N32_ABI;
10689       else if (strcmp (arg, "64") == 0)
10690         {
10691           mips_abi = N64_ABI;
10692           if (! support_64bit_objects())
10693             as_fatal (_("No compiled in support for 64 bit object file "
10694                         "format"));
10695         }
10696       else if (strcmp (arg, "eabi") == 0)
10697         mips_abi = EABI_ABI;
10698       else
10699         {
10700           as_fatal (_("invalid abi -mabi=%s"), arg);
10701           return 0;
10702         }
10703       break;
10704 #endif /* OBJ_ELF */
10705
10706     case OPTION_M7000_HILO_FIX:
10707       mips_7000_hilo_fix = TRUE;
10708       break;
10709
10710     case OPTION_MNO_7000_HILO_FIX:
10711       mips_7000_hilo_fix = FALSE;
10712       break;
10713
10714 #ifdef OBJ_ELF
10715     case OPTION_MDEBUG:
10716       mips_flag_mdebug = TRUE;
10717       break;
10718
10719     case OPTION_NO_MDEBUG:
10720       mips_flag_mdebug = FALSE;
10721       break;
10722 #endif /* OBJ_ELF */
10723
10724     default:
10725       return 0;
10726     }
10727
10728   return 1;
10729 }
10730 \f
10731 /* Set up globals to generate code for the ISA or processor
10732    described by INFO.  */
10733
10734 static void
10735 mips_set_architecture (info)
10736      const struct mips_cpu_info *info;
10737 {
10738   if (info != 0)
10739     {
10740       mips_arch_info = info;
10741       mips_arch = info->cpu;
10742       mips_opts.isa = info->isa;
10743     }
10744 }
10745
10746
10747 /* Likewise for tuning.  */
10748
10749 static void
10750 mips_set_tune (info)
10751      const struct mips_cpu_info *info;
10752 {
10753   if (info != 0)
10754     {
10755       mips_tune_info = info;
10756       mips_tune = info->cpu;
10757     }
10758 }
10759
10760
10761 void
10762 mips_after_parse_args ()
10763 {
10764   /* GP relative stuff not working for PE */
10765   if (strncmp (TARGET_OS, "pe", 2) == 0
10766       && g_switch_value != 0)
10767     {
10768       if (g_switch_seen)
10769         as_bad (_("-G not supported in this configuration."));
10770       g_switch_value = 0;
10771     }
10772
10773   /* The following code determines the architecture and register size.
10774      Similar code was added to GCC 3.3 (see override_options() in
10775      config/mips/mips.c).  The GAS and GCC code should be kept in sync
10776      as much as possible.  */
10777
10778   if (mips_arch_string != 0)
10779     mips_set_architecture (mips_parse_cpu ("-march", mips_arch_string));
10780
10781   if (mips_tune_string != 0)
10782     mips_set_tune (mips_parse_cpu ("-mtune", mips_tune_string));
10783
10784   if (file_mips_isa != ISA_UNKNOWN)
10785     {
10786       /* Handle -mipsN.  At this point, file_mips_isa contains the
10787          ISA level specified by -mipsN, while mips_opts.isa contains
10788          the -march selection (if any).  */
10789       if (mips_arch_info != 0)
10790         {
10791           /* -march takes precedence over -mipsN, since it is more descriptive.
10792              There's no harm in specifying both as long as the ISA levels
10793              are the same.  */
10794           if (file_mips_isa != mips_opts.isa)
10795             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
10796                     mips_cpu_info_from_isa (file_mips_isa)->name,
10797                     mips_cpu_info_from_isa (mips_opts.isa)->name);
10798         }
10799       else
10800         mips_set_architecture (mips_cpu_info_from_isa (file_mips_isa));
10801     }
10802
10803   if (mips_arch_info == 0)
10804     mips_set_architecture (mips_parse_cpu ("default CPU",
10805                                            MIPS_CPU_STRING_DEFAULT));
10806
10807   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (mips_opts.isa))
10808     as_bad ("-march=%s is not compatible with the selected ABI",
10809             mips_arch_info->name);
10810
10811   /* Optimize for mips_arch, unless -mtune selects a different processor.  */
10812   if (mips_tune_info == 0)
10813     mips_set_tune (mips_arch_info);
10814
10815   if (file_mips_gp32 >= 0)
10816     {
10817       /* The user specified the size of the integer registers.  Make sure
10818          it agrees with the ABI and ISA.  */
10819       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
10820         as_bad (_("-mgp64 used with a 32-bit processor"));
10821       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
10822         as_bad (_("-mgp32 used with a 64-bit ABI"));
10823       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
10824         as_bad (_("-mgp64 used with a 32-bit ABI"));
10825     }
10826   else
10827     {
10828       /* Infer the integer register size from the ABI and processor.
10829          Restrict ourselves to 32-bit registers if that's all the
10830          processor has, or if the ABI cannot handle 64-bit registers.  */
10831       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
10832                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
10833     }
10834
10835   /* ??? GAS treats single-float processors as though they had 64-bit
10836      float registers (although it complains when double-precision
10837      instructions are used).  As things stand, saying they have 32-bit
10838      registers would lead to spurious "register must be even" messages.
10839      So here we assume float registers are always the same size as
10840      integer ones, unless the user says otherwise.  */
10841   if (file_mips_fp32 < 0)
10842     file_mips_fp32 = file_mips_gp32;
10843
10844   /* End of GCC-shared inference code.  */
10845
10846   /* ??? When do we want this flag to be set?   Who uses it?  */
10847   if (file_mips_gp32 == 1
10848       && mips_abi == NO_ABI
10849       && ISA_HAS_64BIT_REGS (mips_opts.isa))
10850     mips_32bitmode = 1;
10851
10852   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
10853     as_bad (_("trap exception not supported at ISA 1"));
10854
10855   /* If the selected architecture includes support for ASEs, enable
10856      generation of code for them.  */
10857   if (mips_opts.mips16 == -1)
10858     mips_opts.mips16 = (CPU_HAS_MIPS16 (mips_arch)) ? 1 : 0;
10859   if (mips_opts.ase_mips3d == -1)
10860     mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (mips_arch)) ? 1 : 0;
10861   if (mips_opts.ase_mdmx == -1)
10862     mips_opts.ase_mdmx = (CPU_HAS_MDMX (mips_arch)) ? 1 : 0;
10863
10864   file_mips_isa = mips_opts.isa;
10865   file_ase_mips16 = mips_opts.mips16;
10866   file_ase_mips3d = mips_opts.ase_mips3d;
10867   file_ase_mdmx = mips_opts.ase_mdmx;
10868   mips_opts.gp32 = file_mips_gp32;
10869   mips_opts.fp32 = file_mips_fp32;
10870
10871   if (mips_flag_mdebug < 0)
10872     {
10873 #ifdef OBJ_MAYBE_ECOFF
10874       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
10875         mips_flag_mdebug = 1;
10876       else
10877 #endif /* OBJ_MAYBE_ECOFF */
10878         mips_flag_mdebug = 0;
10879     }
10880 }
10881 \f
10882 void
10883 mips_init_after_args ()
10884 {
10885   /* initialize opcodes */
10886   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
10887   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
10888 }
10889
10890 long
10891 md_pcrel_from (fixP)
10892      fixS *fixP;
10893 {
10894   if (OUTPUT_FLAVOR != bfd_target_aout_flavour
10895       && fixP->fx_addsy != (symbolS *) NULL
10896       && ! S_IS_DEFINED (fixP->fx_addsy))
10897     return 4;
10898
10899   /* Return the address of the delay slot.  */
10900   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
10901 }
10902
10903 /* This is called before the symbol table is processed.  In order to
10904    work with gcc when using mips-tfile, we must keep all local labels.
10905    However, in other cases, we want to discard them.  If we were
10906    called with -g, but we didn't see any debugging information, it may
10907    mean that gcc is smuggling debugging information through to
10908    mips-tfile, in which case we must generate all local labels.  */
10909
10910 void
10911 mips_frob_file_before_adjust ()
10912 {
10913 #ifndef NO_ECOFF_DEBUGGING
10914   if (ECOFF_DEBUGGING
10915       && mips_debug != 0
10916       && ! ecoff_debugging_seen)
10917     flag_keep_locals = 1;
10918 #endif
10919 }
10920
10921 /* Sort any unmatched HI16_S relocs so that they immediately precede
10922    the corresponding LO reloc.  This is called before md_apply_fix3 and
10923    tc_gen_reloc.  Unmatched HI16_S relocs can only be generated by
10924    explicit use of the %hi modifier.  */
10925
10926 void
10927 mips_frob_file ()
10928 {
10929   struct mips_hi_fixup *l;
10930
10931   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
10932     {
10933       segment_info_type *seginfo;
10934       int pass;
10935
10936       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
10937
10938       /* If a GOT16 relocation turns out to be against a global symbol,
10939          there isn't supposed to be a matching LO.  */
10940       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
10941           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
10942         continue;
10943
10944       /* Check quickly whether the next fixup happens to be a matching %lo.  */
10945       if (fixup_has_matching_lo_p (l->fixp))
10946         continue;
10947
10948       /* Look through the fixups for this segment for a matching %lo.
10949          When we find one, move the %hi just in front of it.  We do
10950          this in two passes.  In the first pass, we try to find a
10951          unique %lo.  In the second pass, we permit multiple %hi
10952          relocs for a single %lo (this is a GNU extension).  */
10953       seginfo = seg_info (l->seg);
10954       for (pass = 0; pass < 2; pass++)
10955         {
10956           fixS *f, *prev;
10957
10958           prev = NULL;
10959           for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
10960             {
10961               /* Check whether this is a %lo fixup which matches l->fixp.  */
10962               if (f->fx_r_type == BFD_RELOC_LO16
10963                   && f->fx_addsy == l->fixp->fx_addsy
10964                   && f->fx_offset == l->fixp->fx_offset
10965                   && (pass == 1
10966                       || prev == NULL
10967                       || !reloc_needs_lo_p (prev->fx_r_type)
10968                       || !fixup_has_matching_lo_p (prev)))
10969                 {
10970                   fixS **pf;
10971
10972                   /* Move l->fixp before f.  */
10973                   for (pf = &seginfo->fix_root;
10974                        *pf != l->fixp;
10975                        pf = &(*pf)->fx_next)
10976                     assert (*pf != NULL);
10977
10978                   *pf = l->fixp->fx_next;
10979
10980                   l->fixp->fx_next = f;
10981                   if (prev == NULL)
10982                     seginfo->fix_root = l->fixp;
10983                   else
10984                     prev->fx_next = l->fixp;
10985
10986                   break;
10987                 }
10988
10989               prev = f;
10990             }
10991
10992           if (f != NULL)
10993             break;
10994
10995 #if 0 /* GCC code motion plus incomplete dead code elimination
10996          can leave a %hi without a %lo.  */
10997           if (pass == 1)
10998             as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
10999                            _("Unmatched %%hi reloc"));
11000 #endif
11001         }
11002     }
11003 }
11004
11005 /* When generating embedded PIC code we need to use a special
11006    relocation to represent the difference of two symbols in the .text
11007    section (switch tables use a difference of this sort).  See
11008    include/coff/mips.h for details.  This macro checks whether this
11009    fixup requires the special reloc.  */
11010 #define SWITCH_TABLE(fixp) \
11011   ((fixp)->fx_r_type == BFD_RELOC_32 \
11012    && OUTPUT_FLAVOR != bfd_target_elf_flavour \
11013    && (fixp)->fx_addsy != NULL \
11014    && (fixp)->fx_subsy != NULL \
11015    && S_GET_SEGMENT ((fixp)->fx_addsy) == text_section \
11016    && S_GET_SEGMENT ((fixp)->fx_subsy) == text_section)
11017
11018 /* When generating embedded PIC code we must keep all PC relative
11019    relocations, in case the linker has to relax a call.  We also need
11020    to keep relocations for switch table entries.
11021
11022    We may have combined relocations without symbols in the N32/N64 ABI.
11023    We have to prevent gas from dropping them.  */
11024
11025 int
11026 mips_force_relocation (fixp)
11027      fixS *fixp;
11028 {
11029   if (generic_force_reloc (fixp))
11030     return 1;
11031
11032   if (HAVE_NEWABI
11033       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11034       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11035           || fixp->fx_r_type == BFD_RELOC_HI16_S
11036           || fixp->fx_r_type == BFD_RELOC_LO16))
11037     return 1;
11038
11039   return (mips_pic == EMBEDDED_PIC
11040           && (fixp->fx_pcrel
11041               || SWITCH_TABLE (fixp)
11042               || fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S
11043               || fixp->fx_r_type == BFD_RELOC_PCREL_LO16));
11044 }
11045
11046 /* This hook is called before a fix is simplified.  We don't really
11047    decide whether to skip a fix here.  Rather, we turn global symbols
11048    used as branch targets into local symbols, such that they undergo
11049    simplification.  We can only do this if the symbol is defined and
11050    it is in the same section as the branch.  If this doesn't hold, we
11051    emit a better error message than just saying the relocation is not
11052    valid for the selected object format.
11053
11054    FIXP is the fix-up we're going to try to simplify, SEG is the
11055    segment in which the fix up occurs.  The return value should be
11056    non-zero to indicate the fix-up is valid for further
11057    simplifications.  */
11058
11059 int
11060 mips_validate_fix (fixP, seg)
11061      struct fix *fixP;
11062      asection *seg;
11063 {
11064   /* There's a lot of discussion on whether it should be possible to
11065      use R_MIPS_PC16 to represent branch relocations.  The outcome
11066      seems to be that it can, but gas/bfd are very broken in creating
11067      RELA relocations for this, so for now we only accept branches to
11068      symbols in the same section.  Anything else is of dubious value,
11069      since there's no guarantee that at link time the symbol would be
11070      in range.  Even for branches to local symbols this is arguably
11071      wrong, since it we assume the symbol is not going to be
11072      overridden, which should be possible per ELF library semantics,
11073      but then, there isn't a dynamic relocation that could be used to
11074      this effect, and the target would likely be out of range as well.
11075
11076      Unfortunately, it seems that there is too much code out there
11077      that relies on branches to symbols that are global to be resolved
11078      as if they were local, like the IRIX tools do, so we do it as
11079      well, but with a warning so that people are reminded to fix their
11080      code.  If we ever get back to using R_MIPS_PC16 for branch
11081      targets, this entire block should go away (and probably the
11082      whole function).  */
11083
11084   if (fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
11085       && (((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
11086             || OUTPUT_FLAVOR == bfd_target_elf_flavour)
11087            && mips_pic != EMBEDDED_PIC)
11088           || bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16_PCREL_S2) == NULL)
11089       && fixP->fx_addsy)
11090     {
11091       if (! S_IS_DEFINED (fixP->fx_addsy))
11092         {
11093           as_bad_where (fixP->fx_file, fixP->fx_line,
11094                         _("Cannot branch to undefined symbol."));
11095           /* Avoid any further errors about this fixup.  */
11096           fixP->fx_done = 1;
11097         }
11098       else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
11099         {
11100           as_bad_where (fixP->fx_file, fixP->fx_line,
11101                         _("Cannot branch to symbol in another section."));
11102           fixP->fx_done = 1;
11103         }
11104       else if (S_IS_EXTERNAL (fixP->fx_addsy))
11105         {
11106           symbolS *sym = fixP->fx_addsy;
11107
11108           as_warn_where (fixP->fx_file, fixP->fx_line,
11109                          _("Pretending global symbol used as branch target is local."));
11110
11111           fixP->fx_addsy = symbol_create (S_GET_NAME (sym),
11112                                           S_GET_SEGMENT (sym),
11113                                           S_GET_VALUE (sym),
11114                                           symbol_get_frag (sym));
11115           copy_symbol_attributes (fixP->fx_addsy, sym);
11116           S_CLEAR_EXTERNAL (fixP->fx_addsy);
11117           assert (symbol_resolved_p (sym));
11118           symbol_mark_resolved (fixP->fx_addsy);
11119         }
11120     }
11121
11122   return 1;
11123 }
11124
11125 #ifdef OBJ_ELF
11126 static int
11127 mips_need_elf_addend_fixup (fixP)
11128      fixS *fixP;
11129 {
11130   if (S_GET_OTHER (fixP->fx_addsy) == STO_MIPS16)
11131     return 1;
11132   if (mips_pic == EMBEDDED_PIC
11133       && S_IS_WEAK (fixP->fx_addsy))
11134     return 1;
11135   if (mips_pic != EMBEDDED_PIC
11136       && (S_IS_WEAK (fixP->fx_addsy)
11137           || S_IS_EXTERNAL (fixP->fx_addsy))
11138       && !S_IS_COMMON (fixP->fx_addsy))
11139     return 1;
11140   if (symbol_used_in_reloc_p (fixP->fx_addsy)
11141       && (((bfd_get_section_flags (stdoutput,
11142                                    S_GET_SEGMENT (fixP->fx_addsy))
11143             & (SEC_LINK_ONCE | SEC_MERGE)) != 0)
11144           || !strncmp (segment_name (S_GET_SEGMENT (fixP->fx_addsy)),
11145                        ".gnu.linkonce",
11146                        sizeof (".gnu.linkonce") - 1)))
11147     return 1;
11148   return 0;
11149 }
11150 #endif
11151
11152 /* Apply a fixup to the object file.  */
11153
11154 void
11155 md_apply_fix3 (fixP, valP, seg)
11156      fixS *fixP;
11157      valueT *valP;
11158      segT seg ATTRIBUTE_UNUSED;
11159 {
11160   bfd_byte *buf;
11161   long insn;
11162   valueT value;
11163   static int previous_fx_r_type = 0;
11164
11165   /* FIXME: Maybe just return for all reloc types not listed below?
11166      Eric Christopher says: "This is stupid, please rewrite md_apply_fix3. */
11167   if (fixP->fx_r_type == BFD_RELOC_8)
11168       return;
11169
11170   assert (fixP->fx_size == 4
11171           || fixP->fx_r_type == BFD_RELOC_16
11172           || fixP->fx_r_type == BFD_RELOC_32
11173           || fixP->fx_r_type == BFD_RELOC_MIPS_JMP
11174           || fixP->fx_r_type == BFD_RELOC_HI16_S
11175           || fixP->fx_r_type == BFD_RELOC_LO16
11176           || fixP->fx_r_type == BFD_RELOC_GPREL16
11177           || fixP->fx_r_type == BFD_RELOC_MIPS_LITERAL
11178           || fixP->fx_r_type == BFD_RELOC_GPREL32
11179           || fixP->fx_r_type == BFD_RELOC_64
11180           || fixP->fx_r_type == BFD_RELOC_CTOR
11181           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11182           || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHEST
11183           || fixP->fx_r_type == BFD_RELOC_MIPS_HIGHER
11184           || fixP->fx_r_type == BFD_RELOC_MIPS_SCN_DISP
11185           || fixP->fx_r_type == BFD_RELOC_MIPS_REL16
11186           || fixP->fx_r_type == BFD_RELOC_MIPS_RELGOT
11187           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11188           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11189           || fixP->fx_r_type == BFD_RELOC_MIPS_JALR);
11190
11191   value = *valP;
11192
11193   /* If we aren't adjusting this fixup to be against the section
11194      symbol, we need to adjust the value.  */
11195 #ifdef OBJ_ELF
11196   if (fixP->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour)
11197     {
11198       if (mips_need_elf_addend_fixup (fixP))
11199         {
11200           reloc_howto_type *howto;
11201           valueT symval = S_GET_VALUE (fixP->fx_addsy);
11202
11203           value -= symval;
11204
11205           howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11206           if (value != 0 && howto && howto->partial_inplace
11207               && (! fixP->fx_pcrel || howto->pcrel_offset))
11208             {
11209               /* In this case, the bfd_install_relocation routine will
11210                  incorrectly add the symbol value back in.  We just want
11211                  the addend to appear in the object file.
11212
11213                  howto->pcrel_offset is added for R_MIPS_PC16, which is
11214                  generated for code like
11215
11216                         globl g1 .text
11217                         .text
11218                         .space 20
11219                  g1:
11220                  x:
11221                         bal g1
11222                */
11223               value -= symval;
11224
11225               /* Make sure the addend is still non-zero.  If it became zero
11226                  after the last operation, set it to a spurious value and
11227                  subtract the same value from the object file's contents.  */
11228               if (value == 0)
11229                 {
11230                   value = 8;
11231
11232                   /* The in-place addends for LO16 relocations are signed;
11233                      leave the matching HI16 in-place addends as zero.  */
11234                   if (fixP->fx_r_type != BFD_RELOC_HI16_S)
11235                     {
11236                       bfd_vma contents, mask, field;
11237
11238                       contents = bfd_get_bits (fixP->fx_frag->fr_literal
11239                                                + fixP->fx_where,
11240                                                fixP->fx_size * 8,
11241                                                target_big_endian);
11242
11243                       /* MASK has bits set where the relocation should go.
11244                          FIELD is -value, shifted into the appropriate place
11245                          for this relocation.  */
11246                       mask = 1 << (howto->bitsize - 1);
11247                       mask = (((mask - 1) << 1) | 1) << howto->bitpos;
11248                       field = (-value >> howto->rightshift) << howto->bitpos;
11249
11250                       bfd_put_bits ((field & mask) | (contents & ~mask),
11251                                     fixP->fx_frag->fr_literal + fixP->fx_where,
11252                                     fixP->fx_size * 8,
11253                                     target_big_endian);
11254                     }
11255                 }
11256             }
11257         }
11258
11259       /* This code was generated using trial and error and so is
11260          fragile and not trustworthy.  If you change it, you should
11261          rerun the elf-rel, elf-rel2, and empic testcases and ensure
11262          they still pass.  */
11263       if (fixP->fx_pcrel || fixP->fx_subsy != NULL)
11264         {
11265           value += fixP->fx_frag->fr_address + fixP->fx_where;
11266
11267           /* BFD's REL handling, for MIPS, is _very_ weird.
11268              This gives the right results, but it can't possibly
11269              be the way things are supposed to work.  */
11270           if (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
11271               || S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
11272             value += fixP->fx_frag->fr_address + fixP->fx_where;
11273         }
11274     }
11275 #endif
11276
11277   fixP->fx_addnumber = value;   /* Remember value for tc_gen_reloc.  */
11278
11279   /* We are not done if this is a composite relocation to set up gp.  */
11280   if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
11281       && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11282            || (fixP->fx_r_type == BFD_RELOC_64
11283                && (previous_fx_r_type == BFD_RELOC_GPREL32
11284                    || previous_fx_r_type == BFD_RELOC_GPREL16))
11285            || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
11286                && (fixP->fx_r_type == BFD_RELOC_HI16_S
11287                    || fixP->fx_r_type == BFD_RELOC_LO16))))
11288     fixP->fx_done = 1;
11289   previous_fx_r_type = fixP->fx_r_type;
11290
11291   switch (fixP->fx_r_type)
11292     {
11293     case BFD_RELOC_MIPS_JMP:
11294     case BFD_RELOC_MIPS_SHIFT5:
11295     case BFD_RELOC_MIPS_SHIFT6:
11296     case BFD_RELOC_MIPS_GOT_DISP:
11297     case BFD_RELOC_MIPS_GOT_PAGE:
11298     case BFD_RELOC_MIPS_GOT_OFST:
11299     case BFD_RELOC_MIPS_SUB:
11300     case BFD_RELOC_MIPS_INSERT_A:
11301     case BFD_RELOC_MIPS_INSERT_B:
11302     case BFD_RELOC_MIPS_DELETE:
11303     case BFD_RELOC_MIPS_HIGHEST:
11304     case BFD_RELOC_MIPS_HIGHER:
11305     case BFD_RELOC_MIPS_SCN_DISP:
11306     case BFD_RELOC_MIPS_REL16:
11307     case BFD_RELOC_MIPS_RELGOT:
11308     case BFD_RELOC_MIPS_JALR:
11309     case BFD_RELOC_HI16:
11310     case BFD_RELOC_HI16_S:
11311     case BFD_RELOC_GPREL16:
11312     case BFD_RELOC_MIPS_LITERAL:
11313     case BFD_RELOC_MIPS_CALL16:
11314     case BFD_RELOC_MIPS_GOT16:
11315     case BFD_RELOC_GPREL32:
11316     case BFD_RELOC_MIPS_GOT_HI16:
11317     case BFD_RELOC_MIPS_GOT_LO16:
11318     case BFD_RELOC_MIPS_CALL_HI16:
11319     case BFD_RELOC_MIPS_CALL_LO16:
11320     case BFD_RELOC_MIPS16_GPREL:
11321       if (fixP->fx_pcrel)
11322         as_bad_where (fixP->fx_file, fixP->fx_line,
11323                       _("Invalid PC relative reloc"));
11324       /* Nothing needed to do. The value comes from the reloc entry */
11325       break;
11326
11327     case BFD_RELOC_MIPS16_JMP:
11328       /* We currently always generate a reloc against a symbol, which
11329          means that we don't want an addend even if the symbol is
11330          defined.  */
11331       fixP->fx_addnumber = 0;
11332       break;
11333
11334     case BFD_RELOC_PCREL_HI16_S:
11335       /* The addend for this is tricky if it is internal, so we just
11336          do everything here rather than in bfd_install_relocation.  */
11337       if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11338           && !fixP->fx_done
11339           && value != 0)
11340         break;
11341       if (fixP->fx_addsy
11342           && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11343         {
11344           /* For an external symbol adjust by the address to make it
11345              pcrel_offset.  We use the address of the RELLO reloc
11346              which follows this one.  */
11347           value += (fixP->fx_next->fx_frag->fr_address
11348                     + fixP->fx_next->fx_where);
11349         }
11350       value = ((value + 0x8000) >> 16) & 0xffff;
11351       buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11352       if (target_big_endian)
11353         buf += 2;
11354       md_number_to_chars ((char *) buf, value, 2);
11355       break;
11356
11357     case BFD_RELOC_PCREL_LO16:
11358       /* The addend for this is tricky if it is internal, so we just
11359          do everything here rather than in bfd_install_relocation.  */
11360       if (OUTPUT_FLAVOR == bfd_target_elf_flavour
11361           && !fixP->fx_done
11362           && value != 0)
11363         break;
11364       if (fixP->fx_addsy
11365           && (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_SECTION_SYM) == 0)
11366         value += fixP->fx_frag->fr_address + fixP->fx_where;
11367       buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11368       if (target_big_endian)
11369         buf += 2;
11370       md_number_to_chars ((char *) buf, value, 2);
11371       break;
11372
11373     case BFD_RELOC_64:
11374       /* This is handled like BFD_RELOC_32, but we output a sign
11375          extended value if we are only 32 bits.  */
11376       if (fixP->fx_done
11377           || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11378         {
11379           if (8 <= sizeof (valueT))
11380             md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11381                                 value, 8);
11382           else
11383             {
11384               long w1, w2;
11385               long hiv;
11386
11387               w1 = w2 = fixP->fx_where;
11388               if (target_big_endian)
11389                 w1 += 4;
11390               else
11391                 w2 += 4;
11392               md_number_to_chars (fixP->fx_frag->fr_literal + w1, value, 4);
11393               if ((value & 0x80000000) != 0)
11394                 hiv = 0xffffffff;
11395               else
11396                 hiv = 0;
11397               md_number_to_chars (fixP->fx_frag->fr_literal + w2, hiv, 4);
11398             }
11399         }
11400       break;
11401
11402     case BFD_RELOC_RVA:
11403     case BFD_RELOC_32:
11404       /* If we are deleting this reloc entry, we must fill in the
11405          value now.  This can happen if we have a .word which is not
11406          resolved when it appears but is later defined.  We also need
11407          to fill in the value if this is an embedded PIC switch table
11408          entry.  */
11409       if (fixP->fx_done
11410           || (mips_pic == EMBEDDED_PIC && SWITCH_TABLE (fixP)))
11411         md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11412                             value, 4);
11413       break;
11414
11415     case BFD_RELOC_16:
11416       /* If we are deleting this reloc entry, we must fill in the
11417          value now.  */
11418       assert (fixP->fx_size == 2);
11419       if (fixP->fx_done)
11420         md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
11421                             value, 2);
11422       break;
11423
11424     case BFD_RELOC_LO16:
11425       /* When handling an embedded PIC switch statement, we can wind
11426          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11427       if (fixP->fx_done)
11428         {
11429           if (value + 0x8000 > 0xffff)
11430             as_bad_where (fixP->fx_file, fixP->fx_line,
11431                           _("relocation overflow"));
11432           buf = (bfd_byte *) fixP->fx_frag->fr_literal + fixP->fx_where;
11433           if (target_big_endian)
11434             buf += 2;
11435           md_number_to_chars ((char *) buf, value, 2);
11436         }
11437       break;
11438
11439     case BFD_RELOC_16_PCREL_S2:
11440       if ((value & 0x3) != 0)
11441         as_bad_where (fixP->fx_file, fixP->fx_line,
11442                       _("Branch to odd address (%lx)"), (long) value);
11443
11444       /*
11445        * We need to save the bits in the instruction since fixup_segment()
11446        * might be deleting the relocation entry (i.e., a branch within
11447        * the current segment).
11448        */
11449       if (!fixP->fx_done && (value != 0 || HAVE_NEWABI))
11450         break;
11451       /* If 'value' is zero, the remaining reloc code won't actually
11452          do the store, so it must be done here.  This is probably
11453          a bug somewhere.  */
11454       if (!fixP->fx_done
11455           && (fixP->fx_r_type != BFD_RELOC_16_PCREL_S2
11456               || fixP->fx_addsy == NULL                 /* ??? */
11457               || ! S_IS_DEFINED (fixP->fx_addsy)))
11458         value -= fixP->fx_frag->fr_address + fixP->fx_where;
11459
11460       value = (offsetT) value >> 2;
11461
11462       /* update old instruction data */
11463       buf = (bfd_byte *) (fixP->fx_where + fixP->fx_frag->fr_literal);
11464       if (target_big_endian)
11465         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11466       else
11467         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11468
11469       if (value + 0x8000 <= 0xffff)
11470         insn |= value & 0xffff;
11471       else
11472         {
11473           /* The branch offset is too large.  If this is an
11474              unconditional branch, and we are not generating PIC code,
11475              we can convert it to an absolute jump instruction.  */
11476           if (mips_pic == NO_PIC
11477               && fixP->fx_done
11478               && fixP->fx_frag->fr_address >= text_section->vma
11479               && (fixP->fx_frag->fr_address
11480                   < text_section->vma + text_section->_raw_size)
11481               && ((insn & 0xffff0000) == 0x10000000      /* beq $0,$0 */
11482                   || (insn & 0xffff0000) == 0x04010000   /* bgez $0 */
11483                   || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11484             {
11485               if ((insn & 0xffff0000) == 0x04110000)     /* bgezal $0 */
11486                 insn = 0x0c000000;      /* jal */
11487               else
11488                 insn = 0x08000000;      /* j */
11489               fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11490               fixP->fx_done = 0;
11491               fixP->fx_addsy = section_symbol (text_section);
11492               fixP->fx_addnumber = (value << 2) + md_pcrel_from (fixP);
11493             }
11494           else
11495             {
11496               /* If we got here, we have branch-relaxation disabled,
11497                  and there's nothing we can do to fix this instruction
11498                  without turning it into a longer sequence.  */
11499               as_bad_where (fixP->fx_file, fixP->fx_line,
11500                             _("Branch out of range"));
11501             }
11502         }
11503
11504       md_number_to_chars ((char *) buf, (valueT) insn, 4);
11505       break;
11506
11507     case BFD_RELOC_VTABLE_INHERIT:
11508       fixP->fx_done = 0;
11509       if (fixP->fx_addsy
11510           && !S_IS_DEFINED (fixP->fx_addsy)
11511           && !S_IS_WEAK (fixP->fx_addsy))
11512         S_SET_WEAK (fixP->fx_addsy);
11513       break;
11514
11515     case BFD_RELOC_VTABLE_ENTRY:
11516       fixP->fx_done = 0;
11517       break;
11518
11519     default:
11520       internalError ();
11521     }
11522 }
11523
11524 #if 0
11525 void
11526 printInsn (oc)
11527      unsigned long oc;
11528 {
11529   const struct mips_opcode *p;
11530   int treg, sreg, dreg, shamt;
11531   short imm;
11532   const char *args;
11533   int i;
11534
11535   for (i = 0; i < NUMOPCODES; ++i)
11536     {
11537       p = &mips_opcodes[i];
11538       if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
11539         {
11540           printf ("%08lx %s\t", oc, p->name);
11541           treg = (oc >> 16) & 0x1f;
11542           sreg = (oc >> 21) & 0x1f;
11543           dreg = (oc >> 11) & 0x1f;
11544           shamt = (oc >> 6) & 0x1f;
11545           imm = oc;
11546           for (args = p->args;; ++args)
11547             {
11548               switch (*args)
11549                 {
11550                 case '\0':
11551                   printf ("\n");
11552                   break;
11553
11554                 case ',':
11555                 case '(':
11556                 case ')':
11557                   printf ("%c", *args);
11558                   continue;
11559
11560                 case 'r':
11561                   assert (treg == sreg);
11562                   printf ("$%d,$%d", treg, sreg);
11563                   continue;
11564
11565                 case 'd':
11566                 case 'G':
11567                   printf ("$%d", dreg);
11568                   continue;
11569
11570                 case 't':
11571                 case 'E':
11572                   printf ("$%d", treg);
11573                   continue;
11574
11575                 case 'k':
11576                   printf ("0x%x", treg);
11577                   continue;
11578
11579                 case 'b':
11580                 case 's':
11581                   printf ("$%d", sreg);
11582                   continue;
11583
11584                 case 'a':
11585                   printf ("0x%08lx", oc & 0x1ffffff);
11586                   continue;
11587
11588                 case 'i':
11589                 case 'j':
11590                 case 'o':
11591                 case 'u':
11592                   printf ("%d", imm);
11593                   continue;
11594
11595                 case '<':
11596                 case '>':
11597                   printf ("$%d", shamt);
11598                   continue;
11599
11600                 default:
11601                   internalError ();
11602                 }
11603               break;
11604             }
11605           return;
11606         }
11607     }
11608   printf (_("%08lx  UNDEFINED\n"), oc);
11609 }
11610 #endif
11611
11612 static symbolS *
11613 get_symbol ()
11614 {
11615   int c;
11616   char *name;
11617   symbolS *p;
11618
11619   name = input_line_pointer;
11620   c = get_symbol_end ();
11621   p = (symbolS *) symbol_find_or_make (name);
11622   *input_line_pointer = c;
11623   return p;
11624 }
11625
11626 /* Align the current frag to a given power of two.  The MIPS assembler
11627    also automatically adjusts any preceding label.  */
11628
11629 static void
11630 mips_align (to, fill, label)
11631      int to;
11632      int fill;
11633      symbolS *label;
11634 {
11635   mips_emit_delays (FALSE);
11636   frag_align (to, fill, 0);
11637   record_alignment (now_seg, to);
11638   if (label != NULL)
11639     {
11640       assert (S_GET_SEGMENT (label) == now_seg);
11641       symbol_set_frag (label, frag_now);
11642       S_SET_VALUE (label, (valueT) frag_now_fix ());
11643     }
11644 }
11645
11646 /* Align to a given power of two.  .align 0 turns off the automatic
11647    alignment used by the data creating pseudo-ops.  */
11648
11649 static void
11650 s_align (x)
11651      int x ATTRIBUTE_UNUSED;
11652 {
11653   register int temp;
11654   register long temp_fill;
11655   long max_alignment = 15;
11656
11657   /*
11658
11659     o  Note that the assembler pulls down any immediately preceeding label
11660        to the aligned address.
11661     o  It's not documented but auto alignment is reinstated by
11662        a .align pseudo instruction.
11663     o  Note also that after auto alignment is turned off the mips assembler
11664        issues an error on attempt to assemble an improperly aligned data item.
11665        We don't.
11666
11667     */
11668
11669   temp = get_absolute_expression ();
11670   if (temp > max_alignment)
11671     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11672   else if (temp < 0)
11673     {
11674       as_warn (_("Alignment negative: 0 assumed."));
11675       temp = 0;
11676     }
11677   if (*input_line_pointer == ',')
11678     {
11679       ++input_line_pointer;
11680       temp_fill = get_absolute_expression ();
11681     }
11682   else
11683     temp_fill = 0;
11684   if (temp)
11685     {
11686       auto_align = 1;
11687       mips_align (temp, (int) temp_fill,
11688                   insn_labels != NULL ? insn_labels->label : NULL);
11689     }
11690   else
11691     {
11692       auto_align = 0;
11693     }
11694
11695   demand_empty_rest_of_line ();
11696 }
11697
11698 void
11699 mips_flush_pending_output ()
11700 {
11701   mips_emit_delays (FALSE);
11702   mips_clear_insn_labels ();
11703 }
11704
11705 static void
11706 s_change_sec (sec)
11707      int sec;
11708 {
11709   segT seg;
11710
11711   /* When generating embedded PIC code, we only use the .text, .lit8,
11712      .sdata and .sbss sections.  We change the .data and .rdata
11713      pseudo-ops to use .sdata.  */
11714   if (mips_pic == EMBEDDED_PIC
11715       && (sec == 'd' || sec == 'r'))
11716     sec = 's';
11717
11718 #ifdef OBJ_ELF
11719   /* The ELF backend needs to know that we are changing sections, so
11720      that .previous works correctly.  We could do something like check
11721      for an obj_section_change_hook macro, but that might be confusing
11722      as it would not be appropriate to use it in the section changing
11723      functions in read.c, since obj-elf.c intercepts those.  FIXME:
11724      This should be cleaner, somehow.  */
11725   obj_elf_section_change_hook ();
11726 #endif
11727
11728   mips_emit_delays (FALSE);
11729   switch (sec)
11730     {
11731     case 't':
11732       s_text (0);
11733       break;
11734     case 'd':
11735       s_data (0);
11736       break;
11737     case 'b':
11738       subseg_set (bss_section, (subsegT) get_absolute_expression ());
11739       demand_empty_rest_of_line ();
11740       break;
11741
11742     case 'r':
11743       if (USE_GLOBAL_POINTER_OPT)
11744         {
11745           seg = subseg_new (RDATA_SECTION_NAME,
11746                             (subsegT) get_absolute_expression ());
11747           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11748             {
11749               bfd_set_section_flags (stdoutput, seg,
11750                                      (SEC_ALLOC
11751                                       | SEC_LOAD
11752                                       | SEC_READONLY
11753                                       | SEC_RELOC
11754                                       | SEC_DATA));
11755               if (strcmp (TARGET_OS, "elf") != 0)
11756                 record_alignment (seg, 4);
11757             }
11758           demand_empty_rest_of_line ();
11759         }
11760       else
11761         {
11762           as_bad (_("No read only data section in this object file format"));
11763           demand_empty_rest_of_line ();
11764           return;
11765         }
11766       break;
11767
11768     case 's':
11769       if (USE_GLOBAL_POINTER_OPT)
11770         {
11771           seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11772           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11773             {
11774               bfd_set_section_flags (stdoutput, seg,
11775                                      SEC_ALLOC | SEC_LOAD | SEC_RELOC
11776                                      | SEC_DATA);
11777               if (strcmp (TARGET_OS, "elf") != 0)
11778                 record_alignment (seg, 4);
11779             }
11780           demand_empty_rest_of_line ();
11781           break;
11782         }
11783       else
11784         {
11785           as_bad (_("Global pointers not supported; recompile -G 0"));
11786           demand_empty_rest_of_line ();
11787           return;
11788         }
11789     }
11790
11791   auto_align = 1;
11792 }
11793
11794 void
11795 s_change_section (ignore)
11796      int ignore ATTRIBUTE_UNUSED;
11797 {
11798 #ifdef OBJ_ELF
11799   char *section_name;
11800   char c;
11801   char next_c;
11802   int section_type;
11803   int section_flag;
11804   int section_entry_size;
11805   int section_alignment;
11806
11807   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11808     return;
11809
11810   section_name = input_line_pointer;
11811   c = get_symbol_end ();
11812   if (c)
11813     next_c = *(input_line_pointer + 1);
11814
11815   /* Do we have .section Name<,"flags">?  */
11816   if (c != ',' || (c == ',' && next_c == '"'))
11817     {
11818       /* just after name is now '\0'.  */
11819       *input_line_pointer = c;
11820       input_line_pointer = section_name;
11821       obj_elf_section (ignore);
11822       return;
11823     }
11824   input_line_pointer++;
11825
11826   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
11827   if (c == ',')
11828     section_type = get_absolute_expression ();
11829   else
11830     section_type = 0;
11831   if (*input_line_pointer++ == ',')
11832     section_flag = get_absolute_expression ();
11833   else
11834     section_flag = 0;
11835   if (*input_line_pointer++ == ',')
11836     section_entry_size = get_absolute_expression ();
11837   else
11838     section_entry_size = 0;
11839   if (*input_line_pointer++ == ',')
11840     section_alignment = get_absolute_expression ();
11841   else
11842     section_alignment = 0;
11843
11844   section_name = xstrdup (section_name);
11845
11846   obj_elf_change_section (section_name, section_type, section_flag,
11847                           section_entry_size, 0, 0, 0);
11848
11849   if (now_seg->name != section_name)
11850     free (section_name);
11851 #endif /* OBJ_ELF */
11852 }
11853
11854 void
11855 mips_enable_auto_align ()
11856 {
11857   auto_align = 1;
11858 }
11859
11860 static void
11861 s_cons (log_size)
11862      int log_size;
11863 {
11864   symbolS *label;
11865
11866   label = insn_labels != NULL ? insn_labels->label : NULL;
11867   mips_emit_delays (FALSE);
11868   if (log_size > 0 && auto_align)
11869     mips_align (log_size, 0, label);
11870   mips_clear_insn_labels ();
11871   cons (1 << log_size);
11872 }
11873
11874 static void
11875 s_float_cons (type)
11876      int type;
11877 {
11878   symbolS *label;
11879
11880   label = insn_labels != NULL ? insn_labels->label : NULL;
11881
11882   mips_emit_delays (FALSE);
11883
11884   if (auto_align)
11885     {
11886       if (type == 'd')
11887         mips_align (3, 0, label);
11888       else
11889         mips_align (2, 0, label);
11890     }
11891
11892   mips_clear_insn_labels ();
11893
11894   float_cons (type);
11895 }
11896
11897 /* Handle .globl.  We need to override it because on Irix 5 you are
11898    permitted to say
11899        .globl foo .text
11900    where foo is an undefined symbol, to mean that foo should be
11901    considered to be the address of a function.  */
11902
11903 static void
11904 s_mips_globl (x)
11905      int x ATTRIBUTE_UNUSED;
11906 {
11907   char *name;
11908   int c;
11909   symbolS *symbolP;
11910   flagword flag;
11911
11912   name = input_line_pointer;
11913   c = get_symbol_end ();
11914   symbolP = symbol_find_or_make (name);
11915   *input_line_pointer = c;
11916   SKIP_WHITESPACE ();
11917
11918   /* On Irix 5, every global symbol that is not explicitly labelled as
11919      being a function is apparently labelled as being an object.  */
11920   flag = BSF_OBJECT;
11921
11922   if (! is_end_of_line[(unsigned char) *input_line_pointer])
11923     {
11924       char *secname;
11925       asection *sec;
11926
11927       secname = input_line_pointer;
11928       c = get_symbol_end ();
11929       sec = bfd_get_section_by_name (stdoutput, secname);
11930       if (sec == NULL)
11931         as_bad (_("%s: no such section"), secname);
11932       *input_line_pointer = c;
11933
11934       if (sec != NULL && (sec->flags & SEC_CODE) != 0)
11935         flag = BSF_FUNCTION;
11936     }
11937
11938   symbol_get_bfdsym (symbolP)->flags |= flag;
11939
11940   S_SET_EXTERNAL (symbolP);
11941   demand_empty_rest_of_line ();
11942 }
11943
11944 static void
11945 s_option (x)
11946      int x ATTRIBUTE_UNUSED;
11947 {
11948   char *opt;
11949   char c;
11950
11951   opt = input_line_pointer;
11952   c = get_symbol_end ();
11953
11954   if (*opt == 'O')
11955     {
11956       /* FIXME: What does this mean?  */
11957     }
11958   else if (strncmp (opt, "pic", 3) == 0)
11959     {
11960       int i;
11961
11962       i = atoi (opt + 3);
11963       if (i == 0)
11964         mips_pic = NO_PIC;
11965       else if (i == 2)
11966         mips_pic = SVR4_PIC;
11967       else
11968         as_bad (_(".option pic%d not supported"), i);
11969
11970       if (USE_GLOBAL_POINTER_OPT && mips_pic == SVR4_PIC)
11971         {
11972           if (g_switch_seen && g_switch_value != 0)
11973             as_warn (_("-G may not be used with SVR4 PIC code"));
11974           g_switch_value = 0;
11975           bfd_set_gp_size (stdoutput, 0);
11976         }
11977     }
11978   else
11979     as_warn (_("Unrecognized option \"%s\""), opt);
11980
11981   *input_line_pointer = c;
11982   demand_empty_rest_of_line ();
11983 }
11984
11985 /* This structure is used to hold a stack of .set values.  */
11986
11987 struct mips_option_stack
11988 {
11989   struct mips_option_stack *next;
11990   struct mips_set_options options;
11991 };
11992
11993 static struct mips_option_stack *mips_opts_stack;
11994
11995 /* Handle the .set pseudo-op.  */
11996
11997 static void
11998 s_mipsset (x)
11999      int x ATTRIBUTE_UNUSED;
12000 {
12001   char *name = input_line_pointer, ch;
12002
12003   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12004     ++input_line_pointer;
12005   ch = *input_line_pointer;
12006   *input_line_pointer = '\0';
12007
12008   if (strcmp (name, "reorder") == 0)
12009     {
12010       if (mips_opts.noreorder && prev_nop_frag != NULL)
12011         {
12012           /* If we still have pending nops, we can discard them.  The
12013              usual nop handling will insert any that are still
12014              needed.  */
12015           prev_nop_frag->fr_fix -= (prev_nop_frag_holds
12016                                     * (mips_opts.mips16 ? 2 : 4));
12017           prev_nop_frag = NULL;
12018         }
12019       mips_opts.noreorder = 0;
12020     }
12021   else if (strcmp (name, "noreorder") == 0)
12022     {
12023       mips_emit_delays (TRUE);
12024       mips_opts.noreorder = 1;
12025       mips_any_noreorder = 1;
12026     }
12027   else if (strcmp (name, "at") == 0)
12028     {
12029       mips_opts.noat = 0;
12030     }
12031   else if (strcmp (name, "noat") == 0)
12032     {
12033       mips_opts.noat = 1;
12034     }
12035   else if (strcmp (name, "macro") == 0)
12036     {
12037       mips_opts.warn_about_macros = 0;
12038     }
12039   else if (strcmp (name, "nomacro") == 0)
12040     {
12041       if (mips_opts.noreorder == 0)
12042         as_bad (_("`noreorder' must be set before `nomacro'"));
12043       mips_opts.warn_about_macros = 1;
12044     }
12045   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12046     {
12047       mips_opts.nomove = 0;
12048     }
12049   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12050     {
12051       mips_opts.nomove = 1;
12052     }
12053   else if (strcmp (name, "bopt") == 0)
12054     {
12055       mips_opts.nobopt = 0;
12056     }
12057   else if (strcmp (name, "nobopt") == 0)
12058     {
12059       mips_opts.nobopt = 1;
12060     }
12061   else if (strcmp (name, "mips16") == 0
12062            || strcmp (name, "MIPS-16") == 0)
12063     mips_opts.mips16 = 1;
12064   else if (strcmp (name, "nomips16") == 0
12065            || strcmp (name, "noMIPS-16") == 0)
12066     mips_opts.mips16 = 0;
12067   else if (strcmp (name, "mips3d") == 0)
12068     mips_opts.ase_mips3d = 1;
12069   else if (strcmp (name, "nomips3d") == 0)
12070     mips_opts.ase_mips3d = 0;
12071   else if (strcmp (name, "mdmx") == 0)
12072     mips_opts.ase_mdmx = 1;
12073   else if (strcmp (name, "nomdmx") == 0)
12074     mips_opts.ase_mdmx = 0;
12075   else if (strncmp (name, "mips", 4) == 0)
12076     {
12077       int reset = 0;
12078
12079       /* Permit the user to change the ISA on the fly.  Needless to
12080          say, misuse can cause serious problems.  */
12081       if (strcmp (name, "mips0") == 0)
12082         {
12083           reset = 1;
12084           mips_opts.isa = file_mips_isa;
12085         }
12086       else if (strcmp (name, "mips1") == 0)
12087         mips_opts.isa = ISA_MIPS1;
12088       else if (strcmp (name, "mips2") == 0)
12089         mips_opts.isa = ISA_MIPS2;
12090       else if (strcmp (name, "mips3") == 0)
12091         mips_opts.isa = ISA_MIPS3;
12092       else if (strcmp (name, "mips4") == 0)
12093         mips_opts.isa = ISA_MIPS4;
12094       else if (strcmp (name, "mips5") == 0)
12095         mips_opts.isa = ISA_MIPS5;
12096       else if (strcmp (name, "mips32") == 0)
12097         mips_opts.isa = ISA_MIPS32;
12098       else if (strcmp (name, "mips32r2") == 0)
12099         mips_opts.isa = ISA_MIPS32R2;
12100       else if (strcmp (name, "mips64") == 0)
12101         mips_opts.isa = ISA_MIPS64;
12102       else
12103         as_bad (_("unknown ISA level %s"), name + 4);
12104
12105       switch (mips_opts.isa)
12106         {
12107         case  0:
12108           break;
12109         case ISA_MIPS1:
12110         case ISA_MIPS2:
12111         case ISA_MIPS32:
12112         case ISA_MIPS32R2:
12113           mips_opts.gp32 = 1;
12114           mips_opts.fp32 = 1;
12115           break;
12116         case ISA_MIPS3:
12117         case ISA_MIPS4:
12118         case ISA_MIPS5:
12119         case ISA_MIPS64:
12120           mips_opts.gp32 = 0;
12121           mips_opts.fp32 = 0;
12122           break;
12123         default:
12124           as_bad (_("unknown ISA level %s"), name + 4);
12125           break;
12126         }
12127       if (reset)
12128         {
12129           mips_opts.gp32 = file_mips_gp32;
12130           mips_opts.fp32 = file_mips_fp32;
12131         }
12132     }
12133   else if (strcmp (name, "autoextend") == 0)
12134     mips_opts.noautoextend = 0;
12135   else if (strcmp (name, "noautoextend") == 0)
12136     mips_opts.noautoextend = 1;
12137   else if (strcmp (name, "push") == 0)
12138     {
12139       struct mips_option_stack *s;
12140
12141       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12142       s->next = mips_opts_stack;
12143       s->options = mips_opts;
12144       mips_opts_stack = s;
12145     }
12146   else if (strcmp (name, "pop") == 0)
12147     {
12148       struct mips_option_stack *s;
12149
12150       s = mips_opts_stack;
12151       if (s == NULL)
12152         as_bad (_(".set pop with no .set push"));
12153       else
12154         {
12155           /* If we're changing the reorder mode we need to handle
12156              delay slots correctly.  */
12157           if (s->options.noreorder && ! mips_opts.noreorder)
12158             mips_emit_delays (TRUE);
12159           else if (! s->options.noreorder && mips_opts.noreorder)
12160             {
12161               if (prev_nop_frag != NULL)
12162                 {
12163                   prev_nop_frag->fr_fix -= (prev_nop_frag_holds
12164                                             * (mips_opts.mips16 ? 2 : 4));
12165                   prev_nop_frag = NULL;
12166                 }
12167             }
12168
12169           mips_opts = s->options;
12170           mips_opts_stack = s->next;
12171           free (s);
12172         }
12173     }
12174   else
12175     {
12176       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12177     }
12178   *input_line_pointer = ch;
12179   demand_empty_rest_of_line ();
12180 }
12181
12182 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12183    .option pic2.  It means to generate SVR4 PIC calls.  */
12184
12185 static void
12186 s_abicalls (ignore)
12187      int ignore ATTRIBUTE_UNUSED;
12188 {
12189   mips_pic = SVR4_PIC;
12190   if (USE_GLOBAL_POINTER_OPT)
12191     {
12192       if (g_switch_seen && g_switch_value != 0)
12193         as_warn (_("-G may not be used with SVR4 PIC code"));
12194       g_switch_value = 0;
12195     }
12196   bfd_set_gp_size (stdoutput, 0);
12197   demand_empty_rest_of_line ();
12198 }
12199
12200 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12201    PIC code.  It sets the $gp register for the function based on the
12202    function address, which is in the register named in the argument.
12203    This uses a relocation against _gp_disp, which is handled specially
12204    by the linker.  The result is:
12205         lui     $gp,%hi(_gp_disp)
12206         addiu   $gp,$gp,%lo(_gp_disp)
12207         addu    $gp,$gp,.cpload argument
12208    The .cpload argument is normally $25 == $t9.  */
12209
12210 static void
12211 s_cpload (ignore)
12212      int ignore ATTRIBUTE_UNUSED;
12213 {
12214   expressionS ex;
12215   int icnt = 0;
12216
12217   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12218      .cpload is ignored.  */
12219   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12220     {
12221       s_ignore (0);
12222       return;
12223     }
12224
12225   /* .cpload should be in a .set noreorder section.  */
12226   if (mips_opts.noreorder == 0)
12227     as_warn (_(".cpload not in noreorder section"));
12228
12229   ex.X_op = O_symbol;
12230   ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
12231   ex.X_op_symbol = NULL;
12232   ex.X_add_number = 0;
12233
12234   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12235   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12236
12237   macro_build_lui (NULL, &icnt, &ex, mips_gp_register);
12238   macro_build ((char *) NULL, &icnt, &ex, "addiu", "t,r,j",
12239                mips_gp_register, mips_gp_register, (int) BFD_RELOC_LO16);
12240
12241   macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "addu", "d,v,t",
12242                mips_gp_register, mips_gp_register, tc_get_register (0));
12243
12244   demand_empty_rest_of_line ();
12245 }
12246
12247 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
12248      .cpsetup $reg1, offset|$reg2, label
12249
12250    If offset is given, this results in:
12251      sd         $gp, offset($sp)
12252      lui        $gp, %hi(%neg(%gp_rel(label)))
12253      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12254      daddu      $gp, $gp, $reg1
12255
12256    If $reg2 is given, this results in:
12257      daddu      $reg2, $gp, $0
12258      lui        $gp, %hi(%neg(%gp_rel(label)))
12259      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12260      daddu      $gp, $gp, $reg1
12261    $reg1 is normally $25 == $t9.  */
12262 static void
12263 s_cpsetup (ignore)
12264      int ignore ATTRIBUTE_UNUSED;
12265 {
12266   expressionS ex_off;
12267   expressionS ex_sym;
12268   int reg1;
12269   int icnt = 0;
12270   char *f;
12271
12272   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12273      We also need NewABI support.  */
12274   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12275     {
12276       s_ignore (0);
12277       return;
12278     }
12279
12280   reg1 = tc_get_register (0);
12281   SKIP_WHITESPACE ();
12282   if (*input_line_pointer != ',')
12283     {
12284       as_bad (_("missing argument separator ',' for .cpsetup"));
12285       return;
12286     }
12287   else
12288     ++input_line_pointer;
12289   SKIP_WHITESPACE ();
12290   if (*input_line_pointer == '$')
12291     {
12292       mips_cpreturn_register = tc_get_register (0);
12293       mips_cpreturn_offset = -1;
12294     }
12295   else
12296     {
12297       mips_cpreturn_offset = get_absolute_expression ();
12298       mips_cpreturn_register = -1;
12299     }
12300   SKIP_WHITESPACE ();
12301   if (*input_line_pointer != ',')
12302     {
12303       as_bad (_("missing argument separator ',' for .cpsetup"));
12304       return;
12305     }
12306   else
12307     ++input_line_pointer;
12308   SKIP_WHITESPACE ();
12309   expression (&ex_sym);
12310
12311   if (mips_cpreturn_register == -1)
12312     {
12313       ex_off.X_op = O_constant;
12314       ex_off.X_add_symbol = NULL;
12315       ex_off.X_op_symbol = NULL;
12316       ex_off.X_add_number = mips_cpreturn_offset;
12317
12318       macro_build ((char *) NULL, &icnt, &ex_off, "sd", "t,o(b)",
12319                    mips_gp_register, (int) BFD_RELOC_LO16, SP);
12320     }
12321   else
12322     macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12323                  "d,v,t", mips_cpreturn_register, mips_gp_register, 0);
12324
12325   /* Ensure there's room for the next two instructions, so that `f'
12326      doesn't end up with an address in the wrong frag.  */
12327   frag_grow (8);
12328   f = frag_more (0);
12329   macro_build ((char *) NULL, &icnt, &ex_sym, "lui", "t,u", mips_gp_register,
12330                (int) BFD_RELOC_GPREL16);
12331   fix_new (frag_now, f - frag_now->fr_literal,
12332            0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12333   fix_new (frag_now, f - frag_now->fr_literal,
12334            0, NULL, 0, 0, BFD_RELOC_HI16_S);
12335
12336   f = frag_more (0);
12337   macro_build ((char *) NULL, &icnt, &ex_sym, "addiu", "t,r,j",
12338                mips_gp_register, mips_gp_register, (int) BFD_RELOC_GPREL16);
12339   fix_new (frag_now, f - frag_now->fr_literal,
12340            0, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
12341   fix_new (frag_now, f - frag_now->fr_literal,
12342            0, NULL, 0, 0, BFD_RELOC_LO16);
12343
12344   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
12345                HAVE_64BIT_ADDRESSES ? "daddu" : "addu", "d,v,t",
12346                mips_gp_register, mips_gp_register, reg1);
12347
12348   demand_empty_rest_of_line ();
12349 }
12350
12351 static void
12352 s_cplocal (ignore)
12353      int ignore ATTRIBUTE_UNUSED;
12354 {
12355   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12356    .cplocal is ignored.  */
12357   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12358     {
12359       s_ignore (0);
12360       return;
12361     }
12362
12363   mips_gp_register = tc_get_register (0);
12364   demand_empty_rest_of_line ();
12365 }
12366
12367 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
12368    offset from $sp.  The offset is remembered, and after making a PIC
12369    call $gp is restored from that location.  */
12370
12371 static void
12372 s_cprestore (ignore)
12373      int ignore ATTRIBUTE_UNUSED;
12374 {
12375   expressionS ex;
12376   int icnt = 0;
12377
12378   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12379      .cprestore is ignored.  */
12380   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12381     {
12382       s_ignore (0);
12383       return;
12384     }
12385
12386   mips_cprestore_offset = get_absolute_expression ();
12387   mips_cprestore_valid = 1;
12388
12389   ex.X_op = O_constant;
12390   ex.X_add_symbol = NULL;
12391   ex.X_op_symbol = NULL;
12392   ex.X_add_number = mips_cprestore_offset;
12393
12394   macro_build_ldst_constoffset ((char *) NULL, &icnt, &ex,
12395                                 HAVE_32BIT_ADDRESSES ? "sw" : "sd",
12396                                 mips_gp_register, SP);
12397
12398   demand_empty_rest_of_line ();
12399 }
12400
12401 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12402    was given in the preceeding .gpsetup, it results in:
12403      ld         $gp, offset($sp)
12404
12405    If a register $reg2 was given there, it results in:
12406      daddiu     $gp, $gp, $reg2
12407  */
12408 static void
12409 s_cpreturn (ignore)
12410      int ignore ATTRIBUTE_UNUSED;
12411 {
12412   expressionS ex;
12413   int icnt = 0;
12414
12415   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12416      We also need NewABI support.  */
12417   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12418     {
12419       s_ignore (0);
12420       return;
12421     }
12422
12423   if (mips_cpreturn_register == -1)
12424     {
12425       ex.X_op = O_constant;
12426       ex.X_add_symbol = NULL;
12427       ex.X_op_symbol = NULL;
12428       ex.X_add_number = mips_cpreturn_offset;
12429
12430       macro_build ((char *) NULL, &icnt, &ex, "ld", "t,o(b)",
12431                    mips_gp_register, (int) BFD_RELOC_LO16, SP);
12432     }
12433   else
12434     macro_build ((char *) NULL, &icnt, (expressionS *) NULL, "daddu",
12435                  "d,v,t", mips_gp_register, mips_cpreturn_register, 0);
12436
12437   demand_empty_rest_of_line ();
12438 }
12439
12440 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12441    code.  It sets the offset to use in gp_rel relocations.  */
12442
12443 static void
12444 s_gpvalue (ignore)
12445      int ignore ATTRIBUTE_UNUSED;
12446 {
12447   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12448      We also need NewABI support.  */
12449   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12450     {
12451       s_ignore (0);
12452       return;
12453     }
12454
12455   mips_gprel_offset = get_absolute_expression ();
12456
12457   demand_empty_rest_of_line ();
12458 }
12459
12460 /* Handle the .gpword pseudo-op.  This is used when generating PIC
12461    code.  It generates a 32 bit GP relative reloc.  */
12462
12463 static void
12464 s_gpword (ignore)
12465      int ignore ATTRIBUTE_UNUSED;
12466 {
12467   symbolS *label;
12468   expressionS ex;
12469   char *p;
12470
12471   /* When not generating PIC code, this is treated as .word.  */
12472   if (mips_pic != SVR4_PIC)
12473     {
12474       s_cons (2);
12475       return;
12476     }
12477
12478   label = insn_labels != NULL ? insn_labels->label : NULL;
12479   mips_emit_delays (TRUE);
12480   if (auto_align)
12481     mips_align (2, 0, label);
12482   mips_clear_insn_labels ();
12483
12484   expression (&ex);
12485
12486   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12487     {
12488       as_bad (_("Unsupported use of .gpword"));
12489       ignore_rest_of_line ();
12490     }
12491
12492   p = frag_more (4);
12493   md_number_to_chars (p, (valueT) 0, 4);
12494   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12495                BFD_RELOC_GPREL32);
12496
12497   demand_empty_rest_of_line ();
12498 }
12499
12500 static void
12501 s_gpdword (ignore)
12502      int ignore ATTRIBUTE_UNUSED;
12503 {
12504   symbolS *label;
12505   expressionS ex;
12506   char *p;
12507
12508   /* When not generating PIC code, this is treated as .dword.  */
12509   if (mips_pic != SVR4_PIC)
12510     {
12511       s_cons (3);
12512       return;
12513     }
12514
12515   label = insn_labels != NULL ? insn_labels->label : NULL;
12516   mips_emit_delays (TRUE);
12517   if (auto_align)
12518     mips_align (3, 0, label);
12519   mips_clear_insn_labels ();
12520
12521   expression (&ex);
12522
12523   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12524     {
12525       as_bad (_("Unsupported use of .gpdword"));
12526       ignore_rest_of_line ();
12527     }
12528
12529   p = frag_more (8);
12530   md_number_to_chars (p, (valueT) 0, 8);
12531   fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
12532                BFD_RELOC_GPREL32);
12533
12534   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
12535   ex.X_op = O_absent;
12536   ex.X_add_symbol = 0;
12537   ex.X_add_number = 0;
12538   fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
12539                BFD_RELOC_64);
12540
12541   demand_empty_rest_of_line ();
12542 }
12543
12544 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
12545    tables in SVR4 PIC code.  */
12546
12547 static void
12548 s_cpadd (ignore)
12549      int ignore ATTRIBUTE_UNUSED;
12550 {
12551   int icnt = 0;
12552   int reg;
12553
12554   /* This is ignored when not generating SVR4 PIC code.  */
12555   if (mips_pic != SVR4_PIC)
12556     {
12557       s_ignore (0);
12558       return;
12559     }
12560
12561   /* Add $gp to the register named as an argument.  */
12562   reg = tc_get_register (0);
12563   macro_build ((char *) NULL, &icnt, (expressionS *) NULL,
12564                HAVE_32BIT_ADDRESSES ? "addu" : "daddu",
12565                "d,v,t", reg, reg, mips_gp_register);
12566
12567   demand_empty_rest_of_line ();
12568 }
12569
12570 /* Handle the .insn pseudo-op.  This marks instruction labels in
12571    mips16 mode.  This permits the linker to handle them specially,
12572    such as generating jalx instructions when needed.  We also make
12573    them odd for the duration of the assembly, in order to generate the
12574    right sort of code.  We will make them even in the adjust_symtab
12575    routine, while leaving them marked.  This is convenient for the
12576    debugger and the disassembler.  The linker knows to make them odd
12577    again.  */
12578
12579 static void
12580 s_insn (ignore)
12581      int ignore ATTRIBUTE_UNUSED;
12582 {
12583   mips16_mark_labels ();
12584
12585   demand_empty_rest_of_line ();
12586 }
12587
12588 /* Handle a .stabn directive.  We need these in order to mark a label
12589    as being a mips16 text label correctly.  Sometimes the compiler
12590    will emit a label, followed by a .stabn, and then switch sections.
12591    If the label and .stabn are in mips16 mode, then the label is
12592    really a mips16 text label.  */
12593
12594 static void
12595 s_mips_stab (type)
12596      int type;
12597 {
12598   if (type == 'n')
12599     mips16_mark_labels ();
12600
12601   s_stab (type);
12602 }
12603
12604 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12605  */
12606
12607 static void
12608 s_mips_weakext (ignore)
12609      int ignore ATTRIBUTE_UNUSED;
12610 {
12611   char *name;
12612   int c;
12613   symbolS *symbolP;
12614   expressionS exp;
12615
12616   name = input_line_pointer;
12617   c = get_symbol_end ();
12618   symbolP = symbol_find_or_make (name);
12619   S_SET_WEAK (symbolP);
12620   *input_line_pointer = c;
12621
12622   SKIP_WHITESPACE ();
12623
12624   if (! is_end_of_line[(unsigned char) *input_line_pointer])
12625     {
12626       if (S_IS_DEFINED (symbolP))
12627         {
12628           as_bad ("ignoring attempt to redefine symbol %s",
12629                   S_GET_NAME (symbolP));
12630           ignore_rest_of_line ();
12631           return;
12632         }
12633
12634       if (*input_line_pointer == ',')
12635         {
12636           ++input_line_pointer;
12637           SKIP_WHITESPACE ();
12638         }
12639
12640       expression (&exp);
12641       if (exp.X_op != O_symbol)
12642         {
12643           as_bad ("bad .weakext directive");
12644           ignore_rest_of_line ();
12645           return;
12646         }
12647       symbol_set_value_expression (symbolP, &exp);
12648     }
12649
12650   demand_empty_rest_of_line ();
12651 }
12652
12653 /* Parse a register string into a number.  Called from the ECOFF code
12654    to parse .frame.  The argument is non-zero if this is the frame
12655    register, so that we can record it in mips_frame_reg.  */
12656
12657 int
12658 tc_get_register (frame)
12659      int frame;
12660 {
12661   int reg;
12662
12663   SKIP_WHITESPACE ();
12664   if (*input_line_pointer++ != '$')
12665     {
12666       as_warn (_("expected `$'"));
12667       reg = ZERO;
12668     }
12669   else if (ISDIGIT (*input_line_pointer))
12670     {
12671       reg = get_absolute_expression ();
12672       if (reg < 0 || reg >= 32)
12673         {
12674           as_warn (_("Bad register number"));
12675           reg = ZERO;
12676         }
12677     }
12678   else
12679     {
12680       if (strncmp (input_line_pointer, "ra", 2) == 0)
12681         {
12682           reg = RA;
12683           input_line_pointer += 2;
12684         }
12685       else if (strncmp (input_line_pointer, "fp", 2) == 0)
12686         {
12687           reg = FP;
12688           input_line_pointer += 2;
12689         }
12690       else if (strncmp (input_line_pointer, "sp", 2) == 0)
12691         {
12692           reg = SP;
12693           input_line_pointer += 2;
12694         }
12695       else if (strncmp (input_line_pointer, "gp", 2) == 0)
12696         {
12697           reg = GP;
12698           input_line_pointer += 2;
12699         }
12700       else if (strncmp (input_line_pointer, "at", 2) == 0)
12701         {
12702           reg = AT;
12703           input_line_pointer += 2;
12704         }
12705       else if (strncmp (input_line_pointer, "kt0", 3) == 0)
12706         {
12707           reg = KT0;
12708           input_line_pointer += 3;
12709         }
12710       else if (strncmp (input_line_pointer, "kt1", 3) == 0)
12711         {
12712           reg = KT1;
12713           input_line_pointer += 3;
12714         }
12715       else if (strncmp (input_line_pointer, "zero", 4) == 0)
12716         {
12717           reg = ZERO;
12718           input_line_pointer += 4;
12719         }
12720       else
12721         {
12722           as_warn (_("Unrecognized register name"));
12723           reg = ZERO;
12724           while (ISALNUM(*input_line_pointer))
12725            input_line_pointer++;
12726         }
12727     }
12728   if (frame)
12729     {
12730       mips_frame_reg = reg != 0 ? reg : SP;
12731       mips_frame_reg_valid = 1;
12732       mips_cprestore_valid = 0;
12733     }
12734   return reg;
12735 }
12736
12737 valueT
12738 md_section_align (seg, addr)
12739      asection *seg;
12740      valueT addr;
12741 {
12742   int align = bfd_get_section_alignment (stdoutput, seg);
12743
12744 #ifdef OBJ_ELF
12745   /* We don't need to align ELF sections to the full alignment.
12746      However, Irix 5 may prefer that we align them at least to a 16
12747      byte boundary.  We don't bother to align the sections if we are
12748      targeted for an embedded system.  */
12749   if (strcmp (TARGET_OS, "elf") == 0)
12750     return addr;
12751   if (align > 4)
12752     align = 4;
12753 #endif
12754
12755   return ((addr + (1 << align) - 1) & (-1 << align));
12756 }
12757
12758 /* Utility routine, called from above as well.  If called while the
12759    input file is still being read, it's only an approximation.  (For
12760    example, a symbol may later become defined which appeared to be
12761    undefined earlier.)  */
12762
12763 static int
12764 nopic_need_relax (sym, before_relaxing)
12765      symbolS *sym;
12766      int before_relaxing;
12767 {
12768   if (sym == 0)
12769     return 0;
12770
12771   if (USE_GLOBAL_POINTER_OPT && g_switch_value > 0)
12772     {
12773       const char *symname;
12774       int change;
12775
12776       /* Find out whether this symbol can be referenced off the $gp
12777          register.  It can be if it is smaller than the -G size or if
12778          it is in the .sdata or .sbss section.  Certain symbols can
12779          not be referenced off the $gp, although it appears as though
12780          they can.  */
12781       symname = S_GET_NAME (sym);
12782       if (symname != (const char *) NULL
12783           && (strcmp (symname, "eprol") == 0
12784               || strcmp (symname, "etext") == 0
12785               || strcmp (symname, "_gp") == 0
12786               || strcmp (symname, "edata") == 0
12787               || strcmp (symname, "_fbss") == 0
12788               || strcmp (symname, "_fdata") == 0
12789               || strcmp (symname, "_ftext") == 0
12790               || strcmp (symname, "end") == 0
12791               || strcmp (symname, "_gp_disp") == 0))
12792         change = 1;
12793       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12794                && !S_IS_EXTERN (sym)
12795                && (0
12796 #ifndef NO_ECOFF_DEBUGGING
12797                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
12798                        && (symbol_get_obj (sym)->ecoff_extern_size
12799                            <= g_switch_value))
12800 #endif
12801                    /* We must defer this decision until after the whole
12802                       file has been read, since there might be a .extern
12803                       after the first use of this symbol.  */
12804                    || (before_relaxing
12805 #ifndef NO_ECOFF_DEBUGGING
12806                        && symbol_get_obj (sym)->ecoff_extern_size == 0
12807 #endif
12808                        && S_GET_VALUE (sym) == 0)
12809                    || (S_GET_VALUE (sym) != 0
12810                        && S_GET_VALUE (sym) <= g_switch_value)))
12811         change = 0;
12812       else
12813         {
12814           const char *segname;
12815
12816           segname = segment_name (S_GET_SEGMENT (sym));
12817           assert (strcmp (segname, ".lit8") != 0
12818                   && strcmp (segname, ".lit4") != 0);
12819           change = (strcmp (segname, ".sdata") != 0
12820                     && strcmp (segname, ".sbss") != 0
12821                     && strncmp (segname, ".sdata.", 7) != 0
12822                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
12823         }
12824       return change;
12825     }
12826   else
12827     /* We are not optimizing for the $gp register.  */
12828     return 1;
12829 }
12830
12831
12832 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
12833
12834 static bfd_boolean
12835 pic_need_relax (sym, segtype)
12836      symbolS *sym;
12837      asection *segtype;
12838 {
12839   asection *symsec;
12840   bfd_boolean linkonce;
12841
12842   /* Handle the case of a symbol equated to another symbol.  */
12843   while (symbol_equated_reloc_p (sym))
12844     {
12845       symbolS *n;
12846
12847       /* It's possible to get a loop here in a badly written
12848          program.  */
12849       n = symbol_get_value_expression (sym)->X_add_symbol;
12850       if (n == sym)
12851         break;
12852       sym = n;
12853     }
12854
12855   symsec = S_GET_SEGMENT (sym);
12856
12857   /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
12858   linkonce = FALSE;
12859   if (symsec != segtype && ! S_IS_LOCAL (sym))
12860     {
12861       if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
12862           != 0)
12863         linkonce = TRUE;
12864
12865       /* The GNU toolchain uses an extension for ELF: a section
12866          beginning with the magic string .gnu.linkonce is a linkonce
12867          section.  */
12868       if (strncmp (segment_name (symsec), ".gnu.linkonce",
12869                    sizeof ".gnu.linkonce" - 1) == 0)
12870         linkonce = TRUE;
12871     }
12872
12873   /* This must duplicate the test in adjust_reloc_syms.  */
12874   return (symsec != &bfd_und_section
12875           && symsec != &bfd_abs_section
12876           && ! bfd_is_com_section (symsec)
12877           && !linkonce
12878 #ifdef OBJ_ELF
12879           /* A global or weak symbol is treated as external.  */
12880           && (OUTPUT_FLAVOR != bfd_target_elf_flavour
12881               || (! S_IS_WEAK (sym)
12882                   && (! S_IS_EXTERNAL (sym)
12883                       || mips_pic == EMBEDDED_PIC)))
12884 #endif
12885           );
12886 }
12887
12888
12889 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
12890    extended opcode.  SEC is the section the frag is in.  */
12891
12892 static int
12893 mips16_extended_frag (fragp, sec, stretch)
12894      fragS *fragp;
12895      asection *sec;
12896      long stretch;
12897 {
12898   int type;
12899   register const struct mips16_immed_operand *op;
12900   offsetT val;
12901   int mintiny, maxtiny;
12902   segT symsec;
12903   fragS *sym_frag;
12904
12905   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
12906     return 0;
12907   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
12908     return 1;
12909
12910   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12911   op = mips16_immed_operands;
12912   while (op->type != type)
12913     {
12914       ++op;
12915       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
12916     }
12917
12918   if (op->unsp)
12919     {
12920       if (type == '<' || type == '>' || type == '[' || type == ']')
12921         {
12922           mintiny = 1;
12923           maxtiny = 1 << op->nbits;
12924         }
12925       else
12926         {
12927           mintiny = 0;
12928           maxtiny = (1 << op->nbits) - 1;
12929         }
12930     }
12931   else
12932     {
12933       mintiny = - (1 << (op->nbits - 1));
12934       maxtiny = (1 << (op->nbits - 1)) - 1;
12935     }
12936
12937   sym_frag = symbol_get_frag (fragp->fr_symbol);
12938   val = S_GET_VALUE (fragp->fr_symbol);
12939   symsec = S_GET_SEGMENT (fragp->fr_symbol);
12940
12941   if (op->pcrel)
12942     {
12943       addressT addr;
12944
12945       /* We won't have the section when we are called from
12946          mips_relax_frag.  However, we will always have been called
12947          from md_estimate_size_before_relax first.  If this is a
12948          branch to a different section, we mark it as such.  If SEC is
12949          NULL, and the frag is not marked, then it must be a branch to
12950          the same section.  */
12951       if (sec == NULL)
12952         {
12953           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
12954             return 1;
12955         }
12956       else
12957         {
12958           /* Must have been called from md_estimate_size_before_relax.  */
12959           if (symsec != sec)
12960             {
12961               fragp->fr_subtype =
12962                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12963
12964               /* FIXME: We should support this, and let the linker
12965                  catch branches and loads that are out of range.  */
12966               as_bad_where (fragp->fr_file, fragp->fr_line,
12967                             _("unsupported PC relative reference to different section"));
12968
12969               return 1;
12970             }
12971           if (fragp != sym_frag && sym_frag->fr_address == 0)
12972             /* Assume non-extended on the first relaxation pass.
12973                The address we have calculated will be bogus if this is
12974                a forward branch to another frag, as the forward frag
12975                will have fr_address == 0.  */
12976             return 0;
12977         }
12978
12979       /* In this case, we know for sure that the symbol fragment is in
12980          the same section.  If the relax_marker of the symbol fragment
12981          differs from the relax_marker of this fragment, we have not
12982          yet adjusted the symbol fragment fr_address.  We want to add
12983          in STRETCH in order to get a better estimate of the address.
12984          This particularly matters because of the shift bits.  */
12985       if (stretch != 0
12986           && sym_frag->relax_marker != fragp->relax_marker)
12987         {
12988           fragS *f;
12989
12990           /* Adjust stretch for any alignment frag.  Note that if have
12991              been expanding the earlier code, the symbol may be
12992              defined in what appears to be an earlier frag.  FIXME:
12993              This doesn't handle the fr_subtype field, which specifies
12994              a maximum number of bytes to skip when doing an
12995              alignment.  */
12996           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
12997             {
12998               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
12999                 {
13000                   if (stretch < 0)
13001                     stretch = - ((- stretch)
13002                                  & ~ ((1 << (int) f->fr_offset) - 1));
13003                   else
13004                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13005                   if (stretch == 0)
13006                     break;
13007                 }
13008             }
13009           if (f != NULL)
13010             val += stretch;
13011         }
13012
13013       addr = fragp->fr_address + fragp->fr_fix;
13014
13015       /* The base address rules are complicated.  The base address of
13016          a branch is the following instruction.  The base address of a
13017          PC relative load or add is the instruction itself, but if it
13018          is in a delay slot (in which case it can not be extended) use
13019          the address of the instruction whose delay slot it is in.  */
13020       if (type == 'p' || type == 'q')
13021         {
13022           addr += 2;
13023
13024           /* If we are currently assuming that this frag should be
13025              extended, then, the current address is two bytes
13026              higher.  */
13027           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13028             addr += 2;
13029
13030           /* Ignore the low bit in the target, since it will be set
13031              for a text label.  */
13032           if ((val & 1) != 0)
13033             --val;
13034         }
13035       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13036         addr -= 4;
13037       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13038         addr -= 2;
13039
13040       val -= addr & ~ ((1 << op->shift) - 1);
13041
13042       /* Branch offsets have an implicit 0 in the lowest bit.  */
13043       if (type == 'p' || type == 'q')
13044         val /= 2;
13045
13046       /* If any of the shifted bits are set, we must use an extended
13047          opcode.  If the address depends on the size of this
13048          instruction, this can lead to a loop, so we arrange to always
13049          use an extended opcode.  We only check this when we are in
13050          the main relaxation loop, when SEC is NULL.  */
13051       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13052         {
13053           fragp->fr_subtype =
13054             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13055           return 1;
13056         }
13057
13058       /* If we are about to mark a frag as extended because the value
13059          is precisely maxtiny + 1, then there is a chance of an
13060          infinite loop as in the following code:
13061              la $4,foo
13062              .skip      1020
13063              .align     2
13064            foo:
13065          In this case when the la is extended, foo is 0x3fc bytes
13066          away, so the la can be shrunk, but then foo is 0x400 away, so
13067          the la must be extended.  To avoid this loop, we mark the
13068          frag as extended if it was small, and is about to become
13069          extended with a value of maxtiny + 1.  */
13070       if (val == ((maxtiny + 1) << op->shift)
13071           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13072           && sec == NULL)
13073         {
13074           fragp->fr_subtype =
13075             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13076           return 1;
13077         }
13078     }
13079   else if (symsec != absolute_section && sec != NULL)
13080     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13081
13082   if ((val & ((1 << op->shift) - 1)) != 0
13083       || val < (mintiny << op->shift)
13084       || val > (maxtiny << op->shift))
13085     return 1;
13086   else
13087     return 0;
13088 }
13089
13090 /* Compute the length of a branch sequence, and adjust the
13091    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13092    worst-case length is computed, with UPDATE being used to indicate
13093    whether an unconditional (-1), branch-likely (+1) or regular (0)
13094    branch is to be computed.  */
13095 static int
13096 relaxed_branch_length (fragp, sec, update)
13097      fragS *fragp;
13098      asection *sec;
13099      int update;
13100 {
13101   bfd_boolean toofar;
13102   int length;
13103
13104   if (fragp
13105       && S_IS_DEFINED (fragp->fr_symbol)
13106       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13107     {
13108       addressT addr;
13109       offsetT val;
13110
13111       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13112
13113       addr = fragp->fr_address + fragp->fr_fix + 4;
13114
13115       val -= addr;
13116
13117       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13118     }
13119   else if (fragp)
13120     /* If the symbol is not defined or it's in a different segment,
13121        assume the user knows what's going on and emit a short
13122        branch.  */
13123     toofar = FALSE;
13124   else
13125     toofar = TRUE;
13126
13127   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13128     fragp->fr_subtype
13129       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13130                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13131                              RELAX_BRANCH_LINK (fragp->fr_subtype),
13132                              toofar);
13133
13134   length = 4;
13135   if (toofar)
13136     {
13137       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13138         length += 8;
13139
13140       if (mips_pic != NO_PIC)
13141         {
13142           /* Additional space for PIC loading of target address.  */
13143           length += 8;
13144           if (mips_opts.isa == ISA_MIPS1)
13145             /* Additional space for $at-stabilizing nop.  */
13146             length += 4;
13147         }
13148
13149       /* If branch is conditional.  */
13150       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13151         length += 8;
13152     }
13153
13154   return length;
13155 }
13156
13157 /* Estimate the size of a frag before relaxing.  Unless this is the
13158    mips16, we are not really relaxing here, and the final size is
13159    encoded in the subtype information.  For the mips16, we have to
13160    decide whether we are using an extended opcode or not.  */
13161
13162 int
13163 md_estimate_size_before_relax (fragp, segtype)
13164      fragS *fragp;
13165      asection *segtype;
13166 {
13167   int change;
13168
13169   if (RELAX_BRANCH_P (fragp->fr_subtype))
13170     {
13171
13172       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13173
13174       return fragp->fr_var;
13175     }
13176
13177   if (RELAX_MIPS16_P (fragp->fr_subtype))
13178     /* We don't want to modify the EXTENDED bit here; it might get us
13179        into infinite loops.  We change it only in mips_relax_frag().  */
13180     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13181
13182   if (mips_pic == NO_PIC)
13183     change = nopic_need_relax (fragp->fr_symbol, 0);
13184   else if (mips_pic == SVR4_PIC)
13185     change = pic_need_relax (fragp->fr_symbol, segtype);
13186   else
13187     abort ();
13188
13189   if (change)
13190     {
13191       /* Record the offset to the first reloc in the fr_opcode field.
13192          This lets md_convert_frag and tc_gen_reloc know that the code
13193          must be expanded.  */
13194       fragp->fr_opcode = (fragp->fr_literal
13195                           + fragp->fr_fix
13196                           - RELAX_OLD (fragp->fr_subtype)
13197                           + RELAX_RELOC1 (fragp->fr_subtype));
13198       /* FIXME: This really needs as_warn_where.  */
13199       if (RELAX_WARN (fragp->fr_subtype))
13200         as_warn (_("AT used after \".set noat\" or macro used after "
13201                    "\".set nomacro\""));
13202
13203       return RELAX_NEW (fragp->fr_subtype) - RELAX_OLD (fragp->fr_subtype);
13204     }
13205
13206   return 0;
13207 }
13208
13209 /* This is called to see whether a reloc against a defined symbol
13210    should be converted into a reloc against a section.  Don't adjust
13211    MIPS16 jump relocations, so we don't have to worry about the format
13212    of the offset in the .o file.  Don't adjust relocations against
13213    mips16 symbols, so that the linker can find them if it needs to set
13214    up a stub.  */
13215
13216 int
13217 mips_fix_adjustable (fixp)
13218      fixS *fixp;
13219 {
13220   if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
13221     return 0;
13222
13223   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13224       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13225     return 0;
13226
13227   if (fixp->fx_addsy == NULL)
13228     return 1;
13229
13230 #ifdef OBJ_ELF
13231   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
13232       && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13233       && fixp->fx_subsy == NULL)
13234     return 0;
13235 #endif
13236
13237   return 1;
13238 }
13239
13240 /* Translate internal representation of relocation info to BFD target
13241    format.  */
13242
13243 arelent **
13244 tc_gen_reloc (section, fixp)
13245      asection *section ATTRIBUTE_UNUSED;
13246      fixS *fixp;
13247 {
13248   static arelent *retval[4];
13249   arelent *reloc;
13250   bfd_reloc_code_real_type code;
13251
13252   reloc = retval[0] = (arelent *) xmalloc (sizeof (arelent));
13253   retval[1] = NULL;
13254
13255   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13256   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13257   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13258
13259   if (mips_pic == EMBEDDED_PIC
13260       && SWITCH_TABLE (fixp))
13261     {
13262       /* For a switch table entry we use a special reloc.  The addend
13263          is actually the difference between the reloc address and the
13264          subtrahend.  */
13265       reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13266       if (OUTPUT_FLAVOR != bfd_target_ecoff_flavour)
13267         as_fatal (_("Double check fx_r_type in tc-mips.c:tc_gen_reloc"));
13268       fixp->fx_r_type = BFD_RELOC_GPREL32;
13269     }
13270   else if (fixp->fx_r_type == BFD_RELOC_PCREL_LO16)
13271     {
13272       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13273         reloc->addend = fixp->fx_addnumber;
13274       else
13275         {
13276           /* We use a special addend for an internal RELLO reloc.  */
13277           if (symbol_section_p (fixp->fx_addsy))
13278             reloc->addend = reloc->address - S_GET_VALUE (fixp->fx_subsy);
13279           else
13280             reloc->addend = fixp->fx_addnumber + reloc->address;
13281         }
13282     }
13283   else if (fixp->fx_r_type == BFD_RELOC_PCREL_HI16_S)
13284     {
13285       assert (fixp->fx_next != NULL
13286               && fixp->fx_next->fx_r_type == BFD_RELOC_PCREL_LO16);
13287
13288       /* The reloc is relative to the RELLO; adjust the addend
13289          accordingly.  */
13290       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
13291         reloc->addend = fixp->fx_next->fx_addnumber;
13292       else
13293         {
13294           /* We use a special addend for an internal RELHI reloc.  */
13295           if (symbol_section_p (fixp->fx_addsy))
13296             reloc->addend = (fixp->fx_next->fx_frag->fr_address
13297                              + fixp->fx_next->fx_where
13298                              - S_GET_VALUE (fixp->fx_subsy));
13299           else
13300             reloc->addend = (fixp->fx_addnumber
13301                              + fixp->fx_next->fx_frag->fr_address
13302                              + fixp->fx_next->fx_where);
13303         }
13304     }
13305   else if (fixp->fx_pcrel == 0 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13306     reloc->addend = fixp->fx_addnumber;
13307   else
13308     {
13309       if (OUTPUT_FLAVOR != bfd_target_aout_flavour)
13310         /* A gruesome hack which is a result of the gruesome gas reloc
13311            handling.  */
13312         reloc->addend = reloc->address;
13313       else
13314         reloc->addend = -reloc->address;
13315     }
13316
13317   /* If this is a variant frag, we may need to adjust the existing
13318      reloc and generate a new one.  */
13319   if (fixp->fx_frag->fr_opcode != NULL
13320       && ((fixp->fx_r_type == BFD_RELOC_GPREL16
13321            && ! HAVE_NEWABI)
13322           || fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
13323           || fixp->fx_r_type == BFD_RELOC_MIPS_CALL16
13324           || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13325           || fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16
13326           || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
13327           || fixp->fx_r_type == BFD_RELOC_MIPS_CALL_LO16)
13328     )
13329     {
13330       arelent *reloc2;
13331
13332       assert (! RELAX_MIPS16_P (fixp->fx_frag->fr_subtype));
13333
13334       /* If this is not the last reloc in this frag, then we have two
13335          GPREL relocs, or a GOT_HI16/GOT_LO16 pair, or a
13336          CALL_HI16/CALL_LO16, both of which are being replaced.  Let
13337          the second one handle all of them.  */
13338       if (fixp->fx_next != NULL
13339           && fixp->fx_frag == fixp->fx_next->fx_frag)
13340         {
13341           assert ((fixp->fx_r_type == BFD_RELOC_GPREL16
13342                    && fixp->fx_next->fx_r_type == BFD_RELOC_GPREL16)
13343                   || (fixp->fx_r_type == BFD_RELOC_MIPS_GOT_HI16
13344                       && (fixp->fx_next->fx_r_type
13345                           == BFD_RELOC_MIPS_GOT_LO16))
13346                   || (fixp->fx_r_type == BFD_RELOC_MIPS_CALL_HI16
13347                       && (fixp->fx_next->fx_r_type
13348                           == BFD_RELOC_MIPS_CALL_LO16)));
13349           retval[0] = NULL;
13350           return retval;
13351         }
13352
13353       fixp->fx_where = fixp->fx_frag->fr_opcode - fixp->fx_frag->fr_literal;
13354       reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13355       reloc2 = retval[1] = (arelent *) xmalloc (sizeof (arelent));
13356       retval[2] = NULL;
13357       reloc2->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13358       *reloc2->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13359       reloc2->address = (reloc->address
13360                          + (RELAX_RELOC2 (fixp->fx_frag->fr_subtype)
13361                             - RELAX_RELOC1 (fixp->fx_frag->fr_subtype)));
13362       reloc2->addend = fixp->fx_addnumber;
13363       reloc2->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_LO16);
13364       assert (reloc2->howto != NULL);
13365
13366       if (RELAX_RELOC3 (fixp->fx_frag->fr_subtype))
13367         {
13368           arelent *reloc3;
13369
13370           reloc3 = retval[2] = (arelent *) xmalloc (sizeof (arelent));
13371           retval[3] = NULL;
13372           *reloc3 = *reloc2;
13373           reloc3->address += 4;
13374         }
13375
13376       if (mips_pic == NO_PIC)
13377         {
13378           assert (fixp->fx_r_type == BFD_RELOC_GPREL16);
13379           fixp->fx_r_type = BFD_RELOC_HI16_S;
13380         }
13381       else if (mips_pic == SVR4_PIC)
13382         {
13383           switch (fixp->fx_r_type)
13384             {
13385             default:
13386               abort ();
13387             case BFD_RELOC_MIPS_GOT16:
13388               break;
13389             case BFD_RELOC_MIPS_GOT_LO16:
13390             case BFD_RELOC_MIPS_CALL_LO16:
13391               fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13392               break;
13393             case BFD_RELOC_MIPS_CALL16:
13394               if (HAVE_NEWABI)
13395                 {
13396                   /* BFD_RELOC_MIPS_GOT16;*/
13397                   fixp->fx_r_type = BFD_RELOC_MIPS_GOT_PAGE;
13398                   reloc2->howto = bfd_reloc_type_lookup
13399                     (stdoutput, BFD_RELOC_MIPS_GOT_OFST);
13400                 }
13401               else
13402                 fixp->fx_r_type = BFD_RELOC_MIPS_GOT16;
13403               break;
13404             }
13405         }
13406       else
13407         abort ();
13408
13409       /* newabi uses R_MIPS_GOT_DISP for local symbols */
13410       if (HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_MIPS_GOT_LO16)
13411         {
13412           fixp->fx_r_type = BFD_RELOC_MIPS_GOT_DISP;
13413           retval[1] = NULL;
13414         }
13415     }
13416
13417   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13418      entry to be used in the relocation's section offset.  */
13419   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13420     {
13421       reloc->address = reloc->addend;
13422       reloc->addend = 0;
13423     }
13424
13425   /* Since DIFF_EXPR_OK is defined in tc-mips.h, it is possible that
13426      fixup_segment converted a non-PC relative reloc into a PC
13427      relative reloc.  In such a case, we need to convert the reloc
13428      code.  */
13429   code = fixp->fx_r_type;
13430   if (fixp->fx_pcrel)
13431     {
13432       switch (code)
13433         {
13434         case BFD_RELOC_8:
13435           code = BFD_RELOC_8_PCREL;
13436           break;
13437         case BFD_RELOC_16:
13438           code = BFD_RELOC_16_PCREL;
13439           break;
13440         case BFD_RELOC_32:
13441           code = BFD_RELOC_32_PCREL;
13442           break;
13443         case BFD_RELOC_64:
13444           code = BFD_RELOC_64_PCREL;
13445           break;
13446         case BFD_RELOC_8_PCREL:
13447         case BFD_RELOC_16_PCREL:
13448         case BFD_RELOC_32_PCREL:
13449         case BFD_RELOC_64_PCREL:
13450         case BFD_RELOC_16_PCREL_S2:
13451         case BFD_RELOC_PCREL_HI16_S:
13452         case BFD_RELOC_PCREL_LO16:
13453           break;
13454         default:
13455           as_bad_where (fixp->fx_file, fixp->fx_line,
13456                         _("Cannot make %s relocation PC relative"),
13457                         bfd_get_reloc_code_name (code));
13458         }
13459     }
13460
13461 #ifdef OBJ_ELF
13462   /* md_apply_fix3 has a double-subtraction hack to get
13463      bfd_install_relocation to behave nicely.  GPREL relocations are
13464      handled correctly without this hack, so undo it here.  We can't
13465      stop md_apply_fix3 from subtracting twice in the first place since
13466      the fake addend is required for variant frags above.  */
13467   if (fixp->fx_addsy != NULL && OUTPUT_FLAVOR == bfd_target_elf_flavour
13468       && (code == BFD_RELOC_GPREL16 || code == BFD_RELOC_MIPS16_GPREL)
13469       && reloc->addend != 0
13470       && mips_need_elf_addend_fixup (fixp))
13471     reloc->addend += S_GET_VALUE (fixp->fx_addsy);
13472 #endif
13473
13474   /* To support a PC relative reloc when generating embedded PIC code
13475      for ECOFF, we use a Cygnus extension.  We check for that here to
13476      make sure that we don't let such a reloc escape normally.  */
13477   if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
13478        || OUTPUT_FLAVOR == bfd_target_elf_flavour)
13479       && code == BFD_RELOC_16_PCREL_S2
13480       && mips_pic != EMBEDDED_PIC)
13481     reloc->howto = NULL;
13482   else
13483     reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13484
13485   if (reloc->howto == NULL)
13486     {
13487       as_bad_where (fixp->fx_file, fixp->fx_line,
13488                     _("Can not represent %s relocation in this object file format"),
13489                     bfd_get_reloc_code_name (code));
13490       retval[0] = NULL;
13491     }
13492
13493   return retval;
13494 }
13495
13496 /* Relax a machine dependent frag.  This returns the amount by which
13497    the current size of the frag should change.  */
13498
13499 int
13500 mips_relax_frag (sec, fragp, stretch)
13501      asection *sec;
13502      fragS *fragp;
13503      long stretch;
13504 {
13505   if (RELAX_BRANCH_P (fragp->fr_subtype))
13506     {
13507       offsetT old_var = fragp->fr_var;
13508
13509       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13510
13511       return fragp->fr_var - old_var;
13512     }
13513
13514   if (! RELAX_MIPS16_P (fragp->fr_subtype))
13515     return 0;
13516
13517   if (mips16_extended_frag (fragp, NULL, stretch))
13518     {
13519       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13520         return 0;
13521       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13522       return 2;
13523     }
13524   else
13525     {
13526       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13527         return 0;
13528       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13529       return -2;
13530     }
13531
13532   return 0;
13533 }
13534
13535 /* Convert a machine dependent frag.  */
13536
13537 void
13538 md_convert_frag (abfd, asec, fragp)
13539      bfd *abfd ATTRIBUTE_UNUSED;
13540      segT asec;
13541      fragS *fragp;
13542 {
13543   int old, new;
13544   char *fixptr;
13545
13546   if (RELAX_BRANCH_P (fragp->fr_subtype))
13547     {
13548       bfd_byte *buf;
13549       unsigned long insn;
13550       expressionS exp;
13551       fixS *fixp;
13552
13553       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13554
13555       if (target_big_endian)
13556         insn = bfd_getb32 (buf);
13557       else
13558         insn = bfd_getl32 (buf);
13559
13560       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13561         {
13562           /* We generate a fixup instead of applying it right now
13563              because, if there are linker relaxations, we're going to
13564              need the relocations.  */
13565           exp.X_op = O_symbol;
13566           exp.X_add_symbol = fragp->fr_symbol;
13567           exp.X_add_number = fragp->fr_offset;
13568
13569           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13570                               4, &exp, 1,
13571                               BFD_RELOC_16_PCREL_S2);
13572           fixp->fx_file = fragp->fr_file;
13573           fixp->fx_line = fragp->fr_line;
13574
13575           md_number_to_chars ((char *)buf, insn, 4);
13576           buf += 4;
13577         }
13578       else
13579         {
13580           int i;
13581
13582           as_warn_where (fragp->fr_file, fragp->fr_line,
13583                          _("relaxed out-of-range branch into a jump"));
13584
13585           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13586             goto uncond;
13587
13588           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13589             {
13590               /* Reverse the branch.  */
13591               switch ((insn >> 28) & 0xf)
13592                 {
13593                 case 4:
13594                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13595                      have the condition reversed by tweaking a single
13596                      bit, and their opcodes all have 0x4???????.  */
13597                   assert ((insn & 0xf1000000) == 0x41000000);
13598                   insn ^= 0x00010000;
13599                   break;
13600
13601                 case 0:
13602                   /* bltz       0x04000000      bgez    0x04010000
13603                      bltzal     0x04100000      bgezal  0x04110000 */
13604                   assert ((insn & 0xfc0e0000) == 0x04000000);
13605                   insn ^= 0x00010000;
13606                   break;
13607
13608                 case 1:
13609                   /* beq        0x10000000      bne     0x14000000
13610                      blez       0x18000000      bgtz    0x1c000000 */
13611                   insn ^= 0x04000000;
13612                   break;
13613
13614                 default:
13615                   abort ();
13616                 }
13617             }
13618
13619           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13620             {
13621               /* Clear the and-link bit.  */
13622               assert ((insn & 0xfc1c0000) == 0x04100000);
13623
13624               /* bltzal 0x04100000      bgezal  0x04110000
13625                 bltzall 0x04120000     bgezall  0x04130000 */
13626               insn &= ~0x00100000;
13627             }
13628
13629           /* Branch over the branch (if the branch was likely) or the
13630              full jump (not likely case).  Compute the offset from the
13631              current instruction to branch to.  */
13632           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13633             i = 16;
13634           else
13635             {
13636               /* How many bytes in instructions we've already emitted?  */
13637               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13638               /* How many bytes in instructions from here to the end?  */
13639               i = fragp->fr_var - i;
13640             }
13641           /* Convert to instruction count.  */
13642           i >>= 2;
13643           /* Branch counts from the next instruction.  */
13644           i--;
13645           insn |= i;
13646           /* Branch over the jump.  */
13647           md_number_to_chars ((char *)buf, insn, 4);
13648           buf += 4;
13649
13650           /* Nop */
13651           md_number_to_chars ((char*)buf, 0, 4);
13652           buf += 4;
13653
13654           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13655             {
13656               /* beql $0, $0, 2f */
13657               insn = 0x50000000;
13658               /* Compute the PC offset from the current instruction to
13659                  the end of the variable frag.  */
13660               /* How many bytes in instructions we've already emitted?  */
13661               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13662               /* How many bytes in instructions from here to the end?  */
13663               i = fragp->fr_var - i;
13664               /* Convert to instruction count.  */
13665               i >>= 2;
13666               /* Don't decrement i, because we want to branch over the
13667                  delay slot.  */
13668
13669               insn |= i;
13670               md_number_to_chars ((char *)buf, insn, 4);
13671               buf += 4;
13672
13673               md_number_to_chars ((char *)buf, 0, 4);
13674               buf += 4;
13675             }
13676
13677         uncond:
13678           if (mips_pic == NO_PIC)
13679             {
13680               /* j or jal.  */
13681               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13682                       ? 0x0c000000 : 0x08000000);
13683               exp.X_op = O_symbol;
13684               exp.X_add_symbol = fragp->fr_symbol;
13685               exp.X_add_number = fragp->fr_offset;
13686
13687               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13688                                   4, &exp, 0, BFD_RELOC_MIPS_JMP);
13689               fixp->fx_file = fragp->fr_file;
13690               fixp->fx_line = fragp->fr_line;
13691
13692               md_number_to_chars ((char*)buf, insn, 4);
13693               buf += 4;
13694             }
13695           else
13696             {
13697               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13698               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13699               exp.X_op = O_symbol;
13700               exp.X_add_symbol = fragp->fr_symbol;
13701               exp.X_add_number = fragp->fr_offset;
13702
13703               if (fragp->fr_offset)
13704                 {
13705                   exp.X_add_symbol = make_expr_symbol (&exp);
13706                   exp.X_add_number = 0;
13707                 }
13708
13709               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13710                                   4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13711               fixp->fx_file = fragp->fr_file;
13712               fixp->fx_line = fragp->fr_line;
13713
13714               md_number_to_chars ((char*)buf, insn, 4);
13715               buf += 4;
13716
13717               if (mips_opts.isa == ISA_MIPS1)
13718                 {
13719                   /* nop */
13720                   md_number_to_chars ((char*)buf, 0, 4);
13721                   buf += 4;
13722                 }
13723
13724               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
13725               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13726
13727               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13728                                   4, &exp, 0, BFD_RELOC_LO16);
13729               fixp->fx_file = fragp->fr_file;
13730               fixp->fx_line = fragp->fr_line;
13731
13732               md_number_to_chars ((char*)buf, insn, 4);
13733               buf += 4;
13734
13735               /* j(al)r $at.  */
13736               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13737                 insn = 0x0020f809;
13738               else
13739                 insn = 0x00200008;
13740
13741               md_number_to_chars ((char*)buf, insn, 4);
13742               buf += 4;
13743             }
13744         }
13745
13746       assert (buf == (bfd_byte *)fragp->fr_literal
13747               + fragp->fr_fix + fragp->fr_var);
13748
13749       fragp->fr_fix += fragp->fr_var;
13750
13751       return;
13752     }
13753
13754   if (RELAX_MIPS16_P (fragp->fr_subtype))
13755     {
13756       int type;
13757       register const struct mips16_immed_operand *op;
13758       bfd_boolean small, ext;
13759       offsetT val;
13760       bfd_byte *buf;
13761       unsigned long insn;
13762       bfd_boolean use_extend;
13763       unsigned short extend;
13764
13765       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13766       op = mips16_immed_operands;
13767       while (op->type != type)
13768         ++op;
13769
13770       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13771         {
13772           small = FALSE;
13773           ext = TRUE;
13774         }
13775       else
13776         {
13777           small = TRUE;
13778           ext = FALSE;
13779         }
13780
13781       resolve_symbol_value (fragp->fr_symbol);
13782       val = S_GET_VALUE (fragp->fr_symbol);
13783       if (op->pcrel)
13784         {
13785           addressT addr;
13786
13787           addr = fragp->fr_address + fragp->fr_fix;
13788
13789           /* The rules for the base address of a PC relative reloc are
13790              complicated; see mips16_extended_frag.  */
13791           if (type == 'p' || type == 'q')
13792             {
13793               addr += 2;
13794               if (ext)
13795                 addr += 2;
13796               /* Ignore the low bit in the target, since it will be
13797                  set for a text label.  */
13798               if ((val & 1) != 0)
13799                 --val;
13800             }
13801           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13802             addr -= 4;
13803           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13804             addr -= 2;
13805
13806           addr &= ~ (addressT) ((1 << op->shift) - 1);
13807           val -= addr;
13808
13809           /* Make sure the section winds up with the alignment we have
13810              assumed.  */
13811           if (op->shift > 0)
13812             record_alignment (asec, op->shift);
13813         }
13814
13815       if (ext
13816           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13817               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13818         as_warn_where (fragp->fr_file, fragp->fr_line,
13819                        _("extended instruction in delay slot"));
13820
13821       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13822
13823       if (target_big_endian)
13824         insn = bfd_getb16 (buf);
13825       else
13826         insn = bfd_getl16 (buf);
13827
13828       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13829                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13830                     small, ext, &insn, &use_extend, &extend);
13831
13832       if (use_extend)
13833         {
13834           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
13835           fragp->fr_fix += 2;
13836           buf += 2;
13837         }
13838
13839       md_number_to_chars ((char *) buf, insn, 2);
13840       fragp->fr_fix += 2;
13841       buf += 2;
13842     }
13843   else
13844     {
13845       if (fragp->fr_opcode == NULL)
13846         return;
13847
13848       old = RELAX_OLD (fragp->fr_subtype);
13849       new = RELAX_NEW (fragp->fr_subtype);
13850       fixptr = fragp->fr_literal + fragp->fr_fix;
13851
13852       if (new > 0)
13853         memcpy (fixptr - old, fixptr, new);
13854
13855       fragp->fr_fix += new - old;
13856     }
13857 }
13858
13859 #ifdef OBJ_ELF
13860
13861 /* This function is called after the relocs have been generated.
13862    We've been storing mips16 text labels as odd.  Here we convert them
13863    back to even for the convenience of the debugger.  */
13864
13865 void
13866 mips_frob_file_after_relocs ()
13867 {
13868   asymbol **syms;
13869   unsigned int count, i;
13870
13871   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13872     return;
13873
13874   syms = bfd_get_outsymbols (stdoutput);
13875   count = bfd_get_symcount (stdoutput);
13876   for (i = 0; i < count; i++, syms++)
13877     {
13878       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13879           && ((*syms)->value & 1) != 0)
13880         {
13881           (*syms)->value &= ~1;
13882           /* If the symbol has an odd size, it was probably computed
13883              incorrectly, so adjust that as well.  */
13884           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13885             ++elf_symbol (*syms)->internal_elf_sym.st_size;
13886         }
13887     }
13888 }
13889
13890 #endif
13891
13892 /* This function is called whenever a label is defined.  It is used
13893    when handling branch delays; if a branch has a label, we assume we
13894    can not move it.  */
13895
13896 void
13897 mips_define_label (sym)
13898      symbolS *sym;
13899 {
13900   struct insn_label_list *l;
13901
13902   if (free_insn_labels == NULL)
13903     l = (struct insn_label_list *) xmalloc (sizeof *l);
13904   else
13905     {
13906       l = free_insn_labels;
13907       free_insn_labels = l->next;
13908     }
13909
13910   l->label = sym;
13911   l->next = insn_labels;
13912   insn_labels = l;
13913 }
13914 \f
13915 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13916
13917 /* Some special processing for a MIPS ELF file.  */
13918
13919 void
13920 mips_elf_final_processing ()
13921 {
13922   /* Write out the register information.  */
13923   if (mips_abi != N64_ABI)
13924     {
13925       Elf32_RegInfo s;
13926
13927       s.ri_gprmask = mips_gprmask;
13928       s.ri_cprmask[0] = mips_cprmask[0];
13929       s.ri_cprmask[1] = mips_cprmask[1];
13930       s.ri_cprmask[2] = mips_cprmask[2];
13931       s.ri_cprmask[3] = mips_cprmask[3];
13932       /* The gp_value field is set by the MIPS ELF backend.  */
13933
13934       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13935                                        ((Elf32_External_RegInfo *)
13936                                         mips_regmask_frag));
13937     }
13938   else
13939     {
13940       Elf64_Internal_RegInfo s;
13941
13942       s.ri_gprmask = mips_gprmask;
13943       s.ri_pad = 0;
13944       s.ri_cprmask[0] = mips_cprmask[0];
13945       s.ri_cprmask[1] = mips_cprmask[1];
13946       s.ri_cprmask[2] = mips_cprmask[2];
13947       s.ri_cprmask[3] = mips_cprmask[3];
13948       /* The gp_value field is set by the MIPS ELF backend.  */
13949
13950       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13951                                        ((Elf64_External_RegInfo *)
13952                                         mips_regmask_frag));
13953     }
13954
13955   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
13956      sort of BFD interface for this.  */
13957   if (mips_any_noreorder)
13958     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13959   if (mips_pic != NO_PIC)
13960     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13961
13962   /* Set MIPS ELF flags for ASEs.  */
13963   if (file_ase_mips16)
13964     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
13965 #if 0 /* XXX FIXME */
13966   if (file_ase_mips3d)
13967     elf_elfheader (stdoutput)->e_flags |= ???;
13968 #endif
13969   if (file_ase_mdmx)
13970     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
13971
13972   /* Set the MIPS ELF ABI flags.  */
13973   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
13974     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
13975   else if (mips_abi == O64_ABI)
13976     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
13977   else if (mips_abi == EABI_ABI)
13978     {
13979       if (!file_mips_gp32)
13980         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
13981       else
13982         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
13983     }
13984   else if (mips_abi == N32_ABI)
13985     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
13986
13987   /* Nothing to do for N64_ABI.  */
13988
13989   if (mips_32bitmode)
13990     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
13991 }
13992
13993 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
13994 \f
13995 typedef struct proc {
13996   symbolS *isym;
13997   unsigned long reg_mask;
13998   unsigned long reg_offset;
13999   unsigned long fpreg_mask;
14000   unsigned long fpreg_offset;
14001   unsigned long frame_offset;
14002   unsigned long frame_reg;
14003   unsigned long pc_reg;
14004 } procS;
14005
14006 static procS cur_proc;
14007 static procS *cur_proc_ptr;
14008 static int numprocs;
14009
14010 /* Fill in an rs_align_code fragment.  */
14011
14012 void
14013 mips_handle_align (fragp)
14014      fragS *fragp;
14015 {
14016   if (fragp->fr_type != rs_align_code)
14017     return;
14018
14019   if (mips_opts.mips16)
14020     {
14021       static const unsigned char be_nop[] = { 0x65, 0x00 };
14022       static const unsigned char le_nop[] = { 0x00, 0x65 };
14023
14024       int bytes;
14025       char *p;
14026
14027       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14028       p = fragp->fr_literal + fragp->fr_fix;
14029
14030       if (bytes & 1)
14031         {
14032           *p++ = 0;
14033           fragp->fr_fix++;
14034         }
14035
14036       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14037       fragp->fr_var = 2;
14038     }
14039
14040   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
14041 }
14042
14043 static void
14044 md_obj_begin ()
14045 {
14046 }
14047
14048 static void
14049 md_obj_end ()
14050 {
14051   /* check for premature end, nesting errors, etc */
14052   if (cur_proc_ptr)
14053     as_warn (_("missing .end at end of assembly"));
14054 }
14055
14056 static long
14057 get_number ()
14058 {
14059   int negative = 0;
14060   long val = 0;
14061
14062   if (*input_line_pointer == '-')
14063     {
14064       ++input_line_pointer;
14065       negative = 1;
14066     }
14067   if (!ISDIGIT (*input_line_pointer))
14068     as_bad (_("expected simple number"));
14069   if (input_line_pointer[0] == '0')
14070     {
14071       if (input_line_pointer[1] == 'x')
14072         {
14073           input_line_pointer += 2;
14074           while (ISXDIGIT (*input_line_pointer))
14075             {
14076               val <<= 4;
14077               val |= hex_value (*input_line_pointer++);
14078             }
14079           return negative ? -val : val;
14080         }
14081       else
14082         {
14083           ++input_line_pointer;
14084           while (ISDIGIT (*input_line_pointer))
14085             {
14086               val <<= 3;
14087               val |= *input_line_pointer++ - '0';
14088             }
14089           return negative ? -val : val;
14090         }
14091     }
14092   if (!ISDIGIT (*input_line_pointer))
14093     {
14094       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14095               *input_line_pointer, *input_line_pointer);
14096       as_warn (_("invalid number"));
14097       return -1;
14098     }
14099   while (ISDIGIT (*input_line_pointer))
14100     {
14101       val *= 10;
14102       val += *input_line_pointer++ - '0';
14103     }
14104   return negative ? -val : val;
14105 }
14106
14107 /* The .file directive; just like the usual .file directive, but there
14108    is an initial number which is the ECOFF file index.  In the non-ECOFF
14109    case .file implies DWARF-2.  */
14110
14111 static void
14112 s_mips_file (x)
14113      int x ATTRIBUTE_UNUSED;
14114 {
14115   static int first_file_directive = 0;
14116
14117   if (ECOFF_DEBUGGING)
14118     {
14119       get_number ();
14120       s_app_file (0);
14121     }
14122   else
14123     {
14124       char *filename;
14125
14126       filename = dwarf2_directive_file (0);
14127
14128       /* Versions of GCC up to 3.1 start files with a ".file"
14129          directive even for stabs output.  Make sure that this
14130          ".file" is handled.  Note that you need a version of GCC
14131          after 3.1 in order to support DWARF-2 on MIPS.  */
14132       if (filename != NULL && ! first_file_directive)
14133         {
14134           (void) new_logical_line (filename, -1);
14135           s_app_file_string (filename);
14136         }
14137       first_file_directive = 1;
14138     }
14139 }
14140
14141 /* The .loc directive, implying DWARF-2.  */
14142
14143 static void
14144 s_mips_loc (x)
14145      int x ATTRIBUTE_UNUSED;
14146 {
14147   if (!ECOFF_DEBUGGING)
14148     dwarf2_directive_loc (0);
14149 }
14150
14151 /* The .end directive.  */
14152
14153 static void
14154 s_mips_end (x)
14155      int x ATTRIBUTE_UNUSED;
14156 {
14157   symbolS *p;
14158
14159   /* Following functions need their own .frame and .cprestore directives.  */
14160   mips_frame_reg_valid = 0;
14161   mips_cprestore_valid = 0;
14162
14163   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14164     {
14165       p = get_symbol ();
14166       demand_empty_rest_of_line ();
14167     }
14168   else
14169     p = NULL;
14170
14171   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14172     as_warn (_(".end not in text section"));
14173
14174   if (!cur_proc_ptr)
14175     {
14176       as_warn (_(".end directive without a preceding .ent directive."));
14177       demand_empty_rest_of_line ();
14178       return;
14179     }
14180
14181   if (p != NULL)
14182     {
14183       assert (S_GET_NAME (p));
14184       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
14185         as_warn (_(".end symbol does not match .ent symbol."));
14186
14187       if (debug_type == DEBUG_STABS)
14188         stabs_generate_asm_endfunc (S_GET_NAME (p),
14189                                     S_GET_NAME (p));
14190     }
14191   else
14192     as_warn (_(".end directive missing or unknown symbol"));
14193
14194 #ifdef OBJ_ELF
14195   /* Generate a .pdr section.  */
14196   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14197     {
14198       segT saved_seg = now_seg;
14199       subsegT saved_subseg = now_subseg;
14200       valueT dot;
14201       expressionS exp;
14202       char *fragp;
14203
14204       dot = frag_now_fix ();
14205
14206 #ifdef md_flush_pending_output
14207       md_flush_pending_output ();
14208 #endif
14209
14210       assert (pdr_seg);
14211       subseg_set (pdr_seg, 0);
14212
14213       /* Write the symbol.  */
14214       exp.X_op = O_symbol;
14215       exp.X_add_symbol = p;
14216       exp.X_add_number = 0;
14217       emit_expr (&exp, 4);
14218
14219       fragp = frag_more (7 * 4);
14220
14221       md_number_to_chars (fragp,      (valueT) cur_proc_ptr->reg_mask, 4);
14222       md_number_to_chars (fragp +  4, (valueT) cur_proc_ptr->reg_offset, 4);
14223       md_number_to_chars (fragp +  8, (valueT) cur_proc_ptr->fpreg_mask, 4);
14224       md_number_to_chars (fragp + 12, (valueT) cur_proc_ptr->fpreg_offset, 4);
14225       md_number_to_chars (fragp + 16, (valueT) cur_proc_ptr->frame_offset, 4);
14226       md_number_to_chars (fragp + 20, (valueT) cur_proc_ptr->frame_reg, 4);
14227       md_number_to_chars (fragp + 24, (valueT) cur_proc_ptr->pc_reg, 4);
14228
14229       subseg_set (saved_seg, saved_subseg);
14230     }
14231 #endif /* OBJ_ELF */
14232
14233   cur_proc_ptr = NULL;
14234 }
14235
14236 /* The .aent and .ent directives.  */
14237
14238 static void
14239 s_mips_ent (aent)
14240      int aent;
14241 {
14242   symbolS *symbolP;
14243
14244   symbolP = get_symbol ();
14245   if (*input_line_pointer == ',')
14246     ++input_line_pointer;
14247   SKIP_WHITESPACE ();
14248   if (ISDIGIT (*input_line_pointer)
14249       || *input_line_pointer == '-')
14250     get_number ();
14251
14252   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14253     as_warn (_(".ent or .aent not in text section."));
14254
14255   if (!aent && cur_proc_ptr)
14256     as_warn (_("missing .end"));
14257
14258   if (!aent)
14259     {
14260       /* This function needs its own .frame and .cprestore directives.  */
14261       mips_frame_reg_valid = 0;
14262       mips_cprestore_valid = 0;
14263
14264       cur_proc_ptr = &cur_proc;
14265       memset (cur_proc_ptr, '\0', sizeof (procS));
14266
14267       cur_proc_ptr->isym = symbolP;
14268
14269       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14270
14271       ++numprocs;
14272
14273       if (debug_type == DEBUG_STABS)
14274         stabs_generate_asm_func (S_GET_NAME (symbolP),
14275                                  S_GET_NAME (symbolP));
14276     }
14277
14278   demand_empty_rest_of_line ();
14279 }
14280
14281 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14282    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14283    s_mips_frame is used so that we can set the PDR information correctly.
14284    We can't use the ecoff routines because they make reference to the ecoff
14285    symbol table (in the mdebug section).  */
14286
14287 static void
14288 s_mips_frame (ignore)
14289      int ignore ATTRIBUTE_UNUSED;
14290 {
14291 #ifdef OBJ_ELF
14292   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14293     {
14294       long val;
14295
14296       if (cur_proc_ptr == (procS *) NULL)
14297         {
14298           as_warn (_(".frame outside of .ent"));
14299           demand_empty_rest_of_line ();
14300           return;
14301         }
14302
14303       cur_proc_ptr->frame_reg = tc_get_register (1);
14304
14305       SKIP_WHITESPACE ();
14306       if (*input_line_pointer++ != ','
14307           || get_absolute_expression_and_terminator (&val) != ',')
14308         {
14309           as_warn (_("Bad .frame directive"));
14310           --input_line_pointer;
14311           demand_empty_rest_of_line ();
14312           return;
14313         }
14314
14315       cur_proc_ptr->frame_offset = val;
14316       cur_proc_ptr->pc_reg = tc_get_register (0);
14317
14318       demand_empty_rest_of_line ();
14319     }
14320   else
14321 #endif /* OBJ_ELF */
14322     s_ignore (ignore);
14323 }
14324
14325 /* The .fmask and .mask directives. If the mdebug section is present
14326    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14327    embedded targets, s_mips_mask is used so that we can set the PDR
14328    information correctly. We can't use the ecoff routines because they
14329    make reference to the ecoff symbol table (in the mdebug section).  */
14330
14331 static void
14332 s_mips_mask (reg_type)
14333      char reg_type;
14334 {
14335 #ifdef OBJ_ELF
14336   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
14337     {
14338       long mask, off;
14339
14340       if (cur_proc_ptr == (procS *) NULL)
14341         {
14342           as_warn (_(".mask/.fmask outside of .ent"));
14343           demand_empty_rest_of_line ();
14344           return;
14345         }
14346
14347       if (get_absolute_expression_and_terminator (&mask) != ',')
14348         {
14349           as_warn (_("Bad .mask/.fmask directive"));
14350           --input_line_pointer;
14351           demand_empty_rest_of_line ();
14352           return;
14353         }
14354
14355       off = get_absolute_expression ();
14356
14357       if (reg_type == 'F')
14358         {
14359           cur_proc_ptr->fpreg_mask = mask;
14360           cur_proc_ptr->fpreg_offset = off;
14361         }
14362       else
14363         {
14364           cur_proc_ptr->reg_mask = mask;
14365           cur_proc_ptr->reg_offset = off;
14366         }
14367
14368       demand_empty_rest_of_line ();
14369     }
14370   else
14371 #endif /* OBJ_ELF */
14372     s_ignore (reg_type);
14373 }
14374
14375 /* The .loc directive.  */
14376
14377 #if 0
14378 static void
14379 s_loc (x)
14380      int x;
14381 {
14382   symbolS *symbolP;
14383   int lineno;
14384   int addroff;
14385
14386   assert (now_seg == text_section);
14387
14388   lineno = get_number ();
14389   addroff = frag_now_fix ();
14390
14391   symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
14392   S_SET_TYPE (symbolP, N_SLINE);
14393   S_SET_OTHER (symbolP, 0);
14394   S_SET_DESC (symbolP, lineno);
14395   symbolP->sy_segment = now_seg;
14396 }
14397 #endif
14398
14399 /* A table describing all the processors gas knows about.  Names are
14400    matched in the order listed.
14401
14402    To ease comparison, please keep this table in the same order as
14403    gcc's mips_cpu_info_table[].  */
14404 static const struct mips_cpu_info mips_cpu_info_table[] =
14405 {
14406   /* Entries for generic ISAs */
14407   { "mips1",          1,      ISA_MIPS1,      CPU_R3000 },
14408   { "mips2",          1,      ISA_MIPS2,      CPU_R6000 },
14409   { "mips3",          1,      ISA_MIPS3,      CPU_R4000 },
14410   { "mips4",          1,      ISA_MIPS4,      CPU_R8000 },
14411   { "mips5",          1,      ISA_MIPS5,      CPU_MIPS5 },
14412   { "mips32",         1,      ISA_MIPS32,     CPU_MIPS32 },
14413   { "mips32r2",       1,      ISA_MIPS32R2,   CPU_MIPS32R2 },
14414   { "mips64",         1,      ISA_MIPS64,     CPU_MIPS64 },
14415
14416   /* MIPS I */
14417   { "r3000",          0,      ISA_MIPS1,      CPU_R3000 },
14418   { "r2000",          0,      ISA_MIPS1,      CPU_R3000 },
14419   { "r3900",          0,      ISA_MIPS1,      CPU_R3900 },
14420
14421   /* MIPS II */
14422   { "r6000",          0,      ISA_MIPS2,      CPU_R6000 },
14423
14424   /* MIPS III */
14425   { "r4000",          0,      ISA_MIPS3,      CPU_R4000 },
14426   { "r4010",          0,      ISA_MIPS2,      CPU_R4010 },
14427   { "vr4100",         0,      ISA_MIPS3,      CPU_VR4100 },
14428   { "vr4111",         0,      ISA_MIPS3,      CPU_R4111 },
14429   { "vr4120",         0,      ISA_MIPS3,      CPU_VR4120 },
14430   { "vr4130",         0,      ISA_MIPS3,      CPU_VR4120 },
14431   { "vr4181",         0,      ISA_MIPS3,      CPU_R4111 },
14432   { "vr4300",         0,      ISA_MIPS3,      CPU_R4300 },
14433   { "r4400",          0,      ISA_MIPS3,      CPU_R4400 },
14434   { "r4600",          0,      ISA_MIPS3,      CPU_R4600 },
14435   { "orion",          0,      ISA_MIPS3,      CPU_R4600 },
14436   { "r4650",          0,      ISA_MIPS3,      CPU_R4650 },
14437
14438   /* MIPS IV */
14439   { "r8000",          0,      ISA_MIPS4,      CPU_R8000 },
14440   { "r10000",         0,      ISA_MIPS4,      CPU_R10000 },
14441   { "r12000",         0,      ISA_MIPS4,      CPU_R12000 },
14442   { "vr5000",         0,      ISA_MIPS4,      CPU_R5000 },
14443   { "vr5400",         0,      ISA_MIPS4,      CPU_VR5400 },
14444   { "vr5500",         0,      ISA_MIPS4,      CPU_VR5500 },
14445   { "rm5200",         0,      ISA_MIPS4,      CPU_R5000 },
14446   { "rm5230",         0,      ISA_MIPS4,      CPU_R5000 },
14447   { "rm5231",         0,      ISA_MIPS4,      CPU_R5000 },
14448   { "rm5261",         0,      ISA_MIPS4,      CPU_R5000 },
14449   { "rm5721",         0,      ISA_MIPS4,      CPU_R5000 },
14450   { "r7000",          0,      ISA_MIPS4,      CPU_R5000 },
14451
14452   /* MIPS 32 */
14453   { "4kc",            0,      ISA_MIPS32,     CPU_MIPS32, },
14454   { "4km",            0,      ISA_MIPS32,     CPU_MIPS32 },
14455   { "4kp",            0,      ISA_MIPS32,     CPU_MIPS32 },
14456
14457   /* MIPS 64 */
14458   { "5kc",            0,      ISA_MIPS64,     CPU_MIPS64 },
14459   { "20kc",           0,      ISA_MIPS64,     CPU_MIPS64 },
14460
14461   /* Broadcom SB-1 CPU core */
14462   { "sb1",            0,      ISA_MIPS64,     CPU_SB1 },
14463
14464   /* End marker */
14465   { NULL, 0, 0, 0 }
14466 };
14467
14468
14469 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14470    with a final "000" replaced by "k".  Ignore case.
14471
14472    Note: this function is shared between GCC and GAS.  */
14473
14474 static bfd_boolean
14475 mips_strict_matching_cpu_name_p (canonical, given)
14476      const char *canonical, *given;
14477 {
14478   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14479     given++, canonical++;
14480
14481   return ((*given == 0 && *canonical == 0)
14482           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14483 }
14484
14485
14486 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14487    CPU name.  We've traditionally allowed a lot of variation here.
14488
14489    Note: this function is shared between GCC and GAS.  */
14490
14491 static bfd_boolean
14492 mips_matching_cpu_name_p (canonical, given)
14493      const char *canonical, *given;
14494 {
14495   /* First see if the name matches exactly, or with a final "000"
14496      turned into "k".  */
14497   if (mips_strict_matching_cpu_name_p (canonical, given))
14498     return TRUE;
14499
14500   /* If not, try comparing based on numerical designation alone.
14501      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14502   if (TOLOWER (*given) == 'r')
14503     given++;
14504   if (!ISDIGIT (*given))
14505     return FALSE;
14506
14507   /* Skip over some well-known prefixes in the canonical name,
14508      hoping to find a number there too.  */
14509   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14510     canonical += 2;
14511   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14512     canonical += 2;
14513   else if (TOLOWER (canonical[0]) == 'r')
14514     canonical += 1;
14515
14516   return mips_strict_matching_cpu_name_p (canonical, given);
14517 }
14518
14519
14520 /* Parse an option that takes the name of a processor as its argument.
14521    OPTION is the name of the option and CPU_STRING is the argument.
14522    Return the corresponding processor enumeration if the CPU_STRING is
14523    recognized, otherwise report an error and return null.
14524
14525    A similar function exists in GCC.  */
14526
14527 static const struct mips_cpu_info *
14528 mips_parse_cpu (option, cpu_string)
14529      const char *option, *cpu_string;
14530 {
14531   const struct mips_cpu_info *p;
14532
14533   /* 'from-abi' selects the most compatible architecture for the given
14534      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14535      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14536      version.  Look first at the -mgp options, if given, otherwise base
14537      the choice on MIPS_DEFAULT_64BIT.
14538
14539      Treat NO_ABI like the EABIs.  One reason to do this is that the
14540      plain 'mips' and 'mips64' configs have 'from-abi' as their default
14541      architecture.  This code picks MIPS I for 'mips' and MIPS III for
14542      'mips64', just as we did in the days before 'from-abi'.  */
14543   if (strcasecmp (cpu_string, "from-abi") == 0)
14544     {
14545       if (ABI_NEEDS_32BIT_REGS (mips_abi))
14546         return mips_cpu_info_from_isa (ISA_MIPS1);
14547
14548       if (ABI_NEEDS_64BIT_REGS (mips_abi))
14549         return mips_cpu_info_from_isa (ISA_MIPS3);
14550
14551       if (file_mips_gp32 >= 0)
14552         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14553
14554       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14555                                      ? ISA_MIPS3
14556                                      : ISA_MIPS1);
14557     }
14558
14559   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14560   if (strcasecmp (cpu_string, "default") == 0)
14561     return 0;
14562
14563   for (p = mips_cpu_info_table; p->name != 0; p++)
14564     if (mips_matching_cpu_name_p (p->name, cpu_string))
14565       return p;
14566
14567   as_bad ("Bad value (%s) for %s", cpu_string, option);
14568   return 0;
14569 }
14570
14571 /* Return the canonical processor information for ISA (a member of the
14572    ISA_MIPS* enumeration).  */
14573
14574 static const struct mips_cpu_info *
14575 mips_cpu_info_from_isa (isa)
14576      int isa;
14577 {
14578   int i;
14579
14580   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14581     if (mips_cpu_info_table[i].is_isa
14582         && isa == mips_cpu_info_table[i].isa)
14583       return (&mips_cpu_info_table[i]);
14584
14585   return NULL;
14586 }
14587 \f
14588 static void
14589 show (stream, string, col_p, first_p)
14590      FILE *stream;
14591      const char *string;
14592      int *col_p;
14593      int *first_p;
14594 {
14595   if (*first_p)
14596     {
14597       fprintf (stream, "%24s", "");
14598       *col_p = 24;
14599     }
14600   else
14601     {
14602       fprintf (stream, ", ");
14603       *col_p += 2;
14604     }
14605
14606   if (*col_p + strlen (string) > 72)
14607     {
14608       fprintf (stream, "\n%24s", "");
14609       *col_p = 24;
14610     }
14611
14612   fprintf (stream, "%s", string);
14613   *col_p += strlen (string);
14614
14615   *first_p = 0;
14616 }
14617
14618 void
14619 md_show_usage (stream)
14620      FILE *stream;
14621 {
14622   int column, first;
14623   size_t i;
14624
14625   fprintf (stream, _("\
14626 MIPS options:\n\
14627 -membedded-pic          generate embedded position independent code\n\
14628 -EB                     generate big endian output\n\
14629 -EL                     generate little endian output\n\
14630 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
14631 -G NUM                  allow referencing objects up to NUM bytes\n\
14632                         implicitly with the gp register [default 8]\n"));
14633   fprintf (stream, _("\
14634 -mips1                  generate MIPS ISA I instructions\n\
14635 -mips2                  generate MIPS ISA II instructions\n\
14636 -mips3                  generate MIPS ISA III instructions\n\
14637 -mips4                  generate MIPS ISA IV instructions\n\
14638 -mips5                  generate MIPS ISA V instructions\n\
14639 -mips32                 generate MIPS32 ISA instructions\n\
14640 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
14641 -mips64                 generate MIPS64 ISA instructions\n\
14642 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
14643
14644   first = 1;
14645
14646   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14647     show (stream, mips_cpu_info_table[i].name, &column, &first);
14648   show (stream, "from-abi", &column, &first);
14649   fputc ('\n', stream);
14650
14651   fprintf (stream, _("\
14652 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14653 -no-mCPU                don't generate code specific to CPU.\n\
14654                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
14655
14656   first = 1;
14657
14658   show (stream, "3900", &column, &first);
14659   show (stream, "4010", &column, &first);
14660   show (stream, "4100", &column, &first);
14661   show (stream, "4650", &column, &first);
14662   fputc ('\n', stream);
14663
14664   fprintf (stream, _("\
14665 -mips16                 generate mips16 instructions\n\
14666 -no-mips16              do not generate mips16 instructions\n"));
14667   fprintf (stream, _("\
14668 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
14669 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
14670 -O0                     remove unneeded NOPs, do not swap branches\n\
14671 -O                      remove unneeded NOPs and swap branches\n\
14672 -n                      warn about NOPs generated from macros\n\
14673 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
14674 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
14675 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
14676 #ifdef OBJ_ELF
14677   fprintf (stream, _("\
14678 -KPIC, -call_shared     generate SVR4 position independent code\n\
14679 -non_shared             do not generate position independent code\n\
14680 -xgot                   assume a 32 bit GOT\n\
14681 -mabi=ABI               create ABI conformant object file for:\n"));
14682
14683   first = 1;
14684
14685   show (stream, "32", &column, &first);
14686   show (stream, "o64", &column, &first);
14687   show (stream, "n32", &column, &first);
14688   show (stream, "64", &column, &first);
14689   show (stream, "eabi", &column, &first);
14690
14691   fputc ('\n', stream);
14692
14693   fprintf (stream, _("\
14694 -32                     create o32 ABI object file (default)\n\
14695 -n32                    create n32 ABI object file\n\
14696 -64                     create 64 ABI object file\n"));
14697 #endif
14698 }
14699
14700 enum dwarf2_format
14701 mips_dwarf2_format ()
14702 {
14703   if (mips_abi == N64_ABI)
14704     {
14705 #ifdef TE_IRIX
14706       return dwarf2_format_64bit_irix;
14707 #else
14708       return dwarf2_format_64bit;
14709 #endif
14710     }
14711   else
14712     return dwarf2_format_32bit;
14713 }