b5aca914d1e70a4c52ff11f8355d97f41527b5d9
[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,
3    2003, 2004 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 #include <stdarg.h>
32
33 #include "opcode/mips.h"
34 #include "itbl-ops.h"
35 #include "dwarf2dbg.h"
36
37 #ifdef DEBUG
38 #define DBG(x) printf x
39 #else
40 #define DBG(x)
41 #endif
42
43 #ifdef OBJ_MAYBE_ELF
44 /* Clean up namespace so we can include obj-elf.h too.  */
45 static int mips_output_flavor (void);
46 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47 #undef OBJ_PROCESS_STAB
48 #undef OUTPUT_FLAVOR
49 #undef S_GET_ALIGN
50 #undef S_GET_SIZE
51 #undef S_SET_ALIGN
52 #undef S_SET_SIZE
53 #undef obj_frob_file
54 #undef obj_frob_file_after_relocs
55 #undef obj_frob_symbol
56 #undef obj_pop_insert
57 #undef obj_sec_sym_ok_for_reloc
58 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60 #include "obj-elf.h"
61 /* Fix any of them that we actually care about.  */
62 #undef OUTPUT_FLAVOR
63 #define OUTPUT_FLAVOR mips_output_flavor()
64 #endif
65
66 #if defined (OBJ_ELF)
67 #include "elf/mips.h"
68 #endif
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections.  Off by default on IRIX: the native
78    linker doesn't know about and discards them, but relocations against them
79    remain, leading to rld crashes.  */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89 static char *mips_regmask_frag;
90 #endif
91
92 #define ZERO 0
93 #define AT  1
94 #define TREG 24
95 #define PIC_CALL_REG 25
96 #define KT0 26
97 #define KT1 27
98 #define GP  28
99 #define SP  29
100 #define FP  30
101 #define RA  31
102
103 #define ILLEGAL_REG (32)
104
105 /* Allow override of standard little-endian ECOFF format.  */
106
107 #ifndef ECOFF_LITTLE_FORMAT
108 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
109 #endif
110
111 extern int target_big_endian;
112
113 /* The name of the readonly data section.  */
114 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
115                             ? ".rdata" \
116                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
117                             ? ".rdata" \
118                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
119                             ? ".rodata" \
120                             : (abort (), ""))
121
122 /* The ABI to use.  */
123 enum mips_abi_level
124 {
125   NO_ABI = 0,
126   O32_ABI,
127   O64_ABI,
128   N32_ABI,
129   N64_ABI,
130   EABI_ABI
131 };
132
133 /* MIPS ABI we are using for this output file.  */
134 static enum mips_abi_level mips_abi = NO_ABI;
135
136 /* Whether or not we have code that can call pic code.  */
137 int mips_abicalls = FALSE;
138
139 /* This is the set of options which may be modified by the .set
140    pseudo-op.  We use a struct so that .set push and .set pop are more
141    reliable.  */
142
143 struct mips_set_options
144 {
145   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
146      if it has not been initialized.  Changed by `.set mipsN', and the
147      -mipsN command line option, and the default CPU.  */
148   int isa;
149   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
150      if they have not been initialized.  Changed by `.set <asename>', by
151      command line options, and based on the default architecture.  */
152   int ase_mips3d;
153   int ase_mdmx;
154   /* Whether we are assembling for the mips16 processor.  0 if we are
155      not, 1 if we are, and -1 if the value has not been initialized.
156      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
157      -nomips16 command line options, and the default CPU.  */
158   int mips16;
159   /* Non-zero if we should not reorder instructions.  Changed by `.set
160      reorder' and `.set noreorder'.  */
161   int noreorder;
162   /* Non-zero if we should not permit the $at ($1) register to be used
163      in instructions.  Changed by `.set at' and `.set noat'.  */
164   int noat;
165   /* Non-zero if we should warn when a macro instruction expands into
166      more than one machine instruction.  Changed by `.set nomacro' and
167      `.set macro'.  */
168   int warn_about_macros;
169   /* Non-zero if we should not move instructions.  Changed by `.set
170      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
171   int nomove;
172   /* Non-zero if we should not optimize branches by moving the target
173      of the branch into the delay slot.  Actually, we don't perform
174      this optimization anyhow.  Changed by `.set bopt' and `.set
175      nobopt'.  */
176   int nobopt;
177   /* Non-zero if we should not autoextend mips16 instructions.
178      Changed by `.set autoextend' and `.set noautoextend'.  */
179   int noautoextend;
180   /* Restrict general purpose registers and floating point registers
181      to 32 bit.  This is initially determined when -mgp32 or -mfp32
182      is passed but can changed if the assembler code uses .set mipsN.  */
183   int gp32;
184   int fp32;
185   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
186      command line option, and the default CPU.  */
187   int arch;
188 };
189
190 /* True if -mgp32 was passed.  */
191 static int file_mips_gp32 = -1;
192
193 /* True if -mfp32 was passed.  */
194 static int file_mips_fp32 = -1;
195
196 /* This is the struct we use to hold the current set of options.  Note
197    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
198    -1 to indicate that they have not been initialized.  */
199
200 static struct mips_set_options mips_opts =
201 {
202   ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN
203 };
204
205 /* These variables are filled in with the masks of registers used.
206    The object format code reads them and puts them in the appropriate
207    place.  */
208 unsigned long mips_gprmask;
209 unsigned long mips_cprmask[4];
210
211 /* MIPS ISA we are using for this output file.  */
212 static int file_mips_isa = ISA_UNKNOWN;
213
214 /* True if -mips16 was passed or implied by arguments passed on the
215    command line (e.g., by -march).  */
216 static int file_ase_mips16;
217
218 /* True if -mips3d was passed or implied by arguments passed on the
219    command line (e.g., by -march).  */
220 static int file_ase_mips3d;
221
222 /* True if -mdmx was passed or implied by arguments passed on the
223    command line (e.g., by -march).  */
224 static int file_ase_mdmx;
225
226 /* The argument of the -march= flag.  The architecture we are assembling.  */
227 static int file_mips_arch = CPU_UNKNOWN;
228 static const char *mips_arch_string;
229
230 /* The argument of the -mtune= flag.  The architecture for which we
231    are optimizing.  */
232 static int mips_tune = CPU_UNKNOWN;
233 static const char *mips_tune_string;
234
235 /* True when generating 32-bit code for a 64-bit processor.  */
236 static int mips_32bitmode = 0;
237
238 /* True if the given ABI requires 32-bit registers.  */
239 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
240
241 /* Likewise 64-bit registers.  */
242 #define ABI_NEEDS_64BIT_REGS(ABI) \
243   ((ABI) == N32_ABI               \
244    || (ABI) == N64_ABI            \
245    || (ABI) == O64_ABI)
246
247 /*  Return true if ISA supports 64 bit gp register instructions.  */
248 #define ISA_HAS_64BIT_REGS(ISA) (    \
249    (ISA) == ISA_MIPS3                \
250    || (ISA) == ISA_MIPS4             \
251    || (ISA) == ISA_MIPS5             \
252    || (ISA) == ISA_MIPS64            \
253    || (ISA) == ISA_MIPS64R2          \
254    )
255
256 /* Return true if ISA supports 64-bit right rotate (dror et al.)
257    instructions.  */
258 #define ISA_HAS_DROR(ISA) (     \
259    (ISA) == ISA_MIPS64R2        \
260    )
261
262 /* Return true if ISA supports 32-bit right rotate (ror et al.)
263    instructions.  */
264 #define ISA_HAS_ROR(ISA) (      \
265    (ISA) == ISA_MIPS32R2        \
266    || (ISA) == ISA_MIPS64R2     \
267    )
268
269 #define HAVE_32BIT_GPRS                            \
270     (mips_opts.gp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
271
272 #define HAVE_32BIT_FPRS                            \
273     (mips_opts.fp32 || ! ISA_HAS_64BIT_REGS (mips_opts.isa))
274
275 #define HAVE_64BIT_GPRS (! HAVE_32BIT_GPRS)
276 #define HAVE_64BIT_FPRS (! HAVE_32BIT_FPRS)
277
278 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
279
280 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
281
282 /* True if relocations are stored in-place.  */
283 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
284
285 /* We can only have 64bit addresses if the object file format supports it.  */
286 #define HAVE_32BIT_ADDRESSES                           \
287    (HAVE_32BIT_GPRS                                    \
288     || (bfd_arch_bits_per_address (stdoutput) == 32    \
289         || ! HAVE_64BIT_OBJECTS))                      \
290
291 #define HAVE_64BIT_ADDRESSES (! HAVE_32BIT_ADDRESSES)
292
293 /* Addresses are loaded in different ways, depending on the address size
294    in use.  The n32 ABI Documentation also mandates the use of additions
295    with overflow checking, but existing implementations don't follow it.  */
296 #define ADDRESS_ADD_INSN                                                \
297    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
298
299 #define ADDRESS_ADDI_INSN                                               \
300    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
301
302 #define ADDRESS_LOAD_INSN                                               \
303    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
304
305 #define ADDRESS_STORE_INSN                                              \
306    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
307
308 /* Return true if the given CPU supports the MIPS16 ASE.  */
309 #define CPU_HAS_MIPS16(cpu)                                             \
310    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
311     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
312
313 /* Return true if the given CPU supports the MIPS3D ASE.  */
314 #define CPU_HAS_MIPS3D(cpu)     ((cpu) == CPU_SB1      \
315                                  )
316
317 /* Return true if the given CPU supports the MDMX ASE.  */
318 #define CPU_HAS_MDMX(cpu)       (FALSE                 \
319                                  )
320
321 /* True if CPU has a dror instruction.  */
322 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
323
324 /* True if CPU has a ror instruction.  */
325 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
326
327 /* True if mflo and mfhi can be immediately followed by instructions
328    which write to the HI and LO registers.
329
330    According to MIPS specifications, MIPS ISAs I, II, and III need
331    (at least) two instructions between the reads of HI/LO and
332    instructions which write them, and later ISAs do not.  Contradicting
333    the MIPS specifications, some MIPS IV processor user manuals (e.g.
334    the UM for the NEC Vr5000) document needing the instructions between
335    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
336    MIPS64 and later ISAs to have the interlocks, plus any specific
337    earlier-ISA CPUs for which CPU documentation declares that the
338    instructions are really interlocked.  */
339 #define hilo_interlocks \
340   (mips_opts.isa == ISA_MIPS32                        \
341    || mips_opts.isa == ISA_MIPS32R2                   \
342    || mips_opts.isa == ISA_MIPS64                     \
343    || mips_opts.isa == ISA_MIPS64R2                   \
344    || mips_opts.arch == CPU_R4010                     \
345    || mips_opts.arch == CPU_R10000                    \
346    || mips_opts.arch == CPU_R12000                    \
347    || mips_opts.arch == CPU_RM7000                    \
348    || mips_opts.arch == CPU_VR5500                    \
349    )
350
351 /* Whether the processor uses hardware interlocks to protect reads
352    from the GPRs after they are loaded from memory, and thus does not
353    require nops to be inserted.  This applies to instructions marked
354    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
355    level I.  */
356 #define gpr_interlocks \
357   (mips_opts.isa != ISA_MIPS1  \
358    || mips_opts.arch == CPU_R3900)
359
360 /* Whether the processor uses hardware interlocks to avoid delays
361    required by coprocessor instructions, and thus does not require
362    nops to be inserted.  This applies to instructions marked
363    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
364    between instructions marked INSN_WRITE_COND_CODE and ones marked
365    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
366    levels I, II, and III.  */
367 /* Itbl support may require additional care here.  */
368 #define cop_interlocks                                \
369   ((mips_opts.isa != ISA_MIPS1                        \
370     && mips_opts.isa != ISA_MIPS2                     \
371     && mips_opts.isa != ISA_MIPS3)                    \
372    || mips_opts.arch == CPU_R4300                     \
373    )
374
375 /* Whether the processor uses hardware interlocks to protect reads
376    from coprocessor registers after they are loaded from memory, and
377    thus does not require nops to be inserted.  This applies to
378    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
379    requires at MIPS ISA level I.  */
380 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
381
382 /* Is this a mfhi or mflo instruction?  */
383 #define MF_HILO_INSN(PINFO) \
384           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
385
386 /* MIPS PIC level.  */
387
388 enum mips_pic_level mips_pic;
389
390 /* 1 if we should generate 32 bit offsets from the $gp register in
391    SVR4_PIC mode.  Currently has no meaning in other modes.  */
392 static int mips_big_got = 0;
393
394 /* 1 if trap instructions should used for overflow rather than break
395    instructions.  */
396 static int mips_trap = 0;
397
398 /* 1 if double width floating point constants should not be constructed
399    by assembling two single width halves into two single width floating
400    point registers which just happen to alias the double width destination
401    register.  On some architectures this aliasing can be disabled by a bit
402    in the status register, and the setting of this bit cannot be determined
403    automatically at assemble time.  */
404 static int mips_disable_float_construction;
405
406 /* Non-zero if any .set noreorder directives were used.  */
407
408 static int mips_any_noreorder;
409
410 /* Non-zero if nops should be inserted when the register referenced in
411    an mfhi/mflo instruction is read in the next two instructions.  */
412 static int mips_7000_hilo_fix;
413
414 /* The size of the small data section.  */
415 static unsigned int g_switch_value = 8;
416 /* Whether the -G option was used.  */
417 static int g_switch_seen = 0;
418
419 #define N_RMASK 0xc4
420 #define N_VFP   0xd4
421
422 /* If we can determine in advance that GP optimization won't be
423    possible, we can skip the relaxation stuff that tries to produce
424    GP-relative references.  This makes delay slot optimization work
425    better.
426
427    This function can only provide a guess, but it seems to work for
428    gcc output.  It needs to guess right for gcc, otherwise gcc
429    will put what it thinks is a GP-relative instruction in a branch
430    delay slot.
431
432    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
433    fixed it for the non-PIC mode.  KR 95/04/07  */
434 static int nopic_need_relax (symbolS *, int);
435
436 /* handle of the OPCODE hash table */
437 static struct hash_control *op_hash = NULL;
438
439 /* The opcode hash table we use for the mips16.  */
440 static struct hash_control *mips16_op_hash = NULL;
441
442 /* This array holds the chars that always start a comment.  If the
443     pre-processor is disabled, these aren't very useful */
444 const char comment_chars[] = "#";
445
446 /* This array holds the chars that only start a comment at the beginning of
447    a line.  If the line seems to have the form '# 123 filename'
448    .line and .file directives will appear in the pre-processed output */
449 /* Note that input_file.c hand checks for '#' at the beginning of the
450    first line of the input file.  This is because the compiler outputs
451    #NO_APP at the beginning of its output.  */
452 /* Also note that C style comments are always supported.  */
453 const char line_comment_chars[] = "#";
454
455 /* This array holds machine specific line separator characters.  */
456 const char line_separator_chars[] = ";";
457
458 /* Chars that can be used to separate mant from exp in floating point nums */
459 const char EXP_CHARS[] = "eE";
460
461 /* Chars that mean this number is a floating point constant */
462 /* As in 0f12.456 */
463 /* or    0d1.2345e12 */
464 const char FLT_CHARS[] = "rRsSfFdDxXpP";
465
466 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
467    changed in read.c .  Ideally it shouldn't have to know about it at all,
468    but nothing is ideal around here.
469  */
470
471 static char *insn_error;
472
473 static int auto_align = 1;
474
475 /* When outputting SVR4 PIC code, the assembler needs to know the
476    offset in the stack frame from which to restore the $gp register.
477    This is set by the .cprestore pseudo-op, and saved in this
478    variable.  */
479 static offsetT mips_cprestore_offset = -1;
480
481 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
482    more optimizations, it can use a register value instead of a memory-saved
483    offset and even an other register than $gp as global pointer.  */
484 static offsetT mips_cpreturn_offset = -1;
485 static int mips_cpreturn_register = -1;
486 static int mips_gp_register = GP;
487 static int mips_gprel_offset = 0;
488
489 /* Whether mips_cprestore_offset has been set in the current function
490    (or whether it has already been warned about, if not).  */
491 static int mips_cprestore_valid = 0;
492
493 /* This is the register which holds the stack frame, as set by the
494    .frame pseudo-op.  This is needed to implement .cprestore.  */
495 static int mips_frame_reg = SP;
496
497 /* Whether mips_frame_reg has been set in the current function
498    (or whether it has already been warned about, if not).  */
499 static int mips_frame_reg_valid = 0;
500
501 /* To output NOP instructions correctly, we need to keep information
502    about the previous two instructions.  */
503
504 /* Whether we are optimizing.  The default value of 2 means to remove
505    unneeded NOPs and swap branch instructions when possible.  A value
506    of 1 means to not swap branches.  A value of 0 means to always
507    insert NOPs.  */
508 static int mips_optimize = 2;
509
510 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
511    equivalent to seeing no -g option at all.  */
512 static int mips_debug = 0;
513
514 /* The previous instruction.  */
515 static struct mips_cl_insn prev_insn;
516
517 /* The instruction before prev_insn.  */
518 static struct mips_cl_insn prev_prev_insn;
519
520 /* If we don't want information for prev_insn or prev_prev_insn, we
521    point the insn_mo field at this dummy integer.  */
522 static const struct mips_opcode dummy_opcode = { NULL, NULL, 0, 0, 0, 0 };
523
524 /* Non-zero if prev_insn is valid.  */
525 static int prev_insn_valid;
526
527 /* The frag for the previous instruction.  */
528 static struct frag *prev_insn_frag;
529
530 /* The offset into prev_insn_frag for the previous instruction.  */
531 static long prev_insn_where;
532
533 /* The reloc type for the previous instruction, if any.  */
534 static bfd_reloc_code_real_type prev_insn_reloc_type[3];
535
536 /* The reloc for the previous instruction, if any.  */
537 static fixS *prev_insn_fixp[3];
538
539 /* Non-zero if the previous instruction was in a delay slot.  */
540 static int prev_insn_is_delay_slot;
541
542 /* Non-zero if the previous instruction was in a .set noreorder.  */
543 static int prev_insn_unreordered;
544
545 /* Non-zero if the previous instruction uses an extend opcode (if
546    mips16).  */
547 static int prev_insn_extended;
548
549 /* Non-zero if the previous previous instruction was in a .set
550    noreorder.  */
551 static int prev_prev_insn_unreordered;
552
553 /* If this is set, it points to a frag holding nop instructions which
554    were inserted before the start of a noreorder section.  If those
555    nops turn out to be unnecessary, the size of the frag can be
556    decreased.  */
557 static fragS *prev_nop_frag;
558
559 /* The number of nop instructions we created in prev_nop_frag.  */
560 static int prev_nop_frag_holds;
561
562 /* The number of nop instructions that we know we need in
563    prev_nop_frag.  */
564 static int prev_nop_frag_required;
565
566 /* The number of instructions we've seen since prev_nop_frag.  */
567 static int prev_nop_frag_since;
568
569 /* For ECOFF and ELF, relocations against symbols are done in two
570    parts, with a HI relocation and a LO relocation.  Each relocation
571    has only 16 bits of space to store an addend.  This means that in
572    order for the linker to handle carries correctly, it must be able
573    to locate both the HI and the LO relocation.  This means that the
574    relocations must appear in order in the relocation table.
575
576    In order to implement this, we keep track of each unmatched HI
577    relocation.  We then sort them so that they immediately precede the
578    corresponding LO relocation.  */
579
580 struct mips_hi_fixup
581 {
582   /* Next HI fixup.  */
583   struct mips_hi_fixup *next;
584   /* This fixup.  */
585   fixS *fixp;
586   /* The section this fixup is in.  */
587   segT seg;
588 };
589
590 /* The list of unmatched HI relocs.  */
591
592 static struct mips_hi_fixup *mips_hi_fixup_list;
593
594 /* The frag containing the last explicit relocation operator.
595    Null if explicit relocations have not been used.  */
596
597 static fragS *prev_reloc_op_frag;
598
599 /* Map normal MIPS register numbers to mips16 register numbers.  */
600
601 #define X ILLEGAL_REG
602 static const int mips32_to_16_reg_map[] =
603 {
604   X, X, 2, 3, 4, 5, 6, 7,
605   X, X, X, X, X, X, X, X,
606   0, 1, X, X, X, X, X, X,
607   X, X, X, X, X, X, X, X
608 };
609 #undef X
610
611 /* Map mips16 register numbers to normal MIPS register numbers.  */
612
613 static const unsigned int mips16_to_32_reg_map[] =
614 {
615   16, 17, 2, 3, 4, 5, 6, 7
616 };
617
618 static int mips_fix_vr4120;
619
620 /* We don't relax branches by default, since this causes us to expand
621    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
622    fail to compute the offset before expanding the macro to the most
623    efficient expansion.  */
624
625 static int mips_relax_branch;
626 \f
627 /* The expansion of many macros depends on the type of symbol that
628    they refer to.  For example, when generating position-dependent code,
629    a macro that refers to a symbol may have two different expansions,
630    one which uses GP-relative addresses and one which uses absolute
631    addresses.  When generating SVR4-style PIC, a macro may have
632    different expansions for local and global symbols.
633
634    We handle these situations by generating both sequences and putting
635    them in variant frags.  In position-dependent code, the first sequence
636    will be the GP-relative one and the second sequence will be the
637    absolute one.  In SVR4 PIC, the first sequence will be for global
638    symbols and the second will be for local symbols.
639
640    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
641    SECOND are the lengths of the two sequences in bytes.  These fields
642    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
643    the subtype has the following flags:
644
645    RELAX_USE_SECOND
646         Set if it has been decided that we should use the second
647         sequence instead of the first.
648
649    RELAX_SECOND_LONGER
650         Set in the first variant frag if the macro's second implementation
651         is longer than its first.  This refers to the macro as a whole,
652         not an individual relaxation.
653
654    RELAX_NOMACRO
655         Set in the first variant frag if the macro appeared in a .set nomacro
656         block and if one alternative requires a warning but the other does not.
657
658    RELAX_DELAY_SLOT
659         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
660         delay slot.
661
662    The frag's "opcode" points to the first fixup for relaxable code.
663
664    Relaxable macros are generated using a sequence such as:
665
666       relax_start (SYMBOL);
667       ... generate first expansion ...
668       relax_switch ();
669       ... generate second expansion ...
670       relax_end ();
671
672    The code and fixups for the unwanted alternative are discarded
673    by md_convert_frag.  */
674 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
675
676 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
677 #define RELAX_SECOND(X) ((X) & 0xff)
678 #define RELAX_USE_SECOND 0x10000
679 #define RELAX_SECOND_LONGER 0x20000
680 #define RELAX_NOMACRO 0x40000
681 #define RELAX_DELAY_SLOT 0x80000
682
683 /* Branch without likely bit.  If label is out of range, we turn:
684
685         beq reg1, reg2, label
686         delay slot
687
688    into
689
690         bne reg1, reg2, 0f
691         nop
692         j label
693      0: delay slot
694
695    with the following opcode replacements:
696
697         beq <-> bne
698         blez <-> bgtz
699         bltz <-> bgez
700         bc1f <-> bc1t
701
702         bltzal <-> bgezal  (with jal label instead of j label)
703
704    Even though keeping the delay slot instruction in the delay slot of
705    the branch would be more efficient, it would be very tricky to do
706    correctly, because we'd have to introduce a variable frag *after*
707    the delay slot instruction, and expand that instead.  Let's do it
708    the easy way for now, even if the branch-not-taken case now costs
709    one additional instruction.  Out-of-range branches are not supposed
710    to be common, anyway.
711
712    Branch likely.  If label is out of range, we turn:
713
714         beql reg1, reg2, label
715         delay slot (annulled if branch not taken)
716
717    into
718
719         beql reg1, reg2, 1f
720         nop
721         beql $0, $0, 2f
722         nop
723      1: j[al] label
724         delay slot (executed only if branch taken)
725      2:
726
727    It would be possible to generate a shorter sequence by losing the
728    likely bit, generating something like:
729
730         bne reg1, reg2, 0f
731         nop
732         j[al] label
733         delay slot (executed only if branch taken)
734      0:
735
736         beql -> bne
737         bnel -> beq
738         blezl -> bgtz
739         bgtzl -> blez
740         bltzl -> bgez
741         bgezl -> bltz
742         bc1fl -> bc1t
743         bc1tl -> bc1f
744
745         bltzall -> bgezal  (with jal label instead of j label)
746         bgezall -> bltzal  (ditto)
747
748
749    but it's not clear that it would actually improve performance.  */
750 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
751   ((relax_substateT) \
752    (0xc0000000 \
753     | ((toofar) ? 1 : 0) \
754     | ((link) ? 2 : 0) \
755     | ((likely) ? 4 : 0) \
756     | ((uncond) ? 8 : 0)))
757 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
758 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
759 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
760 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
761 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
762
763 /* For mips16 code, we use an entirely different form of relaxation.
764    mips16 supports two versions of most instructions which take
765    immediate values: a small one which takes some small value, and a
766    larger one which takes a 16 bit value.  Since branches also follow
767    this pattern, relaxing these values is required.
768
769    We can assemble both mips16 and normal MIPS code in a single
770    object.  Therefore, we need to support this type of relaxation at
771    the same time that we support the relaxation described above.  We
772    use the high bit of the subtype field to distinguish these cases.
773
774    The information we store for this type of relaxation is the
775    argument code found in the opcode file for this relocation, whether
776    the user explicitly requested a small or extended form, and whether
777    the relocation is in a jump or jal delay slot.  That tells us the
778    size of the value, and how it should be stored.  We also store
779    whether the fragment is considered to be extended or not.  We also
780    store whether this is known to be a branch to a different section,
781    whether we have tried to relax this frag yet, and whether we have
782    ever extended a PC relative fragment because of a shift count.  */
783 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
784   (0x80000000                                                   \
785    | ((type) & 0xff)                                            \
786    | ((small) ? 0x100 : 0)                                      \
787    | ((ext) ? 0x200 : 0)                                        \
788    | ((dslot) ? 0x400 : 0)                                      \
789    | ((jal_dslot) ? 0x800 : 0))
790 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
791 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
792 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
793 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
794 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
795 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
796 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
797 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
798 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
799 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
800 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
801 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
802
803 /* Is the given value a sign-extended 32-bit value?  */
804 #define IS_SEXT_32BIT_NUM(x)                                            \
805   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
806    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
807
808 /* Is the given value a sign-extended 16-bit value?  */
809 #define IS_SEXT_16BIT_NUM(x)                                            \
810   (((x) &~ (offsetT) 0x7fff) == 0                                       \
811    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
812
813 \f
814 /* Global variables used when generating relaxable macros.  See the
815    comment above RELAX_ENCODE for more details about how relaxation
816    is used.  */
817 static struct {
818   /* 0 if we're not emitting a relaxable macro.
819      1 if we're emitting the first of the two relaxation alternatives.
820      2 if we're emitting the second alternative.  */
821   int sequence;
822
823   /* The first relaxable fixup in the current frag.  (In other words,
824      the first fixup that refers to relaxable code.)  */
825   fixS *first_fixup;
826
827   /* sizes[0] says how many bytes of the first alternative are stored in
828      the current frag.  Likewise sizes[1] for the second alternative.  */
829   unsigned int sizes[2];
830
831   /* The symbol on which the choice of sequence depends.  */
832   symbolS *symbol;
833 } mips_relax;
834 \f
835 /* Global variables used to decide whether a macro needs a warning.  */
836 static struct {
837   /* True if the macro is in a branch delay slot.  */
838   bfd_boolean delay_slot_p;
839
840   /* For relaxable macros, sizes[0] is the length of the first alternative
841      in bytes and sizes[1] is the length of the second alternative.
842      For non-relaxable macros, both elements give the length of the
843      macro in bytes.  */
844   unsigned int sizes[2];
845
846   /* The first variant frag for this macro.  */
847   fragS *first_frag;
848 } mips_macro_warning;
849 \f
850 /* Prototypes for static functions.  */
851
852 #define internalError()                                                 \
853     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
854
855 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
856
857 static void append_insn
858   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
859 static void mips_no_prev_insn (int);
860 static void mips16_macro_build
861   (expressionS *, const char *, const char *, va_list);
862 static void load_register (int, expressionS *, int);
863 static void macro_start (void);
864 static void macro_end (void);
865 static void macro (struct mips_cl_insn * ip);
866 static void mips16_macro (struct mips_cl_insn * ip);
867 #ifdef LOSING_COMPILER
868 static void macro2 (struct mips_cl_insn * ip);
869 #endif
870 static void mips_ip (char *str, struct mips_cl_insn * ip);
871 static void mips16_ip (char *str, struct mips_cl_insn * ip);
872 static void mips16_immed
873   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
874    unsigned long *, bfd_boolean *, unsigned short *);
875 static size_t my_getSmallExpression
876   (expressionS *, bfd_reloc_code_real_type *, char *);
877 static void my_getExpression (expressionS *, char *);
878 static void s_align (int);
879 static void s_change_sec (int);
880 static void s_change_section (int);
881 static void s_cons (int);
882 static void s_float_cons (int);
883 static void s_mips_globl (int);
884 static void s_option (int);
885 static void s_mipsset (int);
886 static void s_abicalls (int);
887 static void s_cpload (int);
888 static void s_cpsetup (int);
889 static void s_cplocal (int);
890 static void s_cprestore (int);
891 static void s_cpreturn (int);
892 static void s_gpvalue (int);
893 static void s_gpword (int);
894 static void s_gpdword (int);
895 static void s_cpadd (int);
896 static void s_insn (int);
897 static void md_obj_begin (void);
898 static void md_obj_end (void);
899 static void s_mips_ent (int);
900 static void s_mips_end (int);
901 static void s_mips_frame (int);
902 static void s_mips_mask (int reg_type);
903 static void s_mips_stab (int);
904 static void s_mips_weakext (int);
905 static void s_mips_file (int);
906 static void s_mips_loc (int);
907 static bfd_boolean pic_need_relax (symbolS *, asection *);
908 static int relaxed_branch_length (fragS *, asection *, int);
909 static int validate_mips_insn (const struct mips_opcode *);
910
911 /* Table and functions used to map between CPU/ISA names, and
912    ISA levels, and CPU numbers.  */
913
914 struct mips_cpu_info
915 {
916   const char *name;           /* CPU or ISA name.  */
917   int is_isa;                 /* Is this an ISA?  (If 0, a CPU.) */
918   int isa;                    /* ISA level.  */
919   int cpu;                    /* CPU number (default CPU if ISA).  */
920 };
921
922 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
923 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
924 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
925 \f
926 /* Pseudo-op table.
927
928    The following pseudo-ops from the Kane and Heinrich MIPS book
929    should be defined here, but are currently unsupported: .alias,
930    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
931
932    The following pseudo-ops from the Kane and Heinrich MIPS book are
933    specific to the type of debugging information being generated, and
934    should be defined by the object format: .aent, .begin, .bend,
935    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
936    .vreg.
937
938    The following pseudo-ops from the Kane and Heinrich MIPS book are
939    not MIPS CPU specific, but are also not specific to the object file
940    format.  This file is probably the best place to define them, but
941    they are not currently supported: .asm0, .endr, .lab, .repeat,
942    .struct.  */
943
944 static const pseudo_typeS mips_pseudo_table[] =
945 {
946   /* MIPS specific pseudo-ops.  */
947   {"option", s_option, 0},
948   {"set", s_mipsset, 0},
949   {"rdata", s_change_sec, 'r'},
950   {"sdata", s_change_sec, 's'},
951   {"livereg", s_ignore, 0},
952   {"abicalls", s_abicalls, 0},
953   {"cpload", s_cpload, 0},
954   {"cpsetup", s_cpsetup, 0},
955   {"cplocal", s_cplocal, 0},
956   {"cprestore", s_cprestore, 0},
957   {"cpreturn", s_cpreturn, 0},
958   {"gpvalue", s_gpvalue, 0},
959   {"gpword", s_gpword, 0},
960   {"gpdword", s_gpdword, 0},
961   {"cpadd", s_cpadd, 0},
962   {"insn", s_insn, 0},
963
964   /* Relatively generic pseudo-ops that happen to be used on MIPS
965      chips.  */
966   {"asciiz", stringer, 1},
967   {"bss", s_change_sec, 'b'},
968   {"err", s_err, 0},
969   {"half", s_cons, 1},
970   {"dword", s_cons, 3},
971   {"weakext", s_mips_weakext, 0},
972
973   /* These pseudo-ops are defined in read.c, but must be overridden
974      here for one reason or another.  */
975   {"align", s_align, 0},
976   {"byte", s_cons, 0},
977   {"data", s_change_sec, 'd'},
978   {"double", s_float_cons, 'd'},
979   {"float", s_float_cons, 'f'},
980   {"globl", s_mips_globl, 0},
981   {"global", s_mips_globl, 0},
982   {"hword", s_cons, 1},
983   {"int", s_cons, 2},
984   {"long", s_cons, 2},
985   {"octa", s_cons, 4},
986   {"quad", s_cons, 3},
987   {"section", s_change_section, 0},
988   {"short", s_cons, 1},
989   {"single", s_float_cons, 'f'},
990   {"stabn", s_mips_stab, 'n'},
991   {"text", s_change_sec, 't'},
992   {"word", s_cons, 2},
993
994   { "extern", ecoff_directive_extern, 0},
995
996   { NULL, NULL, 0 },
997 };
998
999 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1000 {
1001   /* These pseudo-ops should be defined by the object file format.
1002      However, a.out doesn't support them, so we have versions here.  */
1003   {"aent", s_mips_ent, 1},
1004   {"bgnb", s_ignore, 0},
1005   {"end", s_mips_end, 0},
1006   {"endb", s_ignore, 0},
1007   {"ent", s_mips_ent, 0},
1008   {"file", s_mips_file, 0},
1009   {"fmask", s_mips_mask, 'F'},
1010   {"frame", s_mips_frame, 0},
1011   {"loc", s_mips_loc, 0},
1012   {"mask", s_mips_mask, 'R'},
1013   {"verstamp", s_ignore, 0},
1014   { NULL, NULL, 0 },
1015 };
1016
1017 extern void pop_insert (const pseudo_typeS *);
1018
1019 void
1020 mips_pop_insert (void)
1021 {
1022   pop_insert (mips_pseudo_table);
1023   if (! ECOFF_DEBUGGING)
1024     pop_insert (mips_nonecoff_pseudo_table);
1025 }
1026 \f
1027 /* Symbols labelling the current insn.  */
1028
1029 struct insn_label_list
1030 {
1031   struct insn_label_list *next;
1032   symbolS *label;
1033 };
1034
1035 static struct insn_label_list *insn_labels;
1036 static struct insn_label_list *free_insn_labels;
1037
1038 static void mips_clear_insn_labels (void);
1039
1040 static inline void
1041 mips_clear_insn_labels (void)
1042 {
1043   register struct insn_label_list **pl;
1044
1045   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1046     ;
1047   *pl = insn_labels;
1048   insn_labels = NULL;
1049 }
1050 \f
1051 static char *expr_end;
1052
1053 /* Expressions which appear in instructions.  These are set by
1054    mips_ip.  */
1055
1056 static expressionS imm_expr;
1057 static expressionS imm2_expr;
1058 static expressionS offset_expr;
1059
1060 /* Relocs associated with imm_expr and offset_expr.  */
1061
1062 static bfd_reloc_code_real_type imm_reloc[3]
1063   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1064 static bfd_reloc_code_real_type offset_reloc[3]
1065   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1066
1067 /* These are set by mips16_ip if an explicit extension is used.  */
1068
1069 static bfd_boolean mips16_small, mips16_ext;
1070
1071 #ifdef OBJ_ELF
1072 /* The pdr segment for per procedure frame/regmask info.  Not used for
1073    ECOFF debugging.  */
1074
1075 static segT pdr_seg;
1076 #endif
1077
1078 /* The default target format to use.  */
1079
1080 const char *
1081 mips_target_format (void)
1082 {
1083   switch (OUTPUT_FLAVOR)
1084     {
1085     case bfd_target_ecoff_flavour:
1086       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1087     case bfd_target_coff_flavour:
1088       return "pe-mips";
1089     case bfd_target_elf_flavour:
1090 #ifdef TE_TMIPS
1091       /* This is traditional mips.  */
1092       return (target_big_endian
1093               ? (HAVE_64BIT_OBJECTS
1094                  ? "elf64-tradbigmips"
1095                  : (HAVE_NEWABI
1096                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1097               : (HAVE_64BIT_OBJECTS
1098                  ? "elf64-tradlittlemips"
1099                  : (HAVE_NEWABI
1100                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1101 #else
1102       return (target_big_endian
1103               ? (HAVE_64BIT_OBJECTS
1104                  ? "elf64-bigmips"
1105                  : (HAVE_NEWABI
1106                     ? "elf32-nbigmips" : "elf32-bigmips"))
1107               : (HAVE_64BIT_OBJECTS
1108                  ? "elf64-littlemips"
1109                  : (HAVE_NEWABI
1110                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1111 #endif
1112     default:
1113       abort ();
1114       return NULL;
1115     }
1116 }
1117
1118 /* This function is called once, at assembler startup time.  It should
1119    set up all the tables, etc. that the MD part of the assembler will need.  */
1120
1121 void
1122 md_begin (void)
1123 {
1124   register const char *retval = NULL;
1125   int i = 0;
1126   int broken = 0;
1127
1128   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1129     as_warn (_("Could not set architecture and machine"));
1130
1131   op_hash = hash_new ();
1132
1133   for (i = 0; i < NUMOPCODES;)
1134     {
1135       const char *name = mips_opcodes[i].name;
1136
1137       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1138       if (retval != NULL)
1139         {
1140           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1141                    mips_opcodes[i].name, retval);
1142           /* Probably a memory allocation problem?  Give up now.  */
1143           as_fatal (_("Broken assembler.  No assembly attempted."));
1144         }
1145       do
1146         {
1147           if (mips_opcodes[i].pinfo != INSN_MACRO)
1148             {
1149               if (!validate_mips_insn (&mips_opcodes[i]))
1150                 broken = 1;
1151             }
1152           ++i;
1153         }
1154       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1155     }
1156
1157   mips16_op_hash = hash_new ();
1158
1159   i = 0;
1160   while (i < bfd_mips16_num_opcodes)
1161     {
1162       const char *name = mips16_opcodes[i].name;
1163
1164       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1165       if (retval != NULL)
1166         as_fatal (_("internal: can't hash `%s': %s"),
1167                   mips16_opcodes[i].name, retval);
1168       do
1169         {
1170           if (mips16_opcodes[i].pinfo != INSN_MACRO
1171               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1172                   != mips16_opcodes[i].match))
1173             {
1174               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1175                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1176               broken = 1;
1177             }
1178           ++i;
1179         }
1180       while (i < bfd_mips16_num_opcodes
1181              && strcmp (mips16_opcodes[i].name, name) == 0);
1182     }
1183
1184   if (broken)
1185     as_fatal (_("Broken assembler.  No assembly attempted."));
1186
1187   /* We add all the general register names to the symbol table.  This
1188      helps us detect invalid uses of them.  */
1189   for (i = 0; i < 32; i++)
1190     {
1191       char buf[5];
1192
1193       sprintf (buf, "$%d", i);
1194       symbol_table_insert (symbol_new (buf, reg_section, i,
1195                                        &zero_address_frag));
1196     }
1197   symbol_table_insert (symbol_new ("$ra", reg_section, RA,
1198                                    &zero_address_frag));
1199   symbol_table_insert (symbol_new ("$fp", reg_section, FP,
1200                                    &zero_address_frag));
1201   symbol_table_insert (symbol_new ("$sp", reg_section, SP,
1202                                    &zero_address_frag));
1203   symbol_table_insert (symbol_new ("$gp", reg_section, GP,
1204                                    &zero_address_frag));
1205   symbol_table_insert (symbol_new ("$at", reg_section, AT,
1206                                    &zero_address_frag));
1207   symbol_table_insert (symbol_new ("$kt0", reg_section, KT0,
1208                                    &zero_address_frag));
1209   symbol_table_insert (symbol_new ("$kt1", reg_section, KT1,
1210                                    &zero_address_frag));
1211   symbol_table_insert (symbol_new ("$zero", reg_section, ZERO,
1212                                    &zero_address_frag));
1213   symbol_table_insert (symbol_new ("$pc", reg_section, -1,
1214                                    &zero_address_frag));
1215
1216   /* If we don't add these register names to the symbol table, they
1217      may end up being added as regular symbols by operand(), and then
1218      make it to the object file as undefined in case they're not
1219      regarded as local symbols.  They're local in o32, since `$' is a
1220      local symbol prefix, but not in n32 or n64.  */
1221   for (i = 0; i < 8; i++)
1222     {
1223       char buf[6];
1224
1225       sprintf (buf, "$fcc%i", i);
1226       symbol_table_insert (symbol_new (buf, reg_section, -1,
1227                                        &zero_address_frag));
1228     }
1229
1230   mips_no_prev_insn (FALSE);
1231
1232   mips_gprmask = 0;
1233   mips_cprmask[0] = 0;
1234   mips_cprmask[1] = 0;
1235   mips_cprmask[2] = 0;
1236   mips_cprmask[3] = 0;
1237
1238   /* set the default alignment for the text section (2**2) */
1239   record_alignment (text_section, 2);
1240
1241   bfd_set_gp_size (stdoutput, g_switch_value);
1242
1243   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1244     {
1245       /* On a native system, sections must be aligned to 16 byte
1246          boundaries.  When configured for an embedded ELF target, we
1247          don't bother.  */
1248       if (strcmp (TARGET_OS, "elf") != 0)
1249         {
1250           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1251           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1252           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1253         }
1254
1255       /* Create a .reginfo section for register masks and a .mdebug
1256          section for debugging information.  */
1257       {
1258         segT seg;
1259         subsegT subseg;
1260         flagword flags;
1261         segT sec;
1262
1263         seg = now_seg;
1264         subseg = now_subseg;
1265
1266         /* The ABI says this section should be loaded so that the
1267            running program can access it.  However, we don't load it
1268            if we are configured for an embedded target */
1269         flags = SEC_READONLY | SEC_DATA;
1270         if (strcmp (TARGET_OS, "elf") != 0)
1271           flags |= SEC_ALLOC | SEC_LOAD;
1272
1273         if (mips_abi != N64_ABI)
1274           {
1275             sec = subseg_new (".reginfo", (subsegT) 0);
1276
1277             bfd_set_section_flags (stdoutput, sec, flags);
1278             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1279
1280 #ifdef OBJ_ELF
1281             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1282 #endif
1283           }
1284         else
1285           {
1286             /* The 64-bit ABI uses a .MIPS.options section rather than
1287                .reginfo section.  */
1288             sec = subseg_new (".MIPS.options", (subsegT) 0);
1289             bfd_set_section_flags (stdoutput, sec, flags);
1290             bfd_set_section_alignment (stdoutput, sec, 3);
1291
1292 #ifdef OBJ_ELF
1293             /* Set up the option header.  */
1294             {
1295               Elf_Internal_Options opthdr;
1296               char *f;
1297
1298               opthdr.kind = ODK_REGINFO;
1299               opthdr.size = (sizeof (Elf_External_Options)
1300                              + sizeof (Elf64_External_RegInfo));
1301               opthdr.section = 0;
1302               opthdr.info = 0;
1303               f = frag_more (sizeof (Elf_External_Options));
1304               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1305                                              (Elf_External_Options *) f);
1306
1307               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1308             }
1309 #endif
1310           }
1311
1312         if (ECOFF_DEBUGGING)
1313           {
1314             sec = subseg_new (".mdebug", (subsegT) 0);
1315             (void) bfd_set_section_flags (stdoutput, sec,
1316                                           SEC_HAS_CONTENTS | SEC_READONLY);
1317             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1318           }
1319 #ifdef OBJ_ELF
1320         else if (OUTPUT_FLAVOR == bfd_target_elf_flavour && mips_flag_pdr)
1321           {
1322             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1323             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1324                                           SEC_READONLY | SEC_RELOC
1325                                           | SEC_DEBUGGING);
1326             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1327           }
1328 #endif
1329
1330         subseg_set (seg, subseg);
1331       }
1332     }
1333
1334   if (! ECOFF_DEBUGGING)
1335     md_obj_begin ();
1336 }
1337
1338 void
1339 md_mips_end (void)
1340 {
1341   if (! ECOFF_DEBUGGING)
1342     md_obj_end ();
1343 }
1344
1345 void
1346 md_assemble (char *str)
1347 {
1348   struct mips_cl_insn insn;
1349   bfd_reloc_code_real_type unused_reloc[3]
1350     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1351
1352   imm_expr.X_op = O_absent;
1353   imm2_expr.X_op = O_absent;
1354   offset_expr.X_op = O_absent;
1355   imm_reloc[0] = BFD_RELOC_UNUSED;
1356   imm_reloc[1] = BFD_RELOC_UNUSED;
1357   imm_reloc[2] = BFD_RELOC_UNUSED;
1358   offset_reloc[0] = BFD_RELOC_UNUSED;
1359   offset_reloc[1] = BFD_RELOC_UNUSED;
1360   offset_reloc[2] = BFD_RELOC_UNUSED;
1361
1362   if (mips_opts.mips16)
1363     mips16_ip (str, &insn);
1364   else
1365     {
1366       mips_ip (str, &insn);
1367       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1368             str, insn.insn_opcode));
1369     }
1370
1371   if (insn_error)
1372     {
1373       as_bad ("%s `%s'", insn_error, str);
1374       return;
1375     }
1376
1377   if (insn.insn_mo->pinfo == INSN_MACRO)
1378     {
1379       macro_start ();
1380       if (mips_opts.mips16)
1381         mips16_macro (&insn);
1382       else
1383         macro (&insn);
1384       macro_end ();
1385     }
1386   else
1387     {
1388       if (imm_expr.X_op != O_absent)
1389         append_insn (&insn, &imm_expr, imm_reloc);
1390       else if (offset_expr.X_op != O_absent)
1391         append_insn (&insn, &offset_expr, offset_reloc);
1392       else
1393         append_insn (&insn, NULL, unused_reloc);
1394     }
1395 }
1396
1397 /* Return true if the given relocation might need a matching %lo().
1398    Note that R_MIPS_GOT16 relocations only need a matching %lo() when
1399    applied to local symbols.  */
1400
1401 static inline bfd_boolean
1402 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
1403 {
1404   return (HAVE_IN_PLACE_ADDENDS
1405           && (reloc == BFD_RELOC_HI16_S
1406               || reloc == BFD_RELOC_MIPS_GOT16));
1407 }
1408
1409 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
1410    relocation.  */
1411
1412 static inline bfd_boolean
1413 fixup_has_matching_lo_p (fixS *fixp)
1414 {
1415   return (fixp->fx_next != NULL
1416           && fixp->fx_next->fx_r_type == BFD_RELOC_LO16
1417           && fixp->fx_addsy == fixp->fx_next->fx_addsy
1418           && fixp->fx_offset == fixp->fx_next->fx_offset);
1419 }
1420
1421 /* See whether instruction IP reads register REG.  CLASS is the type
1422    of register.  */
1423
1424 static int
1425 insn_uses_reg (struct mips_cl_insn *ip, unsigned int reg,
1426                enum mips_regclass class)
1427 {
1428   if (class == MIPS16_REG)
1429     {
1430       assert (mips_opts.mips16);
1431       reg = mips16_to_32_reg_map[reg];
1432       class = MIPS_GR_REG;
1433     }
1434
1435   /* Don't report on general register ZERO, since it never changes.  */
1436   if (class == MIPS_GR_REG && reg == ZERO)
1437     return 0;
1438
1439   if (class == MIPS_FP_REG)
1440     {
1441       assert (! mips_opts.mips16);
1442       /* If we are called with either $f0 or $f1, we must check $f0.
1443          This is not optimal, because it will introduce an unnecessary
1444          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
1445          need to distinguish reading both $f0 and $f1 or just one of
1446          them.  Note that we don't have to check the other way,
1447          because there is no instruction that sets both $f0 and $f1
1448          and requires a delay.  */
1449       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
1450           && ((((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS) &~(unsigned)1)
1451               == (reg &~ (unsigned) 1)))
1452         return 1;
1453       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
1454           && ((((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT) &~(unsigned)1)
1455               == (reg &~ (unsigned) 1)))
1456         return 1;
1457     }
1458   else if (! mips_opts.mips16)
1459     {
1460       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
1461           && ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == reg)
1462         return 1;
1463       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
1464           && ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT) == reg)
1465         return 1;
1466     }
1467   else
1468     {
1469       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
1470           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RX)
1471                                     & MIPS16OP_MASK_RX)]
1472               == reg))
1473         return 1;
1474       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
1475           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_RY)
1476                                     & MIPS16OP_MASK_RY)]
1477               == reg))
1478         return 1;
1479       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
1480           && (mips16_to_32_reg_map[((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
1481                                     & MIPS16OP_MASK_MOVE32Z)]
1482               == reg))
1483         return 1;
1484       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
1485         return 1;
1486       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
1487         return 1;
1488       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
1489         return 1;
1490       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
1491           && ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
1492               & MIPS16OP_MASK_REGR32) == reg)
1493         return 1;
1494     }
1495
1496   return 0;
1497 }
1498
1499 /* This function returns true if modifying a register requires a
1500    delay.  */
1501
1502 static int
1503 reg_needs_delay (unsigned int reg)
1504 {
1505   unsigned long prev_pinfo;
1506
1507   prev_pinfo = prev_insn.insn_mo->pinfo;
1508   if (! mips_opts.noreorder
1509       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
1510            && ! gpr_interlocks)
1511           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1512               && ! cop_interlocks)))
1513     {
1514       /* A load from a coprocessor or from memory.  All load delays
1515          delay the use of general register rt for one instruction.  */
1516       /* Itbl support may require additional care here.  */
1517       know (prev_pinfo & INSN_WRITE_GPR_T);
1518       if (reg == ((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT))
1519         return 1;
1520     }
1521
1522   return 0;
1523 }
1524
1525 /* Mark instruction labels in mips16 mode.  This permits the linker to
1526    handle them specially, such as generating jalx instructions when
1527    needed.  We also make them odd for the duration of the assembly, in
1528    order to generate the right sort of code.  We will make them even
1529    in the adjust_symtab routine, while leaving them marked.  This is
1530    convenient for the debugger and the disassembler.  The linker knows
1531    to make them odd again.  */
1532
1533 static void
1534 mips16_mark_labels (void)
1535 {
1536   if (mips_opts.mips16)
1537     {
1538       struct insn_label_list *l;
1539       valueT val;
1540
1541       for (l = insn_labels; l != NULL; l = l->next)
1542         {
1543 #ifdef OBJ_ELF
1544           if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1545             S_SET_OTHER (l->label, STO_MIPS16);
1546 #endif
1547           val = S_GET_VALUE (l->label);
1548           if ((val & 1) == 0)
1549             S_SET_VALUE (l->label, val + 1);
1550         }
1551     }
1552 }
1553
1554 /* End the current frag.  Make it a variant frag and record the
1555    relaxation info.  */
1556
1557 static void
1558 relax_close_frag (void)
1559 {
1560   mips_macro_warning.first_frag = frag_now;
1561   frag_var (rs_machine_dependent, 0, 0,
1562             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
1563             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
1564
1565   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
1566   mips_relax.first_fixup = 0;
1567 }
1568
1569 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
1570    See the comment above RELAX_ENCODE for more details.  */
1571
1572 static void
1573 relax_start (symbolS *symbol)
1574 {
1575   assert (mips_relax.sequence == 0);
1576   mips_relax.sequence = 1;
1577   mips_relax.symbol = symbol;
1578 }
1579
1580 /* Start generating the second version of a relaxable sequence.
1581    See the comment above RELAX_ENCODE for more details.  */
1582
1583 static void
1584 relax_switch (void)
1585 {
1586   assert (mips_relax.sequence == 1);
1587   mips_relax.sequence = 2;
1588 }
1589
1590 /* End the current relaxable sequence.  */
1591
1592 static void
1593 relax_end (void)
1594 {
1595   assert (mips_relax.sequence == 2);
1596   relax_close_frag ();
1597   mips_relax.sequence = 0;
1598 }
1599
1600 /* Output an instruction.  IP is the instruction information.
1601    ADDRESS_EXPR is an operand of the instruction to be used with
1602    RELOC_TYPE.  */
1603
1604 static void
1605 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
1606              bfd_reloc_code_real_type *reloc_type)
1607 {
1608   register unsigned long prev_pinfo, pinfo;
1609   char *f;
1610   fixS *fixp[3];
1611   int nops = 0;
1612   relax_stateT prev_insn_frag_type = 0;
1613   bfd_boolean relaxed_branch = FALSE;
1614   bfd_boolean force_new_frag = FALSE;
1615
1616   /* Mark instruction labels in mips16 mode.  */
1617   mips16_mark_labels ();
1618
1619   prev_pinfo = prev_insn.insn_mo->pinfo;
1620   pinfo = ip->insn_mo->pinfo;
1621
1622   if (mips_relax.sequence != 2
1623       && (!mips_opts.noreorder || prev_nop_frag != NULL))
1624     {
1625       int prev_prev_nop;
1626
1627       /* If the previous insn required any delay slots, see if we need
1628          to insert a NOP or two.  There are eight kinds of possible
1629          hazards, of which an instruction can have at most one type.
1630          (1) a load from memory delay
1631          (2) a load from a coprocessor delay
1632          (3) an unconditional branch delay
1633          (4) a conditional branch delay
1634          (5) a move to coprocessor register delay
1635          (6) a load coprocessor register from memory delay
1636          (7) a coprocessor condition code delay
1637          (8) a HI/LO special register delay
1638
1639          There are a lot of optimizations we could do that we don't.
1640          In particular, we do not, in general, reorder instructions.
1641          If you use gcc with optimization, it will reorder
1642          instructions and generally do much more optimization then we
1643          do here; repeating all that work in the assembler would only
1644          benefit hand written assembly code, and does not seem worth
1645          it.  */
1646
1647       /* This is how a NOP is emitted.  */
1648 #define emit_nop()                                      \
1649   (mips_opts.mips16                                     \
1650    ? md_number_to_chars (frag_more (2), 0x6500, 2)      \
1651    : md_number_to_chars (frag_more (4), 0, 4))
1652
1653       /* The previous insn might require a delay slot, depending upon
1654          the contents of the current insn.  */
1655       if (! mips_opts.mips16
1656           && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
1657                && ! gpr_interlocks)
1658               || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
1659                   && ! cop_interlocks)))
1660         {
1661           /* A load from a coprocessor or from memory.  All load
1662              delays delay the use of general register rt for one
1663              instruction.  */
1664           /* Itbl support may require additional care here.  */
1665           know (prev_pinfo & INSN_WRITE_GPR_T);
1666           if (mips_optimize == 0
1667               || insn_uses_reg (ip,
1668                                 ((prev_insn.insn_opcode >> OP_SH_RT)
1669                                  & OP_MASK_RT),
1670                                 MIPS_GR_REG))
1671             ++nops;
1672         }
1673       else if (! mips_opts.mips16
1674                && (((prev_pinfo & INSN_COPROC_MOVE_DELAY)
1675                     && ! cop_interlocks)
1676                    || ((prev_pinfo & INSN_COPROC_MEMORY_DELAY)
1677                        && ! cop_mem_interlocks)))
1678         {
1679           /* A generic coprocessor delay.  The previous instruction
1680              modified a coprocessor general or control register.  If
1681              it modified a control register, we need to avoid any
1682              coprocessor instruction (this is probably not always
1683              required, but it sometimes is).  If it modified a general
1684              register, we avoid using that register.
1685
1686              This case is not handled very well.  There is no special
1687              knowledge of CP0 handling, and the coprocessors other
1688              than the floating point unit are not distinguished at
1689              all.  */
1690           /* Itbl support may require additional care here. FIXME!
1691              Need to modify this to include knowledge about
1692              user specified delays!  */
1693           if (prev_pinfo & INSN_WRITE_FPR_T)
1694             {
1695               if (mips_optimize == 0
1696                   || insn_uses_reg (ip,
1697                                     ((prev_insn.insn_opcode >> OP_SH_FT)
1698                                      & OP_MASK_FT),
1699                                     MIPS_FP_REG))
1700                 ++nops;
1701             }
1702           else if (prev_pinfo & INSN_WRITE_FPR_S)
1703             {
1704               if (mips_optimize == 0
1705                   || insn_uses_reg (ip,
1706                                     ((prev_insn.insn_opcode >> OP_SH_FS)
1707                                      & OP_MASK_FS),
1708                                     MIPS_FP_REG))
1709                 ++nops;
1710             }
1711           else
1712             {
1713               /* We don't know exactly what the previous instruction
1714                  does.  If the current instruction uses a coprocessor
1715                  register, we must insert a NOP.  If previous
1716                  instruction may set the condition codes, and the
1717                  current instruction uses them, we must insert two
1718                  NOPS.  */
1719               /* Itbl support may require additional care here.  */
1720               if (mips_optimize == 0
1721                   || ((prev_pinfo & INSN_WRITE_COND_CODE)
1722                       && (pinfo & INSN_READ_COND_CODE)))
1723                 nops += 2;
1724               else if (pinfo & INSN_COP)
1725                 ++nops;
1726             }
1727         }
1728       else if (! mips_opts.mips16
1729                && (prev_pinfo & INSN_WRITE_COND_CODE)
1730                && ! cop_interlocks)
1731         {
1732           /* The previous instruction sets the coprocessor condition
1733              codes, but does not require a general coprocessor delay
1734              (this means it is a floating point comparison
1735              instruction).  If this instruction uses the condition
1736              codes, we need to insert a single NOP.  */
1737           /* Itbl support may require additional care here.  */
1738           if (mips_optimize == 0
1739               || (pinfo & INSN_READ_COND_CODE))
1740             ++nops;
1741         }
1742
1743       /* If we're fixing up mfhi/mflo for the r7000 and the
1744          previous insn was an mfhi/mflo and the current insn
1745          reads the register that the mfhi/mflo wrote to, then
1746          insert two nops.  */
1747
1748       else if (mips_7000_hilo_fix
1749                && MF_HILO_INSN (prev_pinfo)
1750                && insn_uses_reg (ip, ((prev_insn.insn_opcode >> OP_SH_RD)
1751                                       & OP_MASK_RD),
1752                                  MIPS_GR_REG))
1753         {
1754           nops += 2;
1755         }
1756
1757       /* If we're fixing up mfhi/mflo for the r7000 and the
1758          2nd previous insn was an mfhi/mflo and the current insn
1759          reads the register that the mfhi/mflo wrote to, then
1760          insert one nop.  */
1761
1762       else if (mips_7000_hilo_fix
1763                && MF_HILO_INSN (prev_prev_insn.insn_opcode)
1764                && insn_uses_reg (ip, ((prev_prev_insn.insn_opcode >> OP_SH_RD)
1765                                        & OP_MASK_RD),
1766                                     MIPS_GR_REG))
1767
1768         {
1769           ++nops;
1770         }
1771
1772       else if (prev_pinfo & INSN_READ_LO)
1773         {
1774           /* The previous instruction reads the LO register; if the
1775              current instruction writes to the LO register, we must
1776              insert two NOPS.  Some newer processors have interlocks.
1777              Also the tx39's multiply instructions can be executed
1778              immediately after a read from HI/LO (without the delay),
1779              though the tx39's divide insns still do require the
1780              delay.  */
1781           if (! (hilo_interlocks
1782                  || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
1783               && (mips_optimize == 0
1784                   || (pinfo & INSN_WRITE_LO)))
1785             nops += 2;
1786           /* Most mips16 branch insns don't have a delay slot.
1787              If a read from LO is immediately followed by a branch
1788              to a write to LO we have a read followed by a write
1789              less than 2 insns away.  We assume the target of
1790              a branch might be a write to LO, and insert a nop
1791              between a read and an immediately following branch.  */
1792           else if (mips_opts.mips16
1793                    && (mips_optimize == 0
1794                        || (pinfo & MIPS16_INSN_BRANCH)))
1795             ++nops;
1796         }
1797       else if (prev_insn.insn_mo->pinfo & INSN_READ_HI)
1798         {
1799           /* The previous instruction reads the HI register; if the
1800              current instruction writes to the HI register, we must
1801              insert a NOP.  Some newer processors have interlocks.
1802              Also the note tx39's multiply above.  */
1803           if (! (hilo_interlocks
1804                  || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
1805               && (mips_optimize == 0
1806                   || (pinfo & INSN_WRITE_HI)))
1807             nops += 2;
1808           /* Most mips16 branch insns don't have a delay slot.
1809              If a read from HI is immediately followed by a branch
1810              to a write to HI we have a read followed by a write
1811              less than 2 insns away.  We assume the target of
1812              a branch might be a write to HI, and insert a nop
1813              between a read and an immediately following branch.  */
1814           else if (mips_opts.mips16
1815                    && (mips_optimize == 0
1816                        || (pinfo & MIPS16_INSN_BRANCH)))
1817             ++nops;
1818         }
1819
1820       /* If the previous instruction was in a noreorder section, then
1821          we don't want to insert the nop after all.  */
1822       /* Itbl support may require additional care here.  */
1823       if (prev_insn_unreordered)
1824         nops = 0;
1825
1826       /* There are two cases which require two intervening
1827          instructions: 1) setting the condition codes using a move to
1828          coprocessor instruction which requires a general coprocessor
1829          delay and then reading the condition codes 2) reading the HI
1830          or LO register and then writing to it (except on processors
1831          which have interlocks).  If we are not already emitting a NOP
1832          instruction, we must check for these cases compared to the
1833          instruction previous to the previous instruction.  */
1834       if ((! mips_opts.mips16
1835            && (prev_prev_insn.insn_mo->pinfo & INSN_COPROC_MOVE_DELAY)
1836            && (prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
1837            && (pinfo & INSN_READ_COND_CODE)
1838            && ! cop_interlocks)
1839           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_LO)
1840               && (pinfo & INSN_WRITE_LO)
1841               && ! (hilo_interlocks
1842                     || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT))))
1843           || ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
1844               && (pinfo & INSN_WRITE_HI)
1845               && ! (hilo_interlocks
1846                     || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))))
1847         prev_prev_nop = 1;
1848       else
1849         prev_prev_nop = 0;
1850
1851       if (prev_prev_insn_unreordered)
1852         prev_prev_nop = 0;
1853
1854       if (prev_prev_nop && nops == 0)
1855         ++nops;
1856
1857       if (mips_fix_vr4120 && prev_insn.insn_mo->name)
1858         {
1859           /* We're out of bits in pinfo, so we must resort to string
1860              ops here.  Shortcuts are selected based on opcodes being
1861              limited to the VR4120 instruction set.  */
1862           int min_nops = 0;
1863           const char *pn = prev_insn.insn_mo->name;
1864           const char *tn = ip->insn_mo->name;
1865           if (strncmp (pn, "macc", 4) == 0
1866               || strncmp (pn, "dmacc", 5) == 0)
1867             {
1868               /* Errata 21 - [D]DIV[U] after [D]MACC */
1869               if (strstr (tn, "div"))
1870                 min_nops = 1;
1871
1872               /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1873                  instruction is executed immediately after a MACC or
1874                  DMACC instruction, the result of [either instruction]
1875                  is incorrect."  */
1876               if (strncmp (tn, "mult", 4) == 0
1877                   || strncmp (tn, "dmult", 5) == 0)
1878                 min_nops = 1;
1879
1880               /* Errata 23 - Continuous DMULT[U]/DMACC instructions.
1881                  Applies on top of VR4181A MD(1) errata.  */
1882               if (pn[0] == 'd' && strncmp (tn, "dmacc", 5) == 0)
1883                 min_nops = 1;
1884
1885               /* Errata 24 - MT{LO,HI} after [D]MACC */
1886               if (strcmp (tn, "mtlo") == 0
1887                   || strcmp (tn, "mthi") == 0)
1888                 min_nops = 1;
1889             }
1890           else if (strncmp (pn, "dmult", 5) == 0
1891                    && (strncmp (tn, "dmult", 5) == 0
1892                        || strncmp (tn, "dmacc", 5) == 0))
1893             {
1894               /* Here is the rest of errata 23.  */
1895               min_nops = 1;
1896             }
1897           else if ((strncmp (pn, "dmult", 5) == 0 || strstr (pn, "div"))
1898                    && (strncmp (tn, "macc", 4) == 0
1899                        || strncmp (tn, "dmacc", 5) == 0))
1900             {
1901               /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1902                  executed immediately after a DMULT, DMULTU, DIV, DIVU,
1903                  DDIV or DDIVU instruction, the result of the MACC or
1904                  DMACC instruction is incorrect.".  This partly overlaps
1905                  the workaround for errata 23.  */
1906               min_nops = 1;
1907             }
1908           if (nops < min_nops)
1909             nops = min_nops;
1910         }
1911
1912       /* If we are being given a nop instruction, don't bother with
1913          one of the nops we would otherwise output.  This will only
1914          happen when a nop instruction is used with mips_optimize set
1915          to 0.  */
1916       if (nops > 0
1917           && ! mips_opts.noreorder
1918           && ip->insn_opcode == (unsigned) (mips_opts.mips16 ? 0x6500 : 0))
1919         --nops;
1920
1921       /* Now emit the right number of NOP instructions.  */
1922       if (nops > 0 && ! mips_opts.noreorder)
1923         {
1924           fragS *old_frag;
1925           unsigned long old_frag_offset;
1926           int i;
1927           struct insn_label_list *l;
1928
1929           old_frag = frag_now;
1930           old_frag_offset = frag_now_fix ();
1931
1932           for (i = 0; i < nops; i++)
1933             emit_nop ();
1934
1935           if (listing)
1936             {
1937               listing_prev_line ();
1938               /* We may be at the start of a variant frag.  In case we
1939                  are, make sure there is enough space for the frag
1940                  after the frags created by listing_prev_line.  The
1941                  argument to frag_grow here must be at least as large
1942                  as the argument to all other calls to frag_grow in
1943                  this file.  We don't have to worry about being in the
1944                  middle of a variant frag, because the variants insert
1945                  all needed nop instructions themselves.  */
1946               frag_grow (40);
1947             }
1948
1949           for (l = insn_labels; l != NULL; l = l->next)
1950             {
1951               valueT val;
1952
1953               assert (S_GET_SEGMENT (l->label) == now_seg);
1954               symbol_set_frag (l->label, frag_now);
1955               val = (valueT) frag_now_fix ();
1956               /* mips16 text labels are stored as odd.  */
1957               if (mips_opts.mips16)
1958                 ++val;
1959               S_SET_VALUE (l->label, val);
1960             }
1961
1962 #ifndef NO_ECOFF_DEBUGGING
1963           if (ECOFF_DEBUGGING)
1964             ecoff_fix_loc (old_frag, old_frag_offset);
1965 #endif
1966         }
1967       else if (prev_nop_frag != NULL)
1968         {
1969           /* We have a frag holding nops we may be able to remove.  If
1970              we don't need any nops, we can decrease the size of
1971              prev_nop_frag by the size of one instruction.  If we do
1972              need some nops, we count them in prev_nops_required.  */
1973           if (prev_nop_frag_since == 0)
1974             {
1975               if (nops == 0)
1976                 {
1977                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1978                   --prev_nop_frag_holds;
1979                 }
1980               else
1981                 prev_nop_frag_required += nops;
1982             }
1983           else
1984             {
1985               if (prev_prev_nop == 0)
1986                 {
1987                   prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
1988                   --prev_nop_frag_holds;
1989                 }
1990               else
1991                 ++prev_nop_frag_required;
1992             }
1993
1994           if (prev_nop_frag_holds <= prev_nop_frag_required)
1995             prev_nop_frag = NULL;
1996
1997           ++prev_nop_frag_since;
1998
1999           /* Sanity check: by the time we reach the second instruction
2000              after prev_nop_frag, we should have used up all the nops
2001              one way or another.  */
2002           assert (prev_nop_frag_since <= 1 || prev_nop_frag == NULL);
2003         }
2004     }
2005
2006   /* Record the frag type before frag_var.  */
2007   if (prev_insn_frag)
2008     prev_insn_frag_type = prev_insn_frag->fr_type;
2009
2010   if (address_expr
2011       && *reloc_type == BFD_RELOC_16_PCREL_S2
2012       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2013           || pinfo & INSN_COND_BRANCH_LIKELY)
2014       && mips_relax_branch
2015       /* Don't try branch relaxation within .set nomacro, or within
2016          .set noat if we use $at for PIC computations.  If it turns
2017          out that the branch was out-of-range, we'll get an error.  */
2018       && !mips_opts.warn_about_macros
2019       && !(mips_opts.noat && mips_pic != NO_PIC)
2020       && !mips_opts.mips16)
2021     {
2022       relaxed_branch = TRUE;
2023       f = frag_var (rs_machine_dependent,
2024                     relaxed_branch_length
2025                     (NULL, NULL,
2026                      (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2027                      : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1 : 0), 4,
2028                     RELAX_BRANCH_ENCODE
2029                     (pinfo & INSN_UNCOND_BRANCH_DELAY,
2030                      pinfo & INSN_COND_BRANCH_LIKELY,
2031                      pinfo & INSN_WRITE_GPR_31,
2032                      0),
2033                     address_expr->X_add_symbol,
2034                     address_expr->X_add_number,
2035                     0);
2036       *reloc_type = BFD_RELOC_UNUSED;
2037     }
2038   else if (*reloc_type > BFD_RELOC_UNUSED)
2039     {
2040       /* We need to set up a variant frag.  */
2041       assert (mips_opts.mips16 && address_expr != NULL);
2042       f = frag_var (rs_machine_dependent, 4, 0,
2043                     RELAX_MIPS16_ENCODE (*reloc_type - BFD_RELOC_UNUSED,
2044                                          mips16_small, mips16_ext,
2045                                          (prev_pinfo
2046                                           & INSN_UNCOND_BRANCH_DELAY),
2047                                          (*prev_insn_reloc_type
2048                                           == BFD_RELOC_MIPS16_JMP)),
2049                     make_expr_symbol (address_expr), 0, NULL);
2050     }
2051   else if (mips_opts.mips16
2052            && ! ip->use_extend
2053            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2054     {
2055       /* Make sure there is enough room to swap this instruction with
2056          a following jump instruction.  */
2057       frag_grow (6);
2058       f = frag_more (2);
2059     }
2060   else
2061     {
2062       if (mips_opts.mips16
2063           && mips_opts.noreorder
2064           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2065         as_warn (_("extended instruction in delay slot"));
2066
2067       if (mips_relax.sequence)
2068         {
2069           /* If we've reached the end of this frag, turn it into a variant
2070              frag and record the information for the instructions we've
2071              written so far.  */
2072           if (frag_room () < 4)
2073             relax_close_frag ();
2074           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2075         }
2076
2077       if (mips_relax.sequence != 2)
2078         mips_macro_warning.sizes[0] += 4;
2079       if (mips_relax.sequence != 1)
2080         mips_macro_warning.sizes[1] += 4;
2081
2082       f = frag_more (4);
2083     }
2084
2085   fixp[0] = fixp[1] = fixp[2] = NULL;
2086   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2087     {
2088       if (address_expr->X_op == O_constant)
2089         {
2090           valueT tmp;
2091
2092           switch (*reloc_type)
2093             {
2094             case BFD_RELOC_32:
2095               ip->insn_opcode |= address_expr->X_add_number;
2096               break;
2097
2098             case BFD_RELOC_MIPS_HIGHEST:
2099               tmp = (address_expr->X_add_number
2100                      + ((valueT) 0x8000 << 32) + 0x80008000) >> 16;
2101               tmp >>= 16;
2102               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2103               break;
2104
2105             case BFD_RELOC_MIPS_HIGHER:
2106               tmp = (address_expr->X_add_number + 0x80008000) >> 16;
2107               ip->insn_opcode |= (tmp >> 16) & 0xffff;
2108               break;
2109
2110             case BFD_RELOC_HI16_S:
2111               ip->insn_opcode |= ((address_expr->X_add_number + 0x8000)
2112                                   >> 16) & 0xffff;
2113               break;
2114
2115             case BFD_RELOC_HI16:
2116               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2117               break;
2118
2119             case BFD_RELOC_UNUSED:
2120             case BFD_RELOC_LO16:
2121             case BFD_RELOC_MIPS_GOT_DISP:
2122               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2123               break;
2124
2125             case BFD_RELOC_MIPS_JMP:
2126               if ((address_expr->X_add_number & 3) != 0)
2127                 as_bad (_("jump to misaligned address (0x%lx)"),
2128                         (unsigned long) address_expr->X_add_number);
2129               if (address_expr->X_add_number & ~0xfffffff)
2130                 as_bad (_("jump address range overflow (0x%lx)"),
2131                         (unsigned long) address_expr->X_add_number);
2132               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2133               break;
2134
2135             case BFD_RELOC_MIPS16_JMP:
2136               if ((address_expr->X_add_number & 3) != 0)
2137                 as_bad (_("jump to misaligned address (0x%lx)"),
2138                         (unsigned long) address_expr->X_add_number);
2139               if (address_expr->X_add_number & ~0xfffffff)
2140                 as_bad (_("jump address range overflow (0x%lx)"),
2141                         (unsigned long) address_expr->X_add_number);
2142               ip->insn_opcode |=
2143                 (((address_expr->X_add_number & 0x7c0000) << 3)
2144                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2145                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2146               break;
2147
2148             case BFD_RELOC_16_PCREL_S2:
2149               goto need_reloc;
2150
2151             default:
2152               internalError ();
2153             }
2154         }
2155       else if (*reloc_type < BFD_RELOC_UNUSED)
2156         need_reloc:
2157         {
2158           reloc_howto_type *howto;
2159           int i;
2160
2161           /* In a compound relocation, it is the final (outermost)
2162              operator that determines the relocated field.  */
2163           for (i = 1; i < 3; i++)
2164             if (reloc_type[i] == BFD_RELOC_UNUSED)
2165               break;
2166
2167           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2168           fixp[0] = fix_new_exp (frag_now, f - frag_now->fr_literal,
2169                                  bfd_get_reloc_size(howto),
2170                                  address_expr,
2171                                  reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2172                                  reloc_type[0]);
2173
2174           /* These relocations can have an addend that won't fit in
2175              4 octets for 64bit assembly.  */
2176           if (HAVE_64BIT_GPRS
2177               && ! howto->partial_inplace
2178               && (reloc_type[0] == BFD_RELOC_16
2179                   || reloc_type[0] == BFD_RELOC_32
2180                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2181                   || reloc_type[0] == BFD_RELOC_HI16_S
2182                   || reloc_type[0] == BFD_RELOC_LO16
2183                   || reloc_type[0] == BFD_RELOC_GPREL16
2184                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2185                   || reloc_type[0] == BFD_RELOC_GPREL32
2186                   || reloc_type[0] == BFD_RELOC_64
2187                   || reloc_type[0] == BFD_RELOC_CTOR
2188                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2189                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2190                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2191                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2192                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2193                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT))
2194             fixp[0]->fx_no_overflow = 1;
2195
2196           if (mips_relax.sequence)
2197             {
2198               if (mips_relax.first_fixup == 0)
2199                 mips_relax.first_fixup = fixp[0];
2200             }
2201           else if (reloc_needs_lo_p (*reloc_type))
2202             {
2203               struct mips_hi_fixup *hi_fixup;
2204
2205               /* Reuse the last entry if it already has a matching %lo.  */
2206               hi_fixup = mips_hi_fixup_list;
2207               if (hi_fixup == 0
2208                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2209                 {
2210                   hi_fixup = ((struct mips_hi_fixup *)
2211                               xmalloc (sizeof (struct mips_hi_fixup)));
2212                   hi_fixup->next = mips_hi_fixup_list;
2213                   mips_hi_fixup_list = hi_fixup;
2214                 }
2215               hi_fixup->fixp = fixp[0];
2216               hi_fixup->seg = now_seg;
2217             }
2218
2219           /* Add fixups for the second and third relocations, if given.
2220              Note that the ABI allows the second relocation to be
2221              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2222              moment we only use RSS_UNDEF, but we could add support
2223              for the others if it ever becomes necessary.  */
2224           for (i = 1; i < 3; i++)
2225             if (reloc_type[i] != BFD_RELOC_UNUSED)
2226               {
2227                 address_expr->X_op = O_absent;
2228                 address_expr->X_add_symbol = 0;
2229                 address_expr->X_add_number = 0;
2230
2231                 fixp[i] = fix_new_exp (frag_now, fixp[0]->fx_where,
2232                                        fixp[0]->fx_size, address_expr,
2233                                        FALSE, reloc_type[i]);
2234               }
2235         }
2236     }
2237
2238   if (! mips_opts.mips16)
2239     {
2240       md_number_to_chars (f, ip->insn_opcode, 4);
2241 #ifdef OBJ_ELF
2242       dwarf2_emit_insn (4);
2243 #endif
2244     }
2245   else if (*reloc_type == BFD_RELOC_MIPS16_JMP)
2246     {
2247       md_number_to_chars (f, ip->insn_opcode >> 16, 2);
2248       md_number_to_chars (f + 2, ip->insn_opcode & 0xffff, 2);
2249 #ifdef OBJ_ELF
2250       /* The value passed to dwarf2_emit_insn is the distance between
2251          the end of the current instruction and the address that should
2252          be recorded in the debug tables.  Since we want to use ISA-encoded
2253          addresses in MIPS16 debug info, the value is one byte less than
2254          the real instruction length.  */
2255       dwarf2_emit_insn (3);
2256 #endif
2257     }
2258   else
2259     {
2260       if (ip->use_extend)
2261         {
2262           md_number_to_chars (f, 0xf000 | ip->extend, 2);
2263           f += 2;
2264         }
2265       md_number_to_chars (f, ip->insn_opcode, 2);
2266 #ifdef OBJ_ELF
2267       dwarf2_emit_insn (ip->use_extend ? 3 : 1);
2268 #endif
2269     }
2270
2271   /* Update the register mask information.  */
2272   if (! mips_opts.mips16)
2273     {
2274       if (pinfo & INSN_WRITE_GPR_D)
2275         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD);
2276       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2277         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RT) & OP_MASK_RT);
2278       if (pinfo & INSN_READ_GPR_S)
2279         mips_gprmask |= 1 << ((ip->insn_opcode >> OP_SH_RS) & OP_MASK_RS);
2280       if (pinfo & INSN_WRITE_GPR_31)
2281         mips_gprmask |= 1 << RA;
2282       if (pinfo & INSN_WRITE_FPR_D)
2283         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FD) & OP_MASK_FD);
2284       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2285         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FS) & OP_MASK_FS);
2286       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2287         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FT) & OP_MASK_FT);
2288       if ((pinfo & INSN_READ_FPR_R) != 0)
2289         mips_cprmask[1] |= 1 << ((ip->insn_opcode >> OP_SH_FR) & OP_MASK_FR);
2290       if (pinfo & INSN_COP)
2291         {
2292           /* We don't keep enough information to sort these cases out.
2293              The itbl support does keep this information however, although
2294              we currently don't support itbl fprmats as part of the cop
2295              instruction.  May want to add this support in the future.  */
2296         }
2297       /* Never set the bit for $0, which is always zero.  */
2298       mips_gprmask &= ~1 << 0;
2299     }
2300   else
2301     {
2302       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2303         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RX)
2304                               & MIPS16OP_MASK_RX);
2305       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2306         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RY)
2307                               & MIPS16OP_MASK_RY);
2308       if (pinfo & MIPS16_INSN_WRITE_Z)
2309         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_RZ)
2310                               & MIPS16OP_MASK_RZ);
2311       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2312         mips_gprmask |= 1 << TREG;
2313       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2314         mips_gprmask |= 1 << SP;
2315       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2316         mips_gprmask |= 1 << RA;
2317       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2318         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2319       if (pinfo & MIPS16_INSN_READ_Z)
2320         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_MOVE32Z)
2321                               & MIPS16OP_MASK_MOVE32Z);
2322       if (pinfo & MIPS16_INSN_READ_GPR_X)
2323         mips_gprmask |= 1 << ((ip->insn_opcode >> MIPS16OP_SH_REGR32)
2324                               & MIPS16OP_MASK_REGR32);
2325     }
2326
2327   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2328     {
2329       /* Filling the branch delay slot is more complex.  We try to
2330          switch the branch with the previous instruction, which we can
2331          do if the previous instruction does not set up a condition
2332          that the branch tests and if the branch is not itself the
2333          target of any branch.  */
2334       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2335           || (pinfo & INSN_COND_BRANCH_DELAY))
2336         {
2337           if (mips_optimize < 2
2338               /* If we have seen .set volatile or .set nomove, don't
2339                  optimize.  */
2340               || mips_opts.nomove != 0
2341               /* If we had to emit any NOP instructions, then we
2342                  already know we can not swap.  */
2343               || nops != 0
2344               /* If we don't even know the previous insn, we can not
2345                  swap.  */
2346               || ! prev_insn_valid
2347               /* If the previous insn is already in a branch delay
2348                  slot, then we can not swap.  */
2349               || prev_insn_is_delay_slot
2350               /* If the previous previous insn was in a .set
2351                  noreorder, we can't swap.  Actually, the MIPS
2352                  assembler will swap in this situation.  However, gcc
2353                  configured -with-gnu-as will generate code like
2354                    .set noreorder
2355                    lw   $4,XXX
2356                    .set reorder
2357                    INSN
2358                    bne  $4,$0,foo
2359                  in which we can not swap the bne and INSN.  If gcc is
2360                  not configured -with-gnu-as, it does not output the
2361                  .set pseudo-ops.  We don't have to check
2362                  prev_insn_unreordered, because prev_insn_valid will
2363                  be 0 in that case.  We don't want to use
2364                  prev_prev_insn_valid, because we do want to be able
2365                  to swap at the start of a function.  */
2366               || prev_prev_insn_unreordered
2367               /* If the branch is itself the target of a branch, we
2368                  can not swap.  We cheat on this; all we check for is
2369                  whether there is a label on this instruction.  If
2370                  there are any branches to anything other than a
2371                  label, users must use .set noreorder.  */
2372               || insn_labels != NULL
2373               /* If the previous instruction is in a variant frag
2374                  other than this branch's one, we cannot do the swap.
2375                  This does not apply to the mips16, which uses variant
2376                  frags for different purposes.  */
2377               || (! mips_opts.mips16
2378                   && prev_insn_frag_type == rs_machine_dependent)
2379               /* If the branch reads the condition codes, we don't
2380                  even try to swap, because in the sequence
2381                    ctc1 $X,$31
2382                    INSN
2383                    INSN
2384                    bc1t LABEL
2385                  we can not swap, and I don't feel like handling that
2386                  case.  */
2387               || (! mips_opts.mips16
2388                   && (pinfo & INSN_READ_COND_CODE)
2389                   && ! cop_interlocks)
2390               /* We can not swap with an instruction that requires a
2391                  delay slot, because the target of the branch might
2392                  interfere with that instruction.  */
2393               || (! mips_opts.mips16
2394                   && (prev_pinfo
2395               /* Itbl support may require additional care here.  */
2396                       & (INSN_LOAD_COPROC_DELAY
2397                          | INSN_COPROC_MOVE_DELAY
2398                          | INSN_WRITE_COND_CODE))
2399                   && ! cop_interlocks)
2400               || (! (hilo_interlocks
2401                      || (mips_opts.arch == CPU_R3900 && (pinfo & INSN_MULT)))
2402                   && (prev_pinfo
2403                       & (INSN_READ_LO
2404                          | INSN_READ_HI)))
2405               || (! mips_opts.mips16
2406                   && (prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2407                   && ! gpr_interlocks)
2408               || (! mips_opts.mips16
2409                   /* Itbl support may require additional care here.  */
2410                   && (prev_pinfo & INSN_COPROC_MEMORY_DELAY)
2411                   && ! cop_mem_interlocks)
2412               /* We can not swap with a branch instruction.  */
2413               || (prev_pinfo
2414                   & (INSN_UNCOND_BRANCH_DELAY
2415                      | INSN_COND_BRANCH_DELAY
2416                      | INSN_COND_BRANCH_LIKELY))
2417               /* We do not swap with a trap instruction, since it
2418                  complicates trap handlers to have the trap
2419                  instruction be in a delay slot.  */
2420               || (prev_pinfo & INSN_TRAP)
2421               /* If the branch reads a register that the previous
2422                  instruction sets, we can not swap.  */
2423               || (! mips_opts.mips16
2424                   && (prev_pinfo & INSN_WRITE_GPR_T)
2425                   && insn_uses_reg (ip,
2426                                     ((prev_insn.insn_opcode >> OP_SH_RT)
2427                                      & OP_MASK_RT),
2428                                     MIPS_GR_REG))
2429               || (! mips_opts.mips16
2430                   && (prev_pinfo & INSN_WRITE_GPR_D)
2431                   && insn_uses_reg (ip,
2432                                     ((prev_insn.insn_opcode >> OP_SH_RD)
2433                                      & OP_MASK_RD),
2434                                     MIPS_GR_REG))
2435               || (mips_opts.mips16
2436                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2437                        && insn_uses_reg (ip,
2438                                          ((prev_insn.insn_opcode
2439                                            >> MIPS16OP_SH_RX)
2440                                           & MIPS16OP_MASK_RX),
2441                                          MIPS16_REG))
2442                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2443                           && insn_uses_reg (ip,
2444                                             ((prev_insn.insn_opcode
2445                                               >> MIPS16OP_SH_RY)
2446                                              & MIPS16OP_MASK_RY),
2447                                             MIPS16_REG))
2448                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2449                           && insn_uses_reg (ip,
2450                                             ((prev_insn.insn_opcode
2451                                               >> MIPS16OP_SH_RZ)
2452                                              & MIPS16OP_MASK_RZ),
2453                                             MIPS16_REG))
2454                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2455                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
2456                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
2457                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
2458                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2459                           && insn_uses_reg (ip,
2460                                             MIPS16OP_EXTRACT_REG32R (prev_insn.
2461                                                                      insn_opcode),
2462                                             MIPS_GR_REG))))
2463               /* If the branch writes a register that the previous
2464                  instruction sets, we can not swap (we know that
2465                  branches write only to RD or to $31).  */
2466               || (! mips_opts.mips16
2467                   && (prev_pinfo & INSN_WRITE_GPR_T)
2468                   && (((pinfo & INSN_WRITE_GPR_D)
2469                        && (((prev_insn.insn_opcode >> OP_SH_RT) & OP_MASK_RT)
2470                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2471                       || ((pinfo & INSN_WRITE_GPR_31)
2472                           && (((prev_insn.insn_opcode >> OP_SH_RT)
2473                                & OP_MASK_RT)
2474                               == RA))))
2475               || (! mips_opts.mips16
2476                   && (prev_pinfo & INSN_WRITE_GPR_D)
2477                   && (((pinfo & INSN_WRITE_GPR_D)
2478                        && (((prev_insn.insn_opcode >> OP_SH_RD) & OP_MASK_RD)
2479                            == ((ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD)))
2480                       || ((pinfo & INSN_WRITE_GPR_31)
2481                           && (((prev_insn.insn_opcode >> OP_SH_RD)
2482                                & OP_MASK_RD)
2483                               == RA))))
2484               || (mips_opts.mips16
2485                   && (pinfo & MIPS16_INSN_WRITE_31)
2486                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
2487                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
2488                           && (MIPS16OP_EXTRACT_REG32R (prev_insn.insn_opcode)
2489                               == RA))))
2490               /* If the branch writes a register that the previous
2491                  instruction reads, we can not swap (we know that
2492                  branches only write to RD or to $31).  */
2493               || (! mips_opts.mips16
2494                   && (pinfo & INSN_WRITE_GPR_D)
2495                   && insn_uses_reg (&prev_insn,
2496                                     ((ip->insn_opcode >> OP_SH_RD)
2497                                      & OP_MASK_RD),
2498                                     MIPS_GR_REG))
2499               || (! mips_opts.mips16
2500                   && (pinfo & INSN_WRITE_GPR_31)
2501                   && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2502               || (mips_opts.mips16
2503                   && (pinfo & MIPS16_INSN_WRITE_31)
2504                   && insn_uses_reg (&prev_insn, RA, MIPS_GR_REG))
2505               /* If the previous previous instruction has a load
2506                  delay, and sets a register that the branch reads, we
2507                  can not swap.  */
2508               || (! mips_opts.mips16
2509               /* Itbl support may require additional care here.  */
2510                   && (((prev_prev_insn.insn_mo->pinfo & INSN_LOAD_COPROC_DELAY)
2511                        && ! cop_interlocks)
2512                       || ((prev_prev_insn.insn_mo->pinfo
2513                            & INSN_LOAD_MEMORY_DELAY)
2514                           && ! gpr_interlocks))
2515                   && insn_uses_reg (ip,
2516                                     ((prev_prev_insn.insn_opcode >> OP_SH_RT)
2517                                      & OP_MASK_RT),
2518                                     MIPS_GR_REG))
2519               /* If one instruction sets a condition code and the
2520                  other one uses a condition code, we can not swap.  */
2521               || ((pinfo & INSN_READ_COND_CODE)
2522                   && (prev_pinfo & INSN_WRITE_COND_CODE))
2523               || ((pinfo & INSN_WRITE_COND_CODE)
2524                   && (prev_pinfo & INSN_READ_COND_CODE))
2525               /* If the previous instruction uses the PC, we can not
2526                  swap.  */
2527               || (mips_opts.mips16
2528                   && (prev_pinfo & MIPS16_INSN_READ_PC))
2529               /* If the previous instruction was extended, we can not
2530                  swap.  */
2531               || (mips_opts.mips16 && prev_insn_extended)
2532               /* If the previous instruction had a fixup in mips16
2533                  mode, we can not swap.  This normally means that the
2534                  previous instruction was a 4 byte branch anyhow.  */
2535               || (mips_opts.mips16 && prev_insn_fixp[0])
2536               /* If the previous instruction is a sync, sync.l, or
2537                  sync.p, we can not swap.  */
2538               || (prev_pinfo & INSN_SYNC))
2539             {
2540               /* We could do even better for unconditional branches to
2541                  portions of this object file; we could pick up the
2542                  instruction at the destination, put it in the delay
2543                  slot, and bump the destination address.  */
2544               emit_nop ();
2545               /* Update the previous insn information.  */
2546               prev_prev_insn = *ip;
2547               prev_insn.insn_mo = &dummy_opcode;
2548             }
2549           else
2550             {
2551               /* It looks like we can actually do the swap.  */
2552               if (! mips_opts.mips16)
2553                 {
2554                   char *prev_f;
2555                   char temp[4];
2556
2557                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2558                   if (!relaxed_branch)
2559                     {
2560                       /* If this is not a relaxed branch, then just
2561                          swap the instructions.  */
2562                       memcpy (temp, prev_f, 4);
2563                       memcpy (prev_f, f, 4);
2564                       memcpy (f, temp, 4);
2565                     }
2566                   else
2567                     {
2568                       /* If this is a relaxed branch, then we move the
2569                          instruction to be placed in the delay slot to
2570                          the current frag, shrinking the fixed part of
2571                          the originating frag.  If the branch occupies
2572                          the tail of the latter, we move it backwards,
2573                          into the space freed by the moved instruction.  */
2574                       f = frag_more (4);
2575                       memcpy (f, prev_f, 4);
2576                       prev_insn_frag->fr_fix -= 4;
2577                       if (prev_insn_frag->fr_type == rs_machine_dependent)
2578                         memmove (prev_f, prev_f + 4, prev_insn_frag->fr_var);
2579                     }
2580
2581                   if (prev_insn_fixp[0])
2582                     {
2583                       prev_insn_fixp[0]->fx_frag = frag_now;
2584                       prev_insn_fixp[0]->fx_where = f - frag_now->fr_literal;
2585                     }
2586                   if (prev_insn_fixp[1])
2587                     {
2588                       prev_insn_fixp[1]->fx_frag = frag_now;
2589                       prev_insn_fixp[1]->fx_where = f - frag_now->fr_literal;
2590                     }
2591                   if (prev_insn_fixp[2])
2592                     {
2593                       prev_insn_fixp[2]->fx_frag = frag_now;
2594                       prev_insn_fixp[2]->fx_where = f - frag_now->fr_literal;
2595                     }
2596                   if (prev_insn_fixp[0] && HAVE_NEWABI
2597                       && prev_insn_frag != frag_now
2598                       && (prev_insn_fixp[0]->fx_r_type
2599                           == BFD_RELOC_MIPS_GOT_DISP
2600                           || (prev_insn_fixp[0]->fx_r_type
2601                               == BFD_RELOC_MIPS_CALL16)))
2602                     {
2603                       /* To avoid confusion in tc_gen_reloc, we must
2604                          ensure that this does not become a variant
2605                          frag.  */
2606                       force_new_frag = TRUE;
2607                     }
2608
2609                   if (!relaxed_branch)
2610                     {
2611                       if (fixp[0])
2612                         {
2613                           fixp[0]->fx_frag = prev_insn_frag;
2614                           fixp[0]->fx_where = prev_insn_where;
2615                         }
2616                       if (fixp[1])
2617                         {
2618                           fixp[1]->fx_frag = prev_insn_frag;
2619                           fixp[1]->fx_where = prev_insn_where;
2620                         }
2621                       if (fixp[2])
2622                         {
2623                           fixp[2]->fx_frag = prev_insn_frag;
2624                           fixp[2]->fx_where = prev_insn_where;
2625                         }
2626                     }
2627                   else if (prev_insn_frag->fr_type == rs_machine_dependent)
2628                     {
2629                       if (fixp[0])
2630                         fixp[0]->fx_where -= 4;
2631                       if (fixp[1])
2632                         fixp[1]->fx_where -= 4;
2633                       if (fixp[2])
2634                         fixp[2]->fx_where -= 4;
2635                     }
2636                 }
2637               else
2638                 {
2639                   char *prev_f;
2640                   char temp[2];
2641
2642                   assert (prev_insn_fixp[0] == NULL);
2643                   assert (prev_insn_fixp[1] == NULL);
2644                   assert (prev_insn_fixp[2] == NULL);
2645                   prev_f = prev_insn_frag->fr_literal + prev_insn_where;
2646                   memcpy (temp, prev_f, 2);
2647                   memcpy (prev_f, f, 2);
2648                   if (*reloc_type != BFD_RELOC_MIPS16_JMP)
2649                     {
2650                       assert (*reloc_type == BFD_RELOC_UNUSED);
2651                       memcpy (f, temp, 2);
2652                     }
2653                   else
2654                     {
2655                       memcpy (f, f + 2, 2);
2656                       memcpy (f + 2, temp, 2);
2657                     }
2658                   if (fixp[0])
2659                     {
2660                       fixp[0]->fx_frag = prev_insn_frag;
2661                       fixp[0]->fx_where = prev_insn_where;
2662                     }
2663                   if (fixp[1])
2664                     {
2665                       fixp[1]->fx_frag = prev_insn_frag;
2666                       fixp[1]->fx_where = prev_insn_where;
2667                     }
2668                   if (fixp[2])
2669                     {
2670                       fixp[2]->fx_frag = prev_insn_frag;
2671                       fixp[2]->fx_where = prev_insn_where;
2672                     }
2673                 }
2674
2675               /* Update the previous insn information; leave prev_insn
2676                  unchanged.  */
2677               prev_prev_insn = *ip;
2678             }
2679           prev_insn_is_delay_slot = 1;
2680
2681           /* If that was an unconditional branch, forget the previous
2682              insn information.  */
2683           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
2684             {
2685               prev_prev_insn.insn_mo = &dummy_opcode;
2686               prev_insn.insn_mo = &dummy_opcode;
2687             }
2688
2689           prev_insn_fixp[0] = NULL;
2690           prev_insn_fixp[1] = NULL;
2691           prev_insn_fixp[2] = NULL;
2692           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2693           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2694           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2695           prev_insn_extended = 0;
2696         }
2697       else if (pinfo & INSN_COND_BRANCH_LIKELY)
2698         {
2699           /* We don't yet optimize a branch likely.  What we should do
2700              is look at the target, copy the instruction found there
2701              into the delay slot, and increment the branch to jump to
2702              the next instruction.  */
2703           emit_nop ();
2704           /* Update the previous insn information.  */
2705           prev_prev_insn = *ip;
2706           prev_insn.insn_mo = &dummy_opcode;
2707           prev_insn_fixp[0] = NULL;
2708           prev_insn_fixp[1] = NULL;
2709           prev_insn_fixp[2] = NULL;
2710           prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2711           prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2712           prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2713           prev_insn_extended = 0;
2714           prev_insn_is_delay_slot = 1;
2715         }
2716       else
2717         {
2718           /* Update the previous insn information.  */
2719           if (nops > 0)
2720             prev_prev_insn.insn_mo = &dummy_opcode;
2721           else
2722             prev_prev_insn = prev_insn;
2723           prev_insn = *ip;
2724
2725           /* Any time we see a branch, we always fill the delay slot
2726              immediately; since this insn is not a branch, we know it
2727              is not in a delay slot.  */
2728           prev_insn_is_delay_slot = 0;
2729
2730           prev_insn_fixp[0] = fixp[0];
2731           prev_insn_fixp[1] = fixp[1];
2732           prev_insn_fixp[2] = fixp[2];
2733           prev_insn_reloc_type[0] = reloc_type[0];
2734           prev_insn_reloc_type[1] = reloc_type[1];
2735           prev_insn_reloc_type[2] = reloc_type[2];
2736           if (mips_opts.mips16)
2737             prev_insn_extended = (ip->use_extend
2738                                   || *reloc_type > BFD_RELOC_UNUSED);
2739         }
2740
2741       prev_prev_insn_unreordered = prev_insn_unreordered;
2742       prev_insn_unreordered = 0;
2743       prev_insn_frag = frag_now;
2744       prev_insn_where = f - frag_now->fr_literal;
2745       prev_insn_valid = 1;
2746     }
2747   else if (mips_relax.sequence != 2)
2748     {
2749       /* We need to record a bit of information even when we are not
2750          reordering, in order to determine the base address for mips16
2751          PC relative relocs.  */
2752       prev_prev_insn = prev_insn;
2753       prev_insn = *ip;
2754       prev_insn_reloc_type[0] = reloc_type[0];
2755       prev_insn_reloc_type[1] = reloc_type[1];
2756       prev_insn_reloc_type[2] = reloc_type[2];
2757       prev_prev_insn_unreordered = prev_insn_unreordered;
2758       prev_insn_unreordered = 1;
2759     }
2760
2761   /* We just output an insn, so the next one doesn't have a label.  */
2762   mips_clear_insn_labels ();
2763 }
2764
2765 /* This function forgets that there was any previous instruction or
2766    label.  If PRESERVE is non-zero, it remembers enough information to
2767    know whether nops are needed before a noreorder section.  */
2768
2769 static void
2770 mips_no_prev_insn (int preserve)
2771 {
2772   if (! preserve)
2773     {
2774       prev_insn.insn_mo = &dummy_opcode;
2775       prev_prev_insn.insn_mo = &dummy_opcode;
2776       prev_nop_frag = NULL;
2777       prev_nop_frag_holds = 0;
2778       prev_nop_frag_required = 0;
2779       prev_nop_frag_since = 0;
2780     }
2781   prev_insn_valid = 0;
2782   prev_insn_is_delay_slot = 0;
2783   prev_insn_unreordered = 0;
2784   prev_insn_extended = 0;
2785   prev_insn_reloc_type[0] = BFD_RELOC_UNUSED;
2786   prev_insn_reloc_type[1] = BFD_RELOC_UNUSED;
2787   prev_insn_reloc_type[2] = BFD_RELOC_UNUSED;
2788   prev_prev_insn_unreordered = 0;
2789   mips_clear_insn_labels ();
2790 }
2791
2792 /* This function must be called whenever we turn on noreorder or emit
2793    something other than instructions.  It inserts any NOPS which might
2794    be needed by the previous instruction, and clears the information
2795    kept for the previous instructions.  The INSNS parameter is true if
2796    instructions are to follow.  */
2797
2798 static void
2799 mips_emit_delays (bfd_boolean insns)
2800 {
2801   if (! mips_opts.noreorder)
2802     {
2803       int nops;
2804
2805       nops = 0;
2806       if ((! mips_opts.mips16
2807            && ((prev_insn.insn_mo->pinfo
2808                 & (INSN_LOAD_COPROC_DELAY
2809                    | INSN_COPROC_MOVE_DELAY
2810                    | INSN_WRITE_COND_CODE))
2811                && ! cop_interlocks))
2812           || (! hilo_interlocks
2813               && (prev_insn.insn_mo->pinfo
2814                   & (INSN_READ_LO
2815                      | INSN_READ_HI)))
2816           || (! mips_opts.mips16
2817               && (prev_insn.insn_mo->pinfo & INSN_LOAD_MEMORY_DELAY)
2818               && ! gpr_interlocks)
2819           || (! mips_opts.mips16
2820               && (prev_insn.insn_mo->pinfo & INSN_COPROC_MEMORY_DELAY)
2821               && ! cop_mem_interlocks))
2822         {
2823           /* Itbl support may require additional care here.  */
2824           ++nops;
2825           if ((! mips_opts.mips16
2826                && ((prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
2827                    && ! cop_interlocks))
2828               || (! hilo_interlocks
2829                   && ((prev_insn.insn_mo->pinfo & INSN_READ_HI)
2830                       || (prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2831             ++nops;
2832
2833           if (prev_insn_unreordered)
2834             nops = 0;
2835         }
2836       else if ((! mips_opts.mips16
2837                 && ((prev_prev_insn.insn_mo->pinfo & INSN_WRITE_COND_CODE)
2838                     && ! cop_interlocks))
2839                || (! hilo_interlocks
2840                    && ((prev_prev_insn.insn_mo->pinfo & INSN_READ_HI)
2841                        || (prev_prev_insn.insn_mo->pinfo & INSN_READ_LO))))
2842         {
2843           /* Itbl support may require additional care here.  */
2844           if (! prev_prev_insn_unreordered)
2845             ++nops;
2846         }
2847
2848       if (mips_fix_vr4120 && prev_insn.insn_mo->name)
2849         {
2850           int min_nops = 0;
2851           const char *pn = prev_insn.insn_mo->name;
2852           if (strncmp (pn, "macc", 4) == 0
2853               || strncmp (pn, "dmacc", 5) == 0
2854               || strncmp (pn, "dmult", 5) == 0
2855               || strstr (pn, "div"))
2856             min_nops = 1;
2857           if (nops < min_nops)
2858             nops = min_nops;
2859         }
2860
2861       if (nops > 0)
2862         {
2863           struct insn_label_list *l;
2864
2865           if (insns)
2866             {
2867               /* Record the frag which holds the nop instructions, so
2868                  that we can remove them if we don't need them.  */
2869               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
2870               prev_nop_frag = frag_now;
2871               prev_nop_frag_holds = nops;
2872               prev_nop_frag_required = 0;
2873               prev_nop_frag_since = 0;
2874             }
2875
2876           for (; nops > 0; --nops)
2877             emit_nop ();
2878
2879           if (insns)
2880             {
2881               /* Move on to a new frag, so that it is safe to simply
2882                  decrease the size of prev_nop_frag.  */
2883               frag_wane (frag_now);
2884               frag_new (0);
2885             }
2886
2887           for (l = insn_labels; l != NULL; l = l->next)
2888             {
2889               valueT val;
2890
2891               assert (S_GET_SEGMENT (l->label) == now_seg);
2892               symbol_set_frag (l->label, frag_now);
2893               val = (valueT) frag_now_fix ();
2894               /* mips16 text labels are stored as odd.  */
2895               if (mips_opts.mips16)
2896                 ++val;
2897               S_SET_VALUE (l->label, val);
2898             }
2899         }
2900     }
2901
2902   /* Mark instruction labels in mips16 mode.  */
2903   if (insns)
2904     mips16_mark_labels ();
2905
2906   mips_no_prev_insn (insns);
2907 }
2908
2909 /* Set up global variables for the start of a new macro.  */
2910
2911 static void
2912 macro_start (void)
2913 {
2914   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
2915   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
2916                                      && (prev_insn.insn_mo->pinfo
2917                                          & (INSN_UNCOND_BRANCH_DELAY
2918                                             | INSN_COND_BRANCH_DELAY
2919                                             | INSN_COND_BRANCH_LIKELY)) != 0);
2920 }
2921
2922 /* Given that a macro is longer than 4 bytes, return the appropriate warning
2923    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
2924    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
2925
2926 static const char *
2927 macro_warning (relax_substateT subtype)
2928 {
2929   if (subtype & RELAX_DELAY_SLOT)
2930     return _("Macro instruction expanded into multiple instructions"
2931              " in a branch delay slot");
2932   else if (subtype & RELAX_NOMACRO)
2933     return _("Macro instruction expanded into multiple instructions");
2934   else
2935     return 0;
2936 }
2937
2938 /* Finish up a macro.  Emit warnings as appropriate.  */
2939
2940 static void
2941 macro_end (void)
2942 {
2943   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
2944     {
2945       relax_substateT subtype;
2946
2947       /* Set up the relaxation warning flags.  */
2948       subtype = 0;
2949       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
2950         subtype |= RELAX_SECOND_LONGER;
2951       if (mips_opts.warn_about_macros)
2952         subtype |= RELAX_NOMACRO;
2953       if (mips_macro_warning.delay_slot_p)
2954         subtype |= RELAX_DELAY_SLOT;
2955
2956       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
2957         {
2958           /* Either the macro has a single implementation or both
2959              implementations are longer than 4 bytes.  Emit the
2960              warning now.  */
2961           const char *msg = macro_warning (subtype);
2962           if (msg != 0)
2963             as_warn (msg);
2964         }
2965       else
2966         {
2967           /* One implementation might need a warning but the other
2968              definitely doesn't.  */
2969           mips_macro_warning.first_frag->fr_subtype |= subtype;
2970         }
2971     }
2972 }
2973
2974 /* Build an instruction created by a macro expansion.  This is passed
2975    a pointer to the count of instructions created so far, an
2976    expression, the name of the instruction to build, an operand format
2977    string, and corresponding arguments.  */
2978
2979 static void
2980 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
2981 {
2982   struct mips_cl_insn insn;
2983   bfd_reloc_code_real_type r[3];
2984   va_list args;
2985
2986   va_start (args, fmt);
2987
2988   if (mips_opts.mips16)
2989     {
2990       mips16_macro_build (ep, name, fmt, args);
2991       va_end (args);
2992       return;
2993     }
2994
2995   r[0] = BFD_RELOC_UNUSED;
2996   r[1] = BFD_RELOC_UNUSED;
2997   r[2] = BFD_RELOC_UNUSED;
2998   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
2999   assert (insn.insn_mo);
3000   assert (strcmp (name, insn.insn_mo->name) == 0);
3001
3002   /* Search until we get a match for NAME.  */
3003   while (1)
3004     {
3005       /* It is assumed here that macros will never generate
3006          MDMX or MIPS-3D instructions.  */
3007       if (strcmp (fmt, insn.insn_mo->args) == 0
3008           && insn.insn_mo->pinfo != INSN_MACRO
3009           && OPCODE_IS_MEMBER (insn.insn_mo,
3010                                (mips_opts.isa
3011                                 | (file_ase_mips16 ? INSN_MIPS16 : 0)),
3012                                mips_opts.arch)
3013           && (mips_opts.arch != CPU_R4650 || (insn.insn_mo->pinfo & FP_D) == 0))
3014         break;
3015
3016       ++insn.insn_mo;
3017       assert (insn.insn_mo->name);
3018       assert (strcmp (name, insn.insn_mo->name) == 0);
3019     }
3020
3021   insn.insn_opcode = insn.insn_mo->match;
3022   for (;;)
3023     {
3024       switch (*fmt++)
3025         {
3026         case '\0':
3027           break;
3028
3029         case ',':
3030         case '(':
3031         case ')':
3032           continue;
3033
3034         case '+':
3035           switch (*fmt++)
3036             {
3037             case 'A':
3038             case 'E':
3039               insn.insn_opcode |= (va_arg (args, int)
3040                                    & OP_MASK_SHAMT) << OP_SH_SHAMT;
3041               continue;
3042
3043             case 'B':
3044             case 'F':
3045               /* Note that in the macro case, these arguments are already
3046                  in MSB form.  (When handling the instruction in the
3047                  non-macro case, these arguments are sizes from which
3048                  MSB values must be calculated.)  */
3049               insn.insn_opcode |= (va_arg (args, int)
3050                                    & OP_MASK_INSMSB) << OP_SH_INSMSB;
3051               continue;
3052
3053             case 'C':
3054             case 'G':
3055             case 'H':
3056               /* Note that in the macro case, these arguments are already
3057                  in MSBD form.  (When handling the instruction in the
3058                  non-macro case, these arguments are sizes from which
3059                  MSBD values must be calculated.)  */
3060               insn.insn_opcode |= (va_arg (args, int)
3061                                    & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
3062               continue;
3063
3064             default:
3065               internalError ();
3066             }
3067           continue;
3068
3069         case 't':
3070         case 'w':
3071         case 'E':
3072           insn.insn_opcode |= va_arg (args, int) << OP_SH_RT;
3073           continue;
3074
3075         case 'c':
3076           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE;
3077           continue;
3078
3079         case 'T':
3080         case 'W':
3081           insn.insn_opcode |= va_arg (args, int) << OP_SH_FT;
3082           continue;
3083
3084         case 'd':
3085         case 'G':
3086         case 'K':
3087           insn.insn_opcode |= va_arg (args, int) << OP_SH_RD;
3088           continue;
3089
3090         case 'U':
3091           {
3092             int tmp = va_arg (args, int);
3093
3094             insn.insn_opcode |= tmp << OP_SH_RT;
3095             insn.insn_opcode |= tmp << OP_SH_RD;
3096             continue;
3097           }
3098
3099         case 'V':
3100         case 'S':
3101           insn.insn_opcode |= va_arg (args, int) << OP_SH_FS;
3102           continue;
3103
3104         case 'z':
3105           continue;
3106
3107         case '<':
3108           insn.insn_opcode |= va_arg (args, int) << OP_SH_SHAMT;
3109           continue;
3110
3111         case 'D':
3112           insn.insn_opcode |= va_arg (args, int) << OP_SH_FD;
3113           continue;
3114
3115         case 'B':
3116           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE20;
3117           continue;
3118
3119         case 'J':
3120           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE19;
3121           continue;
3122
3123         case 'q':
3124           insn.insn_opcode |= va_arg (args, int) << OP_SH_CODE2;
3125           continue;
3126
3127         case 'b':
3128         case 's':
3129         case 'r':
3130         case 'v':
3131           insn.insn_opcode |= va_arg (args, int) << OP_SH_RS;
3132           continue;
3133
3134         case 'i':
3135         case 'j':
3136         case 'o':
3137           *r = (bfd_reloc_code_real_type) va_arg (args, int);
3138           assert (*r == BFD_RELOC_GPREL16
3139                   || *r == BFD_RELOC_MIPS_LITERAL
3140                   || *r == BFD_RELOC_MIPS_HIGHER
3141                   || *r == BFD_RELOC_HI16_S
3142                   || *r == BFD_RELOC_LO16
3143                   || *r == BFD_RELOC_MIPS_GOT16
3144                   || *r == BFD_RELOC_MIPS_CALL16
3145                   || *r == BFD_RELOC_MIPS_GOT_DISP
3146                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3147                   || *r == BFD_RELOC_MIPS_GOT_OFST
3148                   || *r == BFD_RELOC_MIPS_GOT_LO16
3149                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3150           continue;
3151
3152         case 'u':
3153           *r = (bfd_reloc_code_real_type) va_arg (args, int);
3154           assert (ep != NULL
3155                   && (ep->X_op == O_constant
3156                       || (ep->X_op == O_symbol
3157                           && (*r == BFD_RELOC_MIPS_HIGHEST
3158                               || *r == BFD_RELOC_HI16_S
3159                               || *r == BFD_RELOC_HI16
3160                               || *r == BFD_RELOC_GPREL16
3161                               || *r == BFD_RELOC_MIPS_GOT_HI16
3162                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3163           continue;
3164
3165         case 'p':
3166           assert (ep != NULL);
3167           /*
3168            * This allows macro() to pass an immediate expression for
3169            * creating short branches without creating a symbol.
3170            * Note that the expression still might come from the assembly
3171            * input, in which case the value is not checked for range nor
3172            * is a relocation entry generated (yuck).
3173            */
3174           if (ep->X_op == O_constant)
3175             {
3176               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3177               ep = NULL;
3178             }
3179           else
3180             *r = BFD_RELOC_16_PCREL_S2;
3181           continue;
3182
3183         case 'a':
3184           assert (ep != NULL);
3185           *r = BFD_RELOC_MIPS_JMP;
3186           continue;
3187
3188         case 'C':
3189           insn.insn_opcode |= va_arg (args, unsigned long);
3190           continue;
3191
3192         default:
3193           internalError ();
3194         }
3195       break;
3196     }
3197   va_end (args);
3198   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3199
3200   append_insn (&insn, ep, r);
3201 }
3202
3203 static void
3204 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3205                     va_list args)
3206 {
3207   struct mips_cl_insn insn;
3208   bfd_reloc_code_real_type r[3]
3209     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3210
3211   insn.insn_mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3212   assert (insn.insn_mo);
3213   assert (strcmp (name, insn.insn_mo->name) == 0);
3214
3215   while (strcmp (fmt, insn.insn_mo->args) != 0
3216          || insn.insn_mo->pinfo == INSN_MACRO)
3217     {
3218       ++insn.insn_mo;
3219       assert (insn.insn_mo->name);
3220       assert (strcmp (name, insn.insn_mo->name) == 0);
3221     }
3222
3223   insn.insn_opcode = insn.insn_mo->match;
3224   insn.use_extend = FALSE;
3225
3226   for (;;)
3227     {
3228       int c;
3229
3230       c = *fmt++;
3231       switch (c)
3232         {
3233         case '\0':
3234           break;
3235
3236         case ',':
3237         case '(':
3238         case ')':
3239           continue;
3240
3241         case 'y':
3242         case 'w':
3243           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RY;
3244           continue;
3245
3246         case 'x':
3247         case 'v':
3248           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RX;
3249           continue;
3250
3251         case 'z':
3252           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_RZ;
3253           continue;
3254
3255         case 'Z':
3256           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_MOVE32Z;
3257           continue;
3258
3259         case '0':
3260         case 'S':
3261         case 'P':
3262         case 'R':
3263           continue;
3264
3265         case 'X':
3266           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_REGR32;
3267           continue;
3268
3269         case 'Y':
3270           {
3271             int regno;
3272
3273             regno = va_arg (args, int);
3274             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3275             insn.insn_opcode |= regno << MIPS16OP_SH_REG32R;
3276           }
3277           continue;
3278
3279         case '<':
3280         case '>':
3281         case '4':
3282         case '5':
3283         case 'H':
3284         case 'W':
3285         case 'D':
3286         case 'j':
3287         case '8':
3288         case 'V':
3289         case 'C':
3290         case 'U':
3291         case 'k':
3292         case 'K':
3293         case 'p':
3294         case 'q':
3295           {
3296             assert (ep != NULL);
3297
3298             if (ep->X_op != O_constant)
3299               *r = (int) BFD_RELOC_UNUSED + c;
3300             else
3301               {
3302                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3303                               FALSE, &insn.insn_opcode, &insn.use_extend,
3304                               &insn.extend);
3305                 ep = NULL;
3306                 *r = BFD_RELOC_UNUSED;
3307               }
3308           }
3309           continue;
3310
3311         case '6':
3312           insn.insn_opcode |= va_arg (args, int) << MIPS16OP_SH_IMM6;
3313           continue;
3314         }
3315
3316       break;
3317     }
3318
3319   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3320
3321   append_insn (&insn, ep, r);
3322 }
3323
3324 /*
3325  * Generate a "jalr" instruction with a relocation hint to the called
3326  * function.  This occurs in NewABI PIC code.
3327  */
3328 static void
3329 macro_build_jalr (expressionS *ep)
3330 {
3331   char *f = NULL;
3332
3333   if (HAVE_NEWABI)
3334     {
3335       frag_grow (8);
3336       f = frag_more (0);
3337     }
3338   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3339   if (HAVE_NEWABI)
3340     fix_new_exp (frag_now, f - frag_now->fr_literal,
3341                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3342 }
3343
3344 /*
3345  * Generate a "lui" instruction.
3346  */
3347 static void
3348 macro_build_lui (expressionS *ep, int regnum)
3349 {
3350   expressionS high_expr;
3351   struct mips_cl_insn insn;
3352   bfd_reloc_code_real_type r[3]
3353     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3354   const char *name = "lui";
3355   const char *fmt = "t,u";
3356
3357   assert (! mips_opts.mips16);
3358
3359   high_expr = *ep;
3360
3361   if (high_expr.X_op == O_constant)
3362     {
3363       /* we can compute the instruction now without a relocation entry */
3364       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3365                                 >> 16) & 0xffff;
3366       *r = BFD_RELOC_UNUSED;
3367     }
3368   else
3369     {
3370       assert (ep->X_op == O_symbol);
3371       /* _gp_disp is a special case, used from s_cpload.  */
3372       assert (mips_pic == NO_PIC
3373               || (! HAVE_NEWABI
3374                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0));
3375       *r = BFD_RELOC_HI16_S;
3376     }
3377
3378   insn.insn_mo = (struct mips_opcode *) hash_find (op_hash, name);
3379   assert (insn.insn_mo);
3380   assert (strcmp (name, insn.insn_mo->name) == 0);
3381   assert (strcmp (fmt, insn.insn_mo->args) == 0);
3382
3383   insn.insn_opcode = insn.insn_mo->match | (regnum << OP_SH_RT);
3384   if (*r == BFD_RELOC_UNUSED)
3385     {
3386       insn.insn_opcode |= high_expr.X_add_number;
3387       append_insn (&insn, NULL, r);
3388     }
3389   else
3390     append_insn (&insn, &high_expr, r);
3391 }
3392
3393 /* Generate a sequence of instructions to do a load or store from a constant
3394    offset off of a base register (breg) into/from a target register (treg),
3395    using AT if necessary.  */
3396 static void
3397 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3398                               int treg, int breg, int dbl)
3399 {
3400   assert (ep->X_op == O_constant);
3401
3402   /* Sign-extending 32-bit constants makes their handling easier.  */
3403   if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
3404                   == ~((bfd_vma) 0x7fffffff)))
3405     {
3406       if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
3407         as_bad (_("constant too large"));
3408
3409       ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
3410                           - 0x80000000);
3411     }
3412
3413   /* Right now, this routine can only handle signed 32-bit constants.  */
3414   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3415     as_warn (_("operand overflow"));
3416
3417   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3418     {
3419       /* Signed 16-bit offset will fit in the op.  Easy!  */
3420       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3421     }
3422   else
3423     {
3424       /* 32-bit offset, need multiple instructions and AT, like:
3425            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3426            addu     $tempreg,$tempreg,$breg
3427            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3428          to handle the complete offset.  */
3429       macro_build_lui (ep, AT);
3430       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3431       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3432
3433       if (mips_opts.noat)
3434         as_warn (_("Macro used $at after \".set noat\""));
3435     }
3436 }
3437
3438 /*                      set_at()
3439  * Generates code to set the $at register to true (one)
3440  * if reg is less than the immediate expression.
3441  */
3442 static void
3443 set_at (int reg, int unsignedp)
3444 {
3445   if (imm_expr.X_op == O_constant
3446       && imm_expr.X_add_number >= -0x8000
3447       && imm_expr.X_add_number < 0x8000)
3448     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3449                  AT, reg, BFD_RELOC_LO16);
3450   else
3451     {
3452       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3453       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3454     }
3455 }
3456
3457 static void
3458 normalize_constant_expr (expressionS *ex)
3459 {
3460   if (ex->X_op == O_constant && HAVE_32BIT_GPRS)
3461     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3462                         - 0x80000000);
3463 }
3464
3465 /* Warn if an expression is not a constant.  */
3466
3467 static void
3468 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3469 {
3470   if (ex->X_op == O_big)
3471     as_bad (_("unsupported large constant"));
3472   else if (ex->X_op != O_constant)
3473     as_bad (_("Instruction %s requires absolute expression"), ip->insn_mo->name);
3474
3475   normalize_constant_expr (ex);
3476 }
3477
3478 /* Count the leading zeroes by performing a binary chop. This is a
3479    bulky bit of source, but performance is a LOT better for the
3480    majority of values than a simple loop to count the bits:
3481        for (lcnt = 0; (lcnt < 32); lcnt++)
3482          if ((v) & (1 << (31 - lcnt)))
3483            break;
3484   However it is not code size friendly, and the gain will drop a bit
3485   on certain cached systems.
3486 */
3487 #define COUNT_TOP_ZEROES(v)             \
3488   (((v) & ~0xffff) == 0                 \
3489    ? ((v) & ~0xff) == 0                 \
3490      ? ((v) & ~0xf) == 0                \
3491        ? ((v) & ~0x3) == 0              \
3492          ? ((v) & ~0x1) == 0            \
3493            ? !(v)                       \
3494              ? 32                       \
3495              : 31                       \
3496            : 30                         \
3497          : ((v) & ~0x7) == 0            \
3498            ? 29                         \
3499            : 28                         \
3500        : ((v) & ~0x3f) == 0             \
3501          ? ((v) & ~0x1f) == 0           \
3502            ? 27                         \
3503            : 26                         \
3504          : ((v) & ~0x7f) == 0           \
3505            ? 25                         \
3506            : 24                         \
3507      : ((v) & ~0xfff) == 0              \
3508        ? ((v) & ~0x3ff) == 0            \
3509          ? ((v) & ~0x1ff) == 0          \
3510            ? 23                         \
3511            : 22                         \
3512          : ((v) & ~0x7ff) == 0          \
3513            ? 21                         \
3514            : 20                         \
3515        : ((v) & ~0x3fff) == 0           \
3516          ? ((v) & ~0x1fff) == 0         \
3517            ? 19                         \
3518            : 18                         \
3519          : ((v) & ~0x7fff) == 0         \
3520            ? 17                         \
3521            : 16                         \
3522    : ((v) & ~0xffffff) == 0             \
3523      ? ((v) & ~0xfffff) == 0            \
3524        ? ((v) & ~0x3ffff) == 0          \
3525          ? ((v) & ~0x1ffff) == 0        \
3526            ? 15                         \
3527            : 14                         \
3528          : ((v) & ~0x7ffff) == 0        \
3529            ? 13                         \
3530            : 12                         \
3531        : ((v) & ~0x3fffff) == 0         \
3532          ? ((v) & ~0x1fffff) == 0       \
3533            ? 11                         \
3534            : 10                         \
3535          : ((v) & ~0x7fffff) == 0       \
3536            ? 9                          \
3537            : 8                          \
3538      : ((v) & ~0xfffffff) == 0          \
3539        ? ((v) & ~0x3ffffff) == 0        \
3540          ? ((v) & ~0x1ffffff) == 0      \
3541            ? 7                          \
3542            : 6                          \
3543          : ((v) & ~0x7ffffff) == 0      \
3544            ? 5                          \
3545            : 4                          \
3546        : ((v) & ~0x3fffffff) == 0       \
3547          ? ((v) & ~0x1fffffff) == 0     \
3548            ? 3                          \
3549            : 2                          \
3550          : ((v) & ~0x7fffffff) == 0     \
3551            ? 1                          \
3552            : 0)
3553
3554 /*                      load_register()
3555  *  This routine generates the least number of instructions necessary to load
3556  *  an absolute expression value into a register.
3557  */
3558 static void
3559 load_register (int reg, expressionS *ep, int dbl)
3560 {
3561   int freg;
3562   expressionS hi32, lo32;
3563
3564   if (ep->X_op != O_big)
3565     {
3566       assert (ep->X_op == O_constant);
3567
3568       /* Sign-extending 32-bit constants makes their handling easier.  */
3569       if (! dbl && ! ((ep->X_add_number & ~((bfd_vma) 0x7fffffff))
3570                       == ~((bfd_vma) 0x7fffffff)))
3571         {
3572           if (ep->X_add_number & ~((bfd_vma) 0xffffffff))
3573             as_bad (_("constant too large"));
3574
3575           ep->X_add_number = (((ep->X_add_number & 0xffffffff) ^ 0x80000000)
3576                               - 0x80000000);
3577         }
3578
3579       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3580         {
3581           /* We can handle 16 bit signed values with an addiu to
3582              $zero.  No need to ever use daddiu here, since $zero and
3583              the result are always correct in 32 bit mode.  */
3584           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3585           return;
3586         }
3587       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3588         {
3589           /* We can handle 16 bit unsigned values with an ori to
3590              $zero.  */
3591           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3592           return;
3593         }
3594       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3595         {
3596           /* 32 bit values require an lui.  */
3597           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3598           if ((ep->X_add_number & 0xffff) != 0)
3599             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3600           return;
3601         }
3602     }
3603
3604   /* The value is larger than 32 bits.  */
3605
3606   if (HAVE_32BIT_GPRS)
3607     {
3608       as_bad (_("Number (0x%lx) larger than 32 bits"),
3609               (unsigned long) ep->X_add_number);
3610       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3611       return;
3612     }
3613
3614   if (ep->X_op != O_big)
3615     {
3616       hi32 = *ep;
3617       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3618       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3619       hi32.X_add_number &= 0xffffffff;
3620       lo32 = *ep;
3621       lo32.X_add_number &= 0xffffffff;
3622     }
3623   else
3624     {
3625       assert (ep->X_add_number > 2);
3626       if (ep->X_add_number == 3)
3627         generic_bignum[3] = 0;
3628       else if (ep->X_add_number > 4)
3629         as_bad (_("Number larger than 64 bits"));
3630       lo32.X_op = O_constant;
3631       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
3632       hi32.X_op = O_constant;
3633       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
3634     }
3635
3636   if (hi32.X_add_number == 0)
3637     freg = 0;
3638   else
3639     {
3640       int shift, bit;
3641       unsigned long hi, lo;
3642
3643       if (hi32.X_add_number == (offsetT) 0xffffffff)
3644         {
3645           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
3646             {
3647               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3648               return;
3649             }
3650           if (lo32.X_add_number & 0x80000000)
3651             {
3652               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3653               if (lo32.X_add_number & 0xffff)
3654                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3655               return;
3656             }
3657         }
3658
3659       /* Check for 16bit shifted constant.  We know that hi32 is
3660          non-zero, so start the mask on the first bit of the hi32
3661          value.  */
3662       shift = 17;
3663       do
3664         {
3665           unsigned long himask, lomask;
3666
3667           if (shift < 32)
3668             {
3669               himask = 0xffff >> (32 - shift);
3670               lomask = (0xffff << shift) & 0xffffffff;
3671             }
3672           else
3673             {
3674               himask = 0xffff << (shift - 32);
3675               lomask = 0;
3676             }
3677           if ((hi32.X_add_number & ~(offsetT) himask) == 0
3678               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
3679             {
3680               expressionS tmp;
3681
3682               tmp.X_op = O_constant;
3683               if (shift < 32)
3684                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
3685                                     | (lo32.X_add_number >> shift));
3686               else
3687                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
3688               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3689               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
3690                            reg, reg, (shift >= 32) ? shift - 32 : shift);
3691               return;
3692             }
3693           ++shift;
3694         }
3695       while (shift <= (64 - 16));
3696
3697       /* Find the bit number of the lowest one bit, and store the
3698          shifted value in hi/lo.  */
3699       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
3700       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
3701       if (lo != 0)
3702         {
3703           bit = 0;
3704           while ((lo & 1) == 0)
3705             {
3706               lo >>= 1;
3707               ++bit;
3708             }
3709           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
3710           hi >>= bit;
3711         }
3712       else
3713         {
3714           bit = 32;
3715           while ((hi & 1) == 0)
3716             {
3717               hi >>= 1;
3718               ++bit;
3719             }
3720           lo = hi;
3721           hi = 0;
3722         }
3723
3724       /* Optimize if the shifted value is a (power of 2) - 1.  */
3725       if ((hi == 0 && ((lo + 1) & lo) == 0)
3726           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
3727         {
3728           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
3729           if (shift != 0)
3730             {
3731               expressionS tmp;
3732
3733               /* This instruction will set the register to be all
3734                  ones.  */
3735               tmp.X_op = O_constant;
3736               tmp.X_add_number = (offsetT) -1;
3737               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3738               if (bit != 0)
3739                 {
3740                   bit += shift;
3741                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
3742                                reg, reg, (bit >= 32) ? bit - 32 : bit);
3743                 }
3744               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
3745                            reg, reg, (shift >= 32) ? shift - 32 : shift);
3746               return;
3747             }
3748         }
3749
3750       /* Sign extend hi32 before calling load_register, because we can
3751          generally get better code when we load a sign extended value.  */
3752       if ((hi32.X_add_number & 0x80000000) != 0)
3753         hi32.X_add_number |= ~(offsetT) 0xffffffff;
3754       load_register (reg, &hi32, 0);
3755       freg = reg;
3756     }
3757   if ((lo32.X_add_number & 0xffff0000) == 0)
3758     {
3759       if (freg != 0)
3760         {
3761           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
3762           freg = reg;
3763         }
3764     }
3765   else
3766     {
3767       expressionS mid16;
3768
3769       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
3770         {
3771           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
3772           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
3773           return;
3774         }
3775
3776       if (freg != 0)
3777         {
3778           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
3779           freg = reg;
3780         }
3781       mid16 = lo32;
3782       mid16.X_add_number >>= 16;
3783       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3784       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3785       freg = reg;
3786     }
3787   if ((lo32.X_add_number & 0xffff) != 0)
3788     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
3789 }
3790
3791 static inline void
3792 load_delay_nop (void)
3793 {
3794   if (!gpr_interlocks)
3795     macro_build (NULL, "nop", "");
3796 }
3797
3798 /* Load an address into a register.  */
3799
3800 static void
3801 load_address (int reg, expressionS *ep, int *used_at)
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 (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 provide a GP-relative alternative for these macros.
3845              It used not to be possible with the original relaxation code,
3846              but it could be done now.  */
3847
3848           if (*used_at == 0 && ! mips_opts.noat)
3849             {
3850               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3851               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
3852               macro_build (ep, "daddiu", "t,r,j", reg, reg,
3853                            BFD_RELOC_MIPS_HIGHER);
3854               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
3855               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
3856               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
3857               *used_at = 1;
3858             }
3859           else
3860             {
3861               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
3862               macro_build (ep, "daddiu", "t,r,j", reg, reg,
3863                            BFD_RELOC_MIPS_HIGHER);
3864               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3865               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
3866               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
3867               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
3868             }
3869         }
3870       else
3871         {
3872           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
3873               && ! nopic_need_relax (ep->X_add_symbol, 1))
3874             {
3875               relax_start (ep->X_add_symbol);
3876               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
3877                            mips_gp_register, BFD_RELOC_GPREL16);
3878               relax_switch ();
3879             }
3880           macro_build_lui (ep, reg);
3881           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
3882                        reg, reg, BFD_RELOC_LO16);
3883           if (mips_relax.sequence)
3884             relax_end ();
3885         }
3886     }
3887   else if (mips_pic == SVR4_PIC && ! mips_big_got)
3888     {
3889       expressionS ex;
3890
3891       /* If this is a reference to an external symbol, we want
3892            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3893          Otherwise we want
3894            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3895            nop
3896            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3897          If there is a constant, it must be added in after.
3898
3899          If we have NewABI, we want
3900            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
3901          unless we're referencing a global symbol with a non-zero
3902          offset, in which case cst must be added separately.  */
3903       if (HAVE_NEWABI)
3904         {
3905           if (ep->X_add_number)
3906             {
3907               ex.X_add_number = ep->X_add_number;
3908               ep->X_add_number = 0;
3909               relax_start (ep->X_add_symbol);
3910               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3911                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3912               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3913                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3914               ex.X_op = O_constant;
3915               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3916                            reg, reg, BFD_RELOC_LO16);
3917               ep->X_add_number = ex.X_add_number;
3918               relax_switch ();
3919             }
3920           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3921                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
3922           if (mips_relax.sequence)
3923             relax_end ();
3924         }
3925       else
3926         {
3927           ex.X_add_number = ep->X_add_number;
3928           ep->X_add_number = 0;
3929           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3930                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
3931           load_delay_nop ();
3932           relax_start (ep->X_add_symbol);
3933           relax_switch ();
3934           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3935                        BFD_RELOC_LO16);
3936           relax_end ();
3937
3938           if (ex.X_add_number != 0)
3939             {
3940               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3941                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3942               ex.X_op = O_constant;
3943               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
3944                            reg, reg, BFD_RELOC_LO16);
3945             }
3946         }
3947     }
3948   else if (mips_pic == SVR4_PIC)
3949     {
3950       expressionS ex;
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
3958          Otherwise, for a reference to a local symbol in old ABI, we want
3959            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
3960            nop
3961            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
3962          If there is a constant, it must be added in after.
3963
3964          In the NewABI, for local symbols, with or without offsets, we want:
3965            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
3966            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
3967       */
3968       if (HAVE_NEWABI)
3969         {
3970           ex.X_add_number = ep->X_add_number;
3971           ep->X_add_number = 0;
3972           relax_start (ep->X_add_symbol);
3973           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
3974           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
3975                        reg, reg, mips_gp_register);
3976           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
3977                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
3978           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
3979             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
3980           else if (ex.X_add_number)
3981             {
3982               ex.X_op = O_constant;
3983               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3984                            BFD_RELOC_LO16);
3985             }
3986
3987           ep->X_add_number = ex.X_add_number;
3988           relax_switch ();
3989           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
3990                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
3991           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
3992                        BFD_RELOC_MIPS_GOT_OFST);
3993           relax_end ();
3994         }
3995       else
3996         {
3997           ex.X_add_number = ep->X_add_number;
3998           ep->X_add_number = 0;
3999           relax_start (ep->X_add_symbol);
4000           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4001           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4002                        reg, reg, mips_gp_register);
4003           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4004                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4005           relax_switch ();
4006           if (reg_needs_delay (mips_gp_register))
4007             {
4008               /* We need a nop before loading from $gp.  This special
4009                  check is required because the lui which starts the main
4010                  instruction stream does not refer to $gp, and so will not
4011                  insert the nop which may be required.  */
4012               macro_build (NULL, "nop", "");
4013             }
4014           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4015                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4016           load_delay_nop ();
4017           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4018                        BFD_RELOC_LO16);
4019           relax_end ();
4020
4021           if (ex.X_add_number != 0)
4022             {
4023               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4024                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4025               ex.X_op = O_constant;
4026               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4027                            BFD_RELOC_LO16);
4028             }
4029         }
4030     }
4031   else
4032     abort ();
4033 }
4034
4035 /* Move the contents of register SOURCE into register DEST.  */
4036
4037 static void
4038 move_register (int dest, int source)
4039 {
4040   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4041                dest, source, 0);
4042 }
4043
4044 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4045    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4046    The two alternatives are:
4047
4048    Global symbol                Local sybmol
4049    -------------                ------------
4050    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4051    ...                          ...
4052    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4053
4054    load_got_offset emits the first instruction and add_got_offset
4055    emits the second for a 16-bit offset or add_got_offset_hilo emits
4056    a sequence to add a 32-bit offset using a scratch register.  */
4057
4058 static void
4059 load_got_offset (int dest, expressionS *local)
4060 {
4061   expressionS global;
4062
4063   global = *local;
4064   global.X_add_number = 0;
4065
4066   relax_start (local->X_add_symbol);
4067   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4068                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4069   relax_switch ();
4070   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4071                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4072   relax_end ();
4073 }
4074
4075 static void
4076 add_got_offset (int dest, expressionS *local)
4077 {
4078   expressionS global;
4079
4080   global.X_op = O_constant;
4081   global.X_op_symbol = NULL;
4082   global.X_add_symbol = NULL;
4083   global.X_add_number = local->X_add_number;
4084
4085   relax_start (local->X_add_symbol);
4086   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4087                dest, dest, BFD_RELOC_LO16);
4088   relax_switch ();
4089   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4090   relax_end ();
4091 }
4092
4093 static void
4094 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4095 {
4096   expressionS global;
4097   int hold_mips_optimize;
4098
4099   global.X_op = O_constant;
4100   global.X_op_symbol = NULL;
4101   global.X_add_symbol = NULL;
4102   global.X_add_number = local->X_add_number;
4103
4104   relax_start (local->X_add_symbol);
4105   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4106   relax_switch ();
4107   /* Set mips_optimize around the lui instruction to avoid
4108      inserting an unnecessary nop after the lw.  */
4109   hold_mips_optimize = mips_optimize;
4110   mips_optimize = 2;
4111   macro_build_lui (&global, tmp);
4112   mips_optimize = hold_mips_optimize;
4113   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4114   relax_end ();
4115
4116   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4117 }
4118
4119 /*
4120  *                      Build macros
4121  *   This routine implements the seemingly endless macro or synthesized
4122  * instructions and addressing modes in the mips assembly language. Many
4123  * of these macros are simple and are similar to each other. These could
4124  * probably be handled by some kind of table or grammar approach instead of
4125  * this verbose method. Others are not simple macros but are more like
4126  * optimizing code generation.
4127  *   One interesting optimization is when several store macros appear
4128  * consecutively that would load AT with the upper half of the same address.
4129  * The ensuing load upper instructions are ommited. This implies some kind
4130  * of global optimization. We currently only optimize within a single macro.
4131  *   For many of the load and store macros if the address is specified as a
4132  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4133  * first load register 'at' with zero and use it as the base register. The
4134  * mips assembler simply uses register $zero. Just one tiny optimization
4135  * we're missing.
4136  */
4137 static void
4138 macro (struct mips_cl_insn *ip)
4139 {
4140   register int treg, sreg, dreg, breg;
4141   int tempreg;
4142   int mask;
4143   int used_at = 0;
4144   expressionS expr1;
4145   const char *s;
4146   const char *s2;
4147   const char *fmt;
4148   int likely = 0;
4149   int dbl = 0;
4150   int coproc = 0;
4151   int lr = 0;
4152   int imm = 0;
4153   int call = 0;
4154   int off;
4155   offsetT maxnum;
4156   bfd_reloc_code_real_type r;
4157   int hold_mips_optimize;
4158
4159   assert (! mips_opts.mips16);
4160
4161   treg = (ip->insn_opcode >> 16) & 0x1f;
4162   dreg = (ip->insn_opcode >> 11) & 0x1f;
4163   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4164   mask = ip->insn_mo->mask;
4165
4166   expr1.X_op = O_constant;
4167   expr1.X_op_symbol = NULL;
4168   expr1.X_add_symbol = NULL;
4169   expr1.X_add_number = 1;
4170
4171   switch (mask)
4172     {
4173     case M_DABS:
4174       dbl = 1;
4175     case M_ABS:
4176       /* bgez $a0,.+12
4177          move v0,$a0
4178          sub v0,$zero,$a0
4179          */
4180
4181       mips_emit_delays (TRUE);
4182       ++mips_opts.noreorder;
4183       mips_any_noreorder = 1;
4184
4185       expr1.X_add_number = 8;
4186       macro_build (&expr1, "bgez", "s,p", sreg);
4187       if (dreg == sreg)
4188         macro_build (NULL, "nop", "", 0);
4189       else
4190         move_register (dreg, sreg);
4191       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4192
4193       --mips_opts.noreorder;
4194       return;
4195
4196     case M_ADD_I:
4197       s = "addi";
4198       s2 = "add";
4199       goto do_addi;
4200     case M_ADDU_I:
4201       s = "addiu";
4202       s2 = "addu";
4203       goto do_addi;
4204     case M_DADD_I:
4205       dbl = 1;
4206       s = "daddi";
4207       s2 = "dadd";
4208       goto do_addi;
4209     case M_DADDU_I:
4210       dbl = 1;
4211       s = "daddiu";
4212       s2 = "daddu";
4213     do_addi:
4214       if (imm_expr.X_op == O_constant
4215           && imm_expr.X_add_number >= -0x8000
4216           && imm_expr.X_add_number < 0x8000)
4217         {
4218           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4219           return;
4220         }
4221       load_register (AT, &imm_expr, dbl);
4222       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4223       break;
4224
4225     case M_AND_I:
4226       s = "andi";
4227       s2 = "and";
4228       goto do_bit;
4229     case M_OR_I:
4230       s = "ori";
4231       s2 = "or";
4232       goto do_bit;
4233     case M_NOR_I:
4234       s = "";
4235       s2 = "nor";
4236       goto do_bit;
4237     case M_XOR_I:
4238       s = "xori";
4239       s2 = "xor";
4240     do_bit:
4241       if (imm_expr.X_op == O_constant
4242           && imm_expr.X_add_number >= 0
4243           && imm_expr.X_add_number < 0x10000)
4244         {
4245           if (mask != M_NOR_I)
4246             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4247           else
4248             {
4249               macro_build (&imm_expr, "ori", "t,r,i",
4250                            treg, sreg, BFD_RELOC_LO16);
4251               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4252             }
4253           return;
4254         }
4255
4256       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4257       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4258       break;
4259
4260     case M_BEQ_I:
4261       s = "beq";
4262       goto beq_i;
4263     case M_BEQL_I:
4264       s = "beql";
4265       likely = 1;
4266       goto beq_i;
4267     case M_BNE_I:
4268       s = "bne";
4269       goto beq_i;
4270     case M_BNEL_I:
4271       s = "bnel";
4272       likely = 1;
4273     beq_i:
4274       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4275         {
4276           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4277           return;
4278         }
4279       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4280       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4281       break;
4282
4283     case M_BGEL:
4284       likely = 1;
4285     case M_BGE:
4286       if (treg == 0)
4287         {
4288           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4289           return;
4290         }
4291       if (sreg == 0)
4292         {
4293           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4294           return;
4295         }
4296       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4297       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4298       break;
4299
4300     case M_BGTL_I:
4301       likely = 1;
4302     case M_BGT_I:
4303       /* check for > max integer */
4304       maxnum = 0x7fffffff;
4305       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4306         {
4307           maxnum <<= 16;
4308           maxnum |= 0xffff;
4309           maxnum <<= 16;
4310           maxnum |= 0xffff;
4311         }
4312       if (imm_expr.X_op == O_constant
4313           && imm_expr.X_add_number >= maxnum
4314           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4315         {
4316         do_false:
4317           /* result is always false */
4318           if (! likely)
4319             macro_build (NULL, "nop", "", 0);
4320           else
4321             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4322           return;
4323         }
4324       if (imm_expr.X_op != O_constant)
4325         as_bad (_("Unsupported large constant"));
4326       ++imm_expr.X_add_number;
4327       /* FALLTHROUGH */
4328     case M_BGE_I:
4329     case M_BGEL_I:
4330       if (mask == M_BGEL_I)
4331         likely = 1;
4332       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4333         {
4334           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4335           return;
4336         }
4337       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4338         {
4339           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4340           return;
4341         }
4342       maxnum = 0x7fffffff;
4343       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4344         {
4345           maxnum <<= 16;
4346           maxnum |= 0xffff;
4347           maxnum <<= 16;
4348           maxnum |= 0xffff;
4349         }
4350       maxnum = - maxnum - 1;
4351       if (imm_expr.X_op == O_constant
4352           && imm_expr.X_add_number <= maxnum
4353           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4354         {
4355         do_true:
4356           /* result is always true */
4357           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4358           macro_build (&offset_expr, "b", "p");
4359           return;
4360         }
4361       set_at (sreg, 0);
4362       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4363       break;
4364
4365     case M_BGEUL:
4366       likely = 1;
4367     case M_BGEU:
4368       if (treg == 0)
4369         goto do_true;
4370       if (sreg == 0)
4371         {
4372           macro_build (&offset_expr, likely ? "beql" : "beq",
4373                        "s,t,p", 0, treg);
4374           return;
4375         }
4376       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4377       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4378       break;
4379
4380     case M_BGTUL_I:
4381       likely = 1;
4382     case M_BGTU_I:
4383       if (sreg == 0
4384           || (HAVE_32BIT_GPRS
4385               && imm_expr.X_op == O_constant
4386               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4387         goto do_false;
4388       if (imm_expr.X_op != O_constant)
4389         as_bad (_("Unsupported large constant"));
4390       ++imm_expr.X_add_number;
4391       /* FALLTHROUGH */
4392     case M_BGEU_I:
4393     case M_BGEUL_I:
4394       if (mask == M_BGEUL_I)
4395         likely = 1;
4396       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4397         goto do_true;
4398       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4399         {
4400           macro_build (&offset_expr, likely ? "bnel" : "bne",
4401                        "s,t,p", sreg, 0);
4402           return;
4403         }
4404       set_at (sreg, 1);
4405       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4406       break;
4407
4408     case M_BGTL:
4409       likely = 1;
4410     case M_BGT:
4411       if (treg == 0)
4412         {
4413           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4414           return;
4415         }
4416       if (sreg == 0)
4417         {
4418           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4419           return;
4420         }
4421       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4422       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4423       break;
4424
4425     case M_BGTUL:
4426       likely = 1;
4427     case M_BGTU:
4428       if (treg == 0)
4429         {
4430           macro_build (&offset_expr, likely ? "bnel" : "bne",
4431                        "s,t,p", sreg, 0);
4432           return;
4433         }
4434       if (sreg == 0)
4435         goto do_false;
4436       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4437       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4438       break;
4439
4440     case M_BLEL:
4441       likely = 1;
4442     case M_BLE:
4443       if (treg == 0)
4444         {
4445           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4446           return;
4447         }
4448       if (sreg == 0)
4449         {
4450           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4451           return;
4452         }
4453       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4454       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4455       break;
4456
4457     case M_BLEL_I:
4458       likely = 1;
4459     case M_BLE_I:
4460       maxnum = 0x7fffffff;
4461       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4462         {
4463           maxnum <<= 16;
4464           maxnum |= 0xffff;
4465           maxnum <<= 16;
4466           maxnum |= 0xffff;
4467         }
4468       if (imm_expr.X_op == O_constant
4469           && imm_expr.X_add_number >= maxnum
4470           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4471         goto do_true;
4472       if (imm_expr.X_op != O_constant)
4473         as_bad (_("Unsupported large constant"));
4474       ++imm_expr.X_add_number;
4475       /* FALLTHROUGH */
4476     case M_BLT_I:
4477     case M_BLTL_I:
4478       if (mask == M_BLTL_I)
4479         likely = 1;
4480       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4481         {
4482           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4483           return;
4484         }
4485       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4486         {
4487           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4488           return;
4489         }
4490       set_at (sreg, 0);
4491       macro_build (&offset_expr, 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 (&offset_expr, likely ? "beql" : "beq",
4500                        "s,t,p", sreg, 0);
4501           return;
4502         }
4503       if (sreg == 0)
4504         goto do_true;
4505       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4506       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4507       break;
4508
4509     case M_BLEUL_I:
4510       likely = 1;
4511     case M_BLEU_I:
4512       if (sreg == 0
4513           || (HAVE_32BIT_GPRS
4514               && imm_expr.X_op == O_constant
4515               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4516         goto do_true;
4517       if (imm_expr.X_op != O_constant)
4518         as_bad (_("Unsupported large constant"));
4519       ++imm_expr.X_add_number;
4520       /* FALLTHROUGH */
4521     case M_BLTU_I:
4522     case M_BLTUL_I:
4523       if (mask == M_BLTUL_I)
4524         likely = 1;
4525       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4526         goto do_false;
4527       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4528         {
4529           macro_build (&offset_expr, likely ? "beql" : "beq",
4530                        "s,t,p", sreg, 0);
4531           return;
4532         }
4533       set_at (sreg, 1);
4534       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4535       break;
4536
4537     case M_BLTL:
4538       likely = 1;
4539     case M_BLT:
4540       if (treg == 0)
4541         {
4542           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4543           return;
4544         }
4545       if (sreg == 0)
4546         {
4547           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4548           return;
4549         }
4550       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4551       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4552       break;
4553
4554     case M_BLTUL:
4555       likely = 1;
4556     case M_BLTU:
4557       if (treg == 0)
4558         goto do_false;
4559       if (sreg == 0)
4560         {
4561           macro_build (&offset_expr, likely ? "bnel" : "bne",
4562                        "s,t,p", 0, treg);
4563           return;
4564         }
4565       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4566       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4567       break;
4568
4569     case M_DEXT:
4570       {
4571         unsigned long pos;
4572         unsigned long size;
4573
4574         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4575           {
4576             as_bad (_("Unsupported large constant"));
4577             pos = size = 1;
4578           }
4579         else
4580           {
4581             pos = (unsigned long) imm_expr.X_add_number;
4582             size = (unsigned long) imm2_expr.X_add_number;
4583           }
4584
4585         if (pos > 63)
4586           {
4587             as_bad (_("Improper position (%lu)"), pos);
4588             pos = 1;
4589           }
4590         if (size == 0 || size > 64
4591             || (pos + size - 1) > 63)
4592           {
4593             as_bad (_("Improper extract size (%lu, position %lu)"),
4594                     size, pos);
4595             size = 1;
4596           }
4597
4598         if (size <= 32 && pos < 32)
4599           {
4600             s = "dext";
4601             fmt = "t,r,+A,+C";
4602           }
4603         else if (size <= 32)
4604           {
4605             s = "dextu";
4606             fmt = "t,r,+E,+H";
4607           }
4608         else
4609           {
4610             s = "dextm";
4611             fmt = "t,r,+A,+G";
4612           }
4613         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
4614       }
4615       return;
4616
4617     case M_DINS:
4618       {
4619         unsigned long pos;
4620         unsigned long size;
4621
4622         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4623           {
4624             as_bad (_("Unsupported large constant"));
4625             pos = size = 1;
4626           }
4627         else
4628           {
4629             pos = (unsigned long) imm_expr.X_add_number;
4630             size = (unsigned long) imm2_expr.X_add_number;
4631           }
4632
4633         if (pos > 63)
4634           {
4635             as_bad (_("Improper position (%lu)"), pos);
4636             pos = 1;
4637           }
4638         if (size == 0 || size > 64
4639             || (pos + size - 1) > 63)
4640           {
4641             as_bad (_("Improper insert size (%lu, position %lu)"),
4642                     size, pos);
4643             size = 1;
4644           }
4645
4646         if (pos < 32 && (pos + size - 1) < 32)
4647           {
4648             s = "dins";
4649             fmt = "t,r,+A,+B";
4650           }
4651         else if (pos >= 32)
4652           {
4653             s = "dinsu";
4654             fmt = "t,r,+E,+F";
4655           }
4656         else
4657           {
4658             s = "dinsm";
4659             fmt = "t,r,+A,+F";
4660           }
4661         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
4662                      pos + size - 1);
4663       }
4664       return;
4665
4666     case M_DDIV_3:
4667       dbl = 1;
4668     case M_DIV_3:
4669       s = "mflo";
4670       goto do_div3;
4671     case M_DREM_3:
4672       dbl = 1;
4673     case M_REM_3:
4674       s = "mfhi";
4675     do_div3:
4676       if (treg == 0)
4677         {
4678           as_warn (_("Divide by zero."));
4679           if (mips_trap)
4680             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4681           else
4682             macro_build (NULL, "break", "c", 7);
4683           return;
4684         }
4685
4686       mips_emit_delays (TRUE);
4687       ++mips_opts.noreorder;
4688       mips_any_noreorder = 1;
4689       if (mips_trap)
4690         {
4691           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4692           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4693         }
4694       else
4695         {
4696           expr1.X_add_number = 8;
4697           macro_build (&expr1, "bne", "s,t,p", treg, 0);
4698           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
4699           macro_build (NULL, "break", "c", 7);
4700         }
4701       expr1.X_add_number = -1;
4702       load_register (AT, &expr1, dbl);
4703       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
4704       macro_build (&expr1, "bne", "s,t,p", treg, AT);
4705       if (dbl)
4706         {
4707           expr1.X_add_number = 1;
4708           load_register (AT, &expr1, dbl);
4709           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
4710         }
4711       else
4712         {
4713           expr1.X_add_number = 0x80000000;
4714           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
4715         }
4716       if (mips_trap)
4717         {
4718           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
4719           /* We want to close the noreorder block as soon as possible, so
4720              that later insns are available for delay slot filling.  */
4721           --mips_opts.noreorder;
4722         }
4723       else
4724         {
4725           expr1.X_add_number = 8;
4726           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
4727           macro_build (NULL, "nop", "", 0);
4728
4729           /* We want to close the noreorder block as soon as possible, so
4730              that later insns are available for delay slot filling.  */
4731           --mips_opts.noreorder;
4732
4733           macro_build (NULL, "break", "c", 6);
4734         }
4735       macro_build (NULL, s, "d", dreg);
4736       break;
4737
4738     case M_DIV_3I:
4739       s = "div";
4740       s2 = "mflo";
4741       goto do_divi;
4742     case M_DIVU_3I:
4743       s = "divu";
4744       s2 = "mflo";
4745       goto do_divi;
4746     case M_REM_3I:
4747       s = "div";
4748       s2 = "mfhi";
4749       goto do_divi;
4750     case M_REMU_3I:
4751       s = "divu";
4752       s2 = "mfhi";
4753       goto do_divi;
4754     case M_DDIV_3I:
4755       dbl = 1;
4756       s = "ddiv";
4757       s2 = "mflo";
4758       goto do_divi;
4759     case M_DDIVU_3I:
4760       dbl = 1;
4761       s = "ddivu";
4762       s2 = "mflo";
4763       goto do_divi;
4764     case M_DREM_3I:
4765       dbl = 1;
4766       s = "ddiv";
4767       s2 = "mfhi";
4768       goto do_divi;
4769     case M_DREMU_3I:
4770       dbl = 1;
4771       s = "ddivu";
4772       s2 = "mfhi";
4773     do_divi:
4774       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4775         {
4776           as_warn (_("Divide by zero."));
4777           if (mips_trap)
4778             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
4779           else
4780             macro_build (NULL, "break", "c", 7);
4781           return;
4782         }
4783       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4784         {
4785           if (strcmp (s2, "mflo") == 0)
4786             move_register (dreg, sreg);
4787           else
4788             move_register (dreg, 0);
4789           return;
4790         }
4791       if (imm_expr.X_op == O_constant
4792           && imm_expr.X_add_number == -1
4793           && s[strlen (s) - 1] != 'u')
4794         {
4795           if (strcmp (s2, "mflo") == 0)
4796             {
4797               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
4798             }
4799           else
4800             move_register (dreg, 0);
4801           return;
4802         }
4803
4804       load_register (AT, &imm_expr, dbl);
4805       macro_build (NULL, s, "z,s,t", sreg, AT);
4806       macro_build (NULL, s2, "d", dreg);
4807       break;
4808
4809     case M_DIVU_3:
4810       s = "divu";
4811       s2 = "mflo";
4812       goto do_divu3;
4813     case M_REMU_3:
4814       s = "divu";
4815       s2 = "mfhi";
4816       goto do_divu3;
4817     case M_DDIVU_3:
4818       s = "ddivu";
4819       s2 = "mflo";
4820       goto do_divu3;
4821     case M_DREMU_3:
4822       s = "ddivu";
4823       s2 = "mfhi";
4824     do_divu3:
4825       mips_emit_delays (TRUE);
4826       ++mips_opts.noreorder;
4827       mips_any_noreorder = 1;
4828       if (mips_trap)
4829         {
4830           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
4831           macro_build (NULL, s, "z,s,t", sreg, treg);
4832           /* We want to close the noreorder block as soon as possible, so
4833              that later insns are available for delay slot filling.  */
4834           --mips_opts.noreorder;
4835         }
4836       else
4837         {
4838           expr1.X_add_number = 8;
4839           macro_build (&expr1, "bne", "s,t,p", treg, 0);
4840           macro_build (NULL, s, "z,s,t", sreg, treg);
4841
4842           /* We want to close the noreorder block as soon as possible, so
4843              that later insns are available for delay slot filling.  */
4844           --mips_opts.noreorder;
4845           macro_build (NULL, "break", "c", 7);
4846         }
4847       macro_build (NULL, s2, "d", dreg);
4848       return;
4849
4850     case M_DLCA_AB:
4851       dbl = 1;
4852     case M_LCA_AB:
4853       call = 1;
4854       goto do_la;
4855     case M_DLA_AB:
4856       dbl = 1;
4857     case M_LA_AB:
4858     do_la:
4859       /* Load the address of a symbol into a register.  If breg is not
4860          zero, we then add a base register to it.  */
4861
4862       if (dbl && HAVE_32BIT_GPRS)
4863         as_warn (_("dla used to load 32-bit register"));
4864
4865       if (! dbl && HAVE_64BIT_OBJECTS)
4866         as_warn (_("la used to load 64-bit address"));
4867
4868       if (offset_expr.X_op == O_constant
4869           && offset_expr.X_add_number >= -0x8000
4870           && offset_expr.X_add_number < 0x8000)
4871         {
4872           macro_build (&offset_expr,
4873                        (dbl || HAVE_64BIT_ADDRESSES) ? "daddiu" : "addiu",
4874                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
4875           return;
4876         }
4877
4878       if (treg == breg)
4879         {
4880           tempreg = AT;
4881           used_at = 1;
4882         }
4883       else
4884         {
4885           tempreg = treg;
4886           used_at = 0;
4887         }
4888
4889       if (offset_expr.X_op != O_symbol
4890           && offset_expr.X_op != O_constant)
4891         {
4892           as_bad (_("expression too complex"));
4893           offset_expr.X_op = O_constant;
4894         }
4895
4896       if (offset_expr.X_op == O_constant)
4897         load_register (tempreg, &offset_expr,
4898                        (mips_pic == NO_PIC
4899                         ? (dbl || HAVE_64BIT_ADDRESSES)
4900                         : HAVE_64BIT_ADDRESSES));
4901       else if (mips_pic == NO_PIC)
4902         {
4903           /* If this is a reference to a GP relative symbol, we want
4904                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
4905              Otherwise we want
4906                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
4907                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4908              If we have a constant, we need two instructions anyhow,
4909              so we may as well always use the latter form.
4910
4911             With 64bit address space and a usable $at we want
4912               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4913               lui       $at,<sym>               (BFD_RELOC_HI16_S)
4914               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4915               daddiu    $at,<sym>               (BFD_RELOC_LO16)
4916               dsll32    $tempreg,0
4917               daddu     $tempreg,$tempreg,$at
4918
4919             If $at is already in use, we use a path which is suboptimal
4920             on superscalar processors.
4921               lui       $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
4922               daddiu    $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
4923               dsll      $tempreg,16
4924               daddiu    $tempreg,<sym>          (BFD_RELOC_HI16_S)
4925               dsll      $tempreg,16
4926               daddiu    $tempreg,<sym>          (BFD_RELOC_LO16)
4927           */
4928           if (HAVE_64BIT_ADDRESSES)
4929             {
4930               /* ??? We don't provide a GP-relative alternative for
4931                  these macros.  It used not to be possible with the
4932                  original relaxation code, but it could be done now.  */
4933
4934               if (used_at == 0 && ! mips_opts.noat)
4935                 {
4936                   macro_build (&offset_expr, "lui", "t,u",
4937                                tempreg, BFD_RELOC_MIPS_HIGHEST);
4938                   macro_build (&offset_expr, "lui", "t,u",
4939                                AT, BFD_RELOC_HI16_S);
4940                   macro_build (&offset_expr, "daddiu", "t,r,j",
4941                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
4942                   macro_build (&offset_expr, "daddiu", "t,r,j",
4943                                AT, AT, BFD_RELOC_LO16);
4944                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
4945                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
4946                   used_at = 1;
4947                 }
4948               else
4949                 {
4950                   macro_build (&offset_expr, "lui", "t,u",
4951                                tempreg, BFD_RELOC_MIPS_HIGHEST);
4952                   macro_build (&offset_expr, "daddiu", "t,r,j",
4953                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
4954                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
4955                   macro_build (&offset_expr, "daddiu", "t,r,j",
4956                                tempreg, tempreg, BFD_RELOC_HI16_S);
4957                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
4958                   macro_build (&offset_expr, "daddiu", "t,r,j",
4959                                tempreg, tempreg, BFD_RELOC_LO16);
4960                 }
4961             }
4962           else
4963             {
4964               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
4965                   && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
4966                 {
4967                   relax_start (offset_expr.X_add_symbol);
4968                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
4969                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
4970                   relax_switch ();
4971                 }
4972               macro_build_lui (&offset_expr, tempreg);
4973               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
4974                            tempreg, tempreg, BFD_RELOC_LO16);
4975               if (mips_relax.sequence)
4976                 relax_end ();
4977             }
4978         }
4979       else if (mips_pic == SVR4_PIC && ! mips_big_got && ! HAVE_NEWABI)
4980         {
4981           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
4982
4983           /* If this is a reference to an external symbol, and there
4984              is no constant, we want
4985                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4986              or for lca or if tempreg is PIC_CALL_REG
4987                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
4988              For a local symbol, we want
4989                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4990                nop
4991                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
4992
4993              If we have a small constant, and this is a reference to
4994              an external symbol, we want
4995                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
4996                nop
4997                addiu    $tempreg,$tempreg,<constant>
4998              For a local symbol, we want the same instruction
4999              sequence, but we output a BFD_RELOC_LO16 reloc on the
5000              addiu instruction.
5001
5002              If we have a large constant, and this is a reference to
5003              an external symbol, we want
5004                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5005                lui      $at,<hiconstant>
5006                addiu    $at,$at,<loconstant>
5007                addu     $tempreg,$tempreg,$at
5008              For a local symbol, we want the same instruction
5009              sequence, but we output a BFD_RELOC_LO16 reloc on the
5010              addiu instruction.
5011            */
5012
5013           if (offset_expr.X_add_number == 0)
5014             {
5015               if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5016                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5017
5018               relax_start (offset_expr.X_add_symbol);
5019               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5020                            lw_reloc_type, mips_gp_register);
5021               if (breg != 0)
5022                 {
5023                   /* We're going to put in an addu instruction using
5024                      tempreg, so we may as well insert the nop right
5025                      now.  */
5026                   load_delay_nop ();
5027                 }
5028               relax_switch ();
5029               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5030                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5031               load_delay_nop ();
5032               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5033                            tempreg, tempreg, BFD_RELOC_LO16);
5034               relax_end ();
5035               /* FIXME: If breg == 0, and the next instruction uses
5036                  $tempreg, then if this variant case is used an extra
5037                  nop will be generated.  */
5038             }
5039           else if (offset_expr.X_add_number >= -0x8000
5040                    && offset_expr.X_add_number < 0x8000)
5041             {
5042               load_got_offset (tempreg, &offset_expr);
5043               load_delay_nop ();
5044               add_got_offset (tempreg, &offset_expr);
5045             }
5046           else
5047             {
5048               expr1.X_add_number = offset_expr.X_add_number;
5049               offset_expr.X_add_number =
5050                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5051               load_got_offset (tempreg, &offset_expr);
5052               offset_expr.X_add_number = expr1.X_add_number;
5053               /* If we are going to add in a base register, and the
5054                  target register and the base register are the same,
5055                  then we are using AT as a temporary register.  Since
5056                  we want to load the constant into AT, we add our
5057                  current AT (from the global offset table) and the
5058                  register into the register now, and pretend we were
5059                  not using a base register.  */
5060               if (breg == treg)
5061                 {
5062                   load_delay_nop ();
5063                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5064                                treg, AT, breg);
5065                   breg = 0;
5066                   tempreg = treg;
5067                 }
5068               add_got_offset_hilo (tempreg, &offset_expr, AT);
5069               used_at = 1;
5070             }
5071         }
5072       else if (mips_pic == SVR4_PIC && ! mips_big_got && HAVE_NEWABI)
5073         {
5074           int add_breg_early = 0;
5075
5076           /* If this is a reference to an external, and there is no
5077              constant, or local symbol (*), with or without a
5078              constant, we want
5079                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5080              or for lca or if tempreg is PIC_CALL_REG
5081                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5082
5083              If we have a small constant, and this is a reference to
5084              an external symbol, we want
5085                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5086                addiu    $tempreg,$tempreg,<constant>
5087
5088              If we have a large constant, and this is a reference to
5089              an external symbol, we want
5090                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5091                lui      $at,<hiconstant>
5092                addiu    $at,$at,<loconstant>
5093                addu     $tempreg,$tempreg,$at
5094
5095              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5096              local symbols, even though it introduces an additional
5097              instruction.  */
5098
5099           if (offset_expr.X_add_number)
5100             {
5101               expr1.X_add_number = offset_expr.X_add_number;
5102               offset_expr.X_add_number = 0;
5103
5104               relax_start (offset_expr.X_add_symbol);
5105               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5106                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5107
5108               if (expr1.X_add_number >= -0x8000
5109                   && expr1.X_add_number < 0x8000)
5110                 {
5111                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5112                                tempreg, tempreg, BFD_RELOC_LO16);
5113                 }
5114               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5115                 {
5116                   int dreg;
5117
5118                   /* If we are going to add in a base register, and the
5119                      target register and the base register are the same,
5120                      then we are using AT as a temporary register.  Since
5121                      we want to load the constant into AT, we add our
5122                      current AT (from the global offset table) and the
5123                      register into the register now, and pretend we were
5124                      not using a base register.  */
5125                   if (breg != treg)
5126                     dreg = tempreg;
5127                   else
5128                     {
5129                       assert (tempreg == AT);
5130                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5131                                    treg, AT, breg);
5132                       dreg = treg;
5133                       add_breg_early = 1;
5134                     }
5135
5136                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5137                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5138                                dreg, dreg, AT);
5139
5140                   used_at = 1;
5141                 }
5142               else
5143                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5144
5145               relax_switch ();
5146               offset_expr.X_add_number = expr1.X_add_number;
5147
5148               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5149                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5150               if (add_breg_early)
5151                 {
5152                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5153                                treg, tempreg, breg);
5154                   breg = 0;
5155                   tempreg = treg;
5156                 }
5157               relax_end ();
5158             }
5159           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5160             {
5161               relax_start (offset_expr.X_add_symbol);
5162               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5163                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5164               relax_switch ();
5165               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5166                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5167               relax_end ();
5168             }
5169           else
5170             {
5171               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5172                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5173             }
5174         }
5175       else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
5176         {
5177           int gpdelay;
5178           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5179           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5180           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5181
5182           /* This is the large GOT case.  If this is a reference to an
5183              external symbol, and there is no constant, we want
5184                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5185                addu     $tempreg,$tempreg,$gp
5186                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5187              or for lca or if tempreg is PIC_CALL_REG
5188                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5189                addu     $tempreg,$tempreg,$gp
5190                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5191              For a local symbol, we want
5192                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5193                nop
5194                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5195
5196              If we have a small constant, and this is a reference to
5197              an external symbol, we want
5198                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5199                addu     $tempreg,$tempreg,$gp
5200                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5201                nop
5202                addiu    $tempreg,$tempreg,<constant>
5203              For a local symbol, we want
5204                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5205                nop
5206                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5207
5208              If we have a large constant, and this is a reference to
5209              an external symbol, we want
5210                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5211                addu     $tempreg,$tempreg,$gp
5212                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5213                lui      $at,<hiconstant>
5214                addiu    $at,$at,<loconstant>
5215                addu     $tempreg,$tempreg,$at
5216              For a local symbol, we want
5217                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5218                lui      $at,<hiconstant>
5219                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5220                addu     $tempreg,$tempreg,$at
5221           */
5222
5223           expr1.X_add_number = offset_expr.X_add_number;
5224           offset_expr.X_add_number = 0;
5225           relax_start (offset_expr.X_add_symbol);
5226           gpdelay = reg_needs_delay (mips_gp_register);
5227           if (expr1.X_add_number == 0 && breg == 0
5228               && (call || tempreg == PIC_CALL_REG))
5229             {
5230               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5231               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5232             }
5233           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5234           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5235                        tempreg, tempreg, mips_gp_register);
5236           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5237                        tempreg, lw_reloc_type, tempreg);
5238           if (expr1.X_add_number == 0)
5239             {
5240               if (breg != 0)
5241                 {
5242                   /* We're going to put in an addu instruction using
5243                      tempreg, so we may as well insert the nop right
5244                      now.  */
5245                   load_delay_nop ();
5246                 }
5247             }
5248           else if (expr1.X_add_number >= -0x8000
5249                    && expr1.X_add_number < 0x8000)
5250             {
5251               load_delay_nop ();
5252               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5253                            tempreg, tempreg, BFD_RELOC_LO16);
5254             }
5255           else
5256             {
5257               int dreg;
5258
5259               /* If we are going to add in a base register, and the
5260                  target register and the base register are the same,
5261                  then we are using AT as a temporary register.  Since
5262                  we want to load the constant into AT, we add our
5263                  current AT (from the global offset table) and the
5264                  register into the register now, and pretend we were
5265                  not using a base register.  */
5266               if (breg != treg)
5267                 dreg = tempreg;
5268               else
5269                 {
5270                   assert (tempreg == AT);
5271                   load_delay_nop ();
5272                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5273                                treg, AT, breg);
5274                   dreg = treg;
5275                 }
5276
5277               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5278               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5279
5280               used_at = 1;
5281             }
5282           offset_expr.X_add_number =
5283             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5284           relax_switch ();
5285
5286           if (gpdelay)
5287             {
5288               /* This is needed because this instruction uses $gp, but
5289                  the first instruction on the main stream does not.  */
5290               macro_build (NULL, "nop", "");
5291             }
5292
5293           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5294                        local_reloc_type, mips_gp_register);
5295           if (expr1.X_add_number >= -0x8000
5296               && expr1.X_add_number < 0x8000)
5297             {
5298               load_delay_nop ();
5299               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5300                            tempreg, tempreg, BFD_RELOC_LO16);
5301               /* FIXME: If add_number is 0, and there was no base
5302                  register, the external symbol case ended with a load,
5303                  so if the symbol turns out to not be external, and
5304                  the next instruction uses tempreg, an unnecessary nop
5305                  will be inserted.  */
5306             }
5307           else
5308             {
5309               if (breg == treg)
5310                 {
5311                   /* We must add in the base register now, as in the
5312                      external symbol case.  */
5313                   assert (tempreg == AT);
5314                   load_delay_nop ();
5315                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5316                                treg, AT, breg);
5317                   tempreg = treg;
5318                   /* We set breg to 0 because we have arranged to add
5319                      it in in both cases.  */
5320                   breg = 0;
5321                 }
5322
5323               macro_build_lui (&expr1, AT);
5324               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5325                            AT, AT, BFD_RELOC_LO16);
5326               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5327                            tempreg, tempreg, AT);
5328             }
5329           relax_end ();
5330         }
5331       else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
5332         {
5333           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5334           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5335           int add_breg_early = 0;
5336
5337           /* This is the large GOT case.  If this is a reference to an
5338              external symbol, and there is no constant, we want
5339                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5340                add      $tempreg,$tempreg,$gp
5341                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5342              or for lca or if tempreg is PIC_CALL_REG
5343                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5344                add      $tempreg,$tempreg,$gp
5345                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5346
5347              If we have a small constant, and this is a reference to
5348              an external symbol, we want
5349                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5350                add      $tempreg,$tempreg,$gp
5351                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5352                addi     $tempreg,$tempreg,<constant>
5353
5354              If we have a large constant, and this is a reference to
5355              an external symbol, we want
5356                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5357                addu     $tempreg,$tempreg,$gp
5358                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5359                lui      $at,<hiconstant>
5360                addi     $at,$at,<loconstant>
5361                add      $tempreg,$tempreg,$at
5362
5363              If we have NewABI, and we know it's a local symbol, we want
5364                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5365                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5366              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5367
5368           relax_start (offset_expr.X_add_symbol);
5369
5370           expr1.X_add_number = offset_expr.X_add_number;
5371           offset_expr.X_add_number = 0;
5372
5373           if (expr1.X_add_number == 0 && breg == 0
5374               && (call || tempreg == PIC_CALL_REG))
5375             {
5376               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5377               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5378             }
5379           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5380           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5381                        tempreg, tempreg, mips_gp_register);
5382           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5383                        tempreg, lw_reloc_type, tempreg);
5384
5385           if (expr1.X_add_number == 0)
5386             ;
5387           else if (expr1.X_add_number >= -0x8000
5388                    && expr1.X_add_number < 0x8000)
5389             {
5390               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5391                            tempreg, tempreg, BFD_RELOC_LO16);
5392             }
5393           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5394             {
5395               int dreg;
5396
5397               /* If we are going to add in a base register, and the
5398                  target register and the base register are the same,
5399                  then we are using AT as a temporary register.  Since
5400                  we want to load the constant into AT, we add our
5401                  current AT (from the global offset table) and the
5402                  register into the register now, and pretend we were
5403                  not using a base register.  */
5404               if (breg != treg)
5405                 dreg = tempreg;
5406               else
5407                 {
5408                   assert (tempreg == AT);
5409                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5410                                treg, AT, breg);
5411                   dreg = treg;
5412                   add_breg_early = 1;
5413                 }
5414
5415               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5416               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5417
5418               used_at = 1;
5419             }
5420           else
5421             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5422
5423           relax_switch ();
5424           offset_expr.X_add_number = expr1.X_add_number;
5425           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5426                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5427           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5428                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5429           if (add_breg_early)
5430             {
5431               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5432                            treg, tempreg, breg);
5433               breg = 0;
5434               tempreg = treg;
5435             }
5436           relax_end ();
5437         }
5438       else
5439         abort ();
5440
5441       if (breg != 0)
5442         {
5443           char *s;
5444
5445           if (mips_pic == NO_PIC)
5446             s = (dbl || HAVE_64BIT_ADDRESSES) ? "daddu" : "addu";
5447           else
5448             s = ADDRESS_ADD_INSN;
5449
5450           macro_build (NULL, s, "d,v,t", treg, tempreg, breg);
5451         }
5452
5453       if (! used_at)
5454         return;
5455
5456       break;
5457
5458     case M_J_A:
5459       /* The j instruction may not be used in PIC code, since it
5460          requires an absolute address.  We convert it to a b
5461          instruction.  */
5462       if (mips_pic == NO_PIC)
5463         macro_build (&offset_expr, "j", "a");
5464       else
5465         macro_build (&offset_expr, "b", "p");
5466       return;
5467
5468       /* The jal instructions must be handled as macros because when
5469          generating PIC code they expand to multi-instruction
5470          sequences.  Normally they are simple instructions.  */
5471     case M_JAL_1:
5472       dreg = RA;
5473       /* Fall through.  */
5474     case M_JAL_2:
5475       if (mips_pic == NO_PIC)
5476         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5477       else if (mips_pic == SVR4_PIC)
5478         {
5479           if (sreg != PIC_CALL_REG)
5480             as_warn (_("MIPS PIC call to register other than $25"));
5481
5482           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5483           if (! HAVE_NEWABI)
5484             {
5485               if (mips_cprestore_offset < 0)
5486                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5487               else
5488                 {
5489                   if (! mips_frame_reg_valid)
5490                     {
5491                       as_warn (_("No .frame pseudo-op used in PIC code"));
5492                       /* Quiet this warning.  */
5493                       mips_frame_reg_valid = 1;
5494                     }
5495                   if (! mips_cprestore_valid)
5496                     {
5497                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5498                       /* Quiet this warning.  */
5499                       mips_cprestore_valid = 1;
5500                     }
5501                   expr1.X_add_number = mips_cprestore_offset;
5502                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5503                                                 mips_gp_register,
5504                                                 mips_frame_reg,
5505                                                 HAVE_64BIT_ADDRESSES);
5506                 }
5507             }
5508         }
5509       else
5510         abort ();
5511
5512       return;
5513
5514     case M_JAL_A:
5515       if (mips_pic == NO_PIC)
5516         macro_build (&offset_expr, "jal", "a");
5517       else if (mips_pic == SVR4_PIC)
5518         {
5519           /* If this is a reference to an external symbol, and we are
5520              using a small GOT, we want
5521                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5522                nop
5523                jalr     $ra,$25
5524                nop
5525                lw       $gp,cprestore($sp)
5526              The cprestore value is set using the .cprestore
5527              pseudo-op.  If we are using a big GOT, we want
5528                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5529                addu     $25,$25,$gp
5530                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5531                nop
5532                jalr     $ra,$25
5533                nop
5534                lw       $gp,cprestore($sp)
5535              If the symbol is not external, we want
5536                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5537                nop
5538                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5539                jalr     $ra,$25
5540                nop
5541                lw $gp,cprestore($sp)
5542
5543              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5544              sequences above, minus nops, unless the symbol is local,
5545              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5546              GOT_DISP.  */
5547           if (HAVE_NEWABI)
5548             {
5549               if (! mips_big_got)
5550                 {
5551                   relax_start (offset_expr.X_add_symbol);
5552                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5553                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5554                                mips_gp_register);
5555                   relax_switch ();
5556                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5557                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5558                                mips_gp_register);
5559                   relax_end ();
5560                 }
5561               else
5562                 {
5563                   relax_start (offset_expr.X_add_symbol);
5564                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5565                                BFD_RELOC_MIPS_CALL_HI16);
5566                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5567                                PIC_CALL_REG, mips_gp_register);
5568                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5569                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5570                                PIC_CALL_REG);
5571                   relax_switch ();
5572                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5573                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5574                                mips_gp_register);
5575                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5576                                PIC_CALL_REG, PIC_CALL_REG,
5577                                BFD_RELOC_MIPS_GOT_OFST);
5578                   relax_end ();
5579                 }
5580
5581               macro_build_jalr (&offset_expr);
5582             }
5583           else
5584             {
5585               relax_start (offset_expr.X_add_symbol);
5586               if (! mips_big_got)
5587                 {
5588                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5589                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5590                                mips_gp_register);
5591                   load_delay_nop ();
5592                   relax_switch ();
5593                 }
5594               else
5595                 {
5596                   int gpdelay;
5597
5598                   gpdelay = reg_needs_delay (mips_gp_register);
5599                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5600                                BFD_RELOC_MIPS_CALL_HI16);
5601                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5602                                PIC_CALL_REG, mips_gp_register);
5603                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5604                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5605                                PIC_CALL_REG);
5606                   load_delay_nop ();
5607                   relax_switch ();
5608                   if (gpdelay)
5609                     macro_build (NULL, "nop", "");
5610                 }
5611               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5612                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
5613                            mips_gp_register);
5614               load_delay_nop ();
5615               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5616                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
5617               relax_end ();
5618               macro_build_jalr (&offset_expr);
5619
5620               if (mips_cprestore_offset < 0)
5621                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5622               else
5623                 {
5624                   if (! mips_frame_reg_valid)
5625                     {
5626                       as_warn (_("No .frame pseudo-op used in PIC code"));
5627                       /* Quiet this warning.  */
5628                       mips_frame_reg_valid = 1;
5629                     }
5630                   if (! mips_cprestore_valid)
5631                     {
5632                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5633                       /* Quiet this warning.  */
5634                       mips_cprestore_valid = 1;
5635                     }
5636                   if (mips_opts.noreorder)
5637                     macro_build (NULL, "nop", "");
5638                   expr1.X_add_number = mips_cprestore_offset;
5639                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5640                                                 mips_gp_register,
5641                                                 mips_frame_reg,
5642                                                 HAVE_64BIT_ADDRESSES);
5643                 }
5644             }
5645         }
5646       else
5647         abort ();
5648
5649       return;
5650
5651     case M_LB_AB:
5652       s = "lb";
5653       goto ld;
5654     case M_LBU_AB:
5655       s = "lbu";
5656       goto ld;
5657     case M_LH_AB:
5658       s = "lh";
5659       goto ld;
5660     case M_LHU_AB:
5661       s = "lhu";
5662       goto ld;
5663     case M_LW_AB:
5664       s = "lw";
5665       goto ld;
5666     case M_LWC0_AB:
5667       s = "lwc0";
5668       /* Itbl support may require additional care here.  */
5669       coproc = 1;
5670       goto ld;
5671     case M_LWC1_AB:
5672       s = "lwc1";
5673       /* Itbl support may require additional care here.  */
5674       coproc = 1;
5675       goto ld;
5676     case M_LWC2_AB:
5677       s = "lwc2";
5678       /* Itbl support may require additional care here.  */
5679       coproc = 1;
5680       goto ld;
5681     case M_LWC3_AB:
5682       s = "lwc3";
5683       /* Itbl support may require additional care here.  */
5684       coproc = 1;
5685       goto ld;
5686     case M_LWL_AB:
5687       s = "lwl";
5688       lr = 1;
5689       goto ld;
5690     case M_LWR_AB:
5691       s = "lwr";
5692       lr = 1;
5693       goto ld;
5694     case M_LDC1_AB:
5695       if (mips_opts.arch == CPU_R4650)
5696         {
5697           as_bad (_("opcode not supported on this processor"));
5698           return;
5699         }
5700       s = "ldc1";
5701       /* Itbl support may require additional care here.  */
5702       coproc = 1;
5703       goto ld;
5704     case M_LDC2_AB:
5705       s = "ldc2";
5706       /* Itbl support may require additional care here.  */
5707       coproc = 1;
5708       goto ld;
5709     case M_LDC3_AB:
5710       s = "ldc3";
5711       /* Itbl support may require additional care here.  */
5712       coproc = 1;
5713       goto ld;
5714     case M_LDL_AB:
5715       s = "ldl";
5716       lr = 1;
5717       goto ld;
5718     case M_LDR_AB:
5719       s = "ldr";
5720       lr = 1;
5721       goto ld;
5722     case M_LL_AB:
5723       s = "ll";
5724       goto ld;
5725     case M_LLD_AB:
5726       s = "lld";
5727       goto ld;
5728     case M_LWU_AB:
5729       s = "lwu";
5730     ld:
5731       if (breg == treg || coproc || lr)
5732         {
5733           tempreg = AT;
5734           used_at = 1;
5735         }
5736       else
5737         {
5738           tempreg = treg;
5739           used_at = 0;
5740         }
5741       goto ld_st;
5742     case M_SB_AB:
5743       s = "sb";
5744       goto st;
5745     case M_SH_AB:
5746       s = "sh";
5747       goto st;
5748     case M_SW_AB:
5749       s = "sw";
5750       goto st;
5751     case M_SWC0_AB:
5752       s = "swc0";
5753       /* Itbl support may require additional care here.  */
5754       coproc = 1;
5755       goto st;
5756     case M_SWC1_AB:
5757       s = "swc1";
5758       /* Itbl support may require additional care here.  */
5759       coproc = 1;
5760       goto st;
5761     case M_SWC2_AB:
5762       s = "swc2";
5763       /* Itbl support may require additional care here.  */
5764       coproc = 1;
5765       goto st;
5766     case M_SWC3_AB:
5767       s = "swc3";
5768       /* Itbl support may require additional care here.  */
5769       coproc = 1;
5770       goto st;
5771     case M_SWL_AB:
5772       s = "swl";
5773       goto st;
5774     case M_SWR_AB:
5775       s = "swr";
5776       goto st;
5777     case M_SC_AB:
5778       s = "sc";
5779       goto st;
5780     case M_SCD_AB:
5781       s = "scd";
5782       goto st;
5783     case M_SDC1_AB:
5784       if (mips_opts.arch == CPU_R4650)
5785         {
5786           as_bad (_("opcode not supported on this processor"));
5787           return;
5788         }
5789       s = "sdc1";
5790       coproc = 1;
5791       /* Itbl support may require additional care here.  */
5792       goto st;
5793     case M_SDC2_AB:
5794       s = "sdc2";
5795       /* Itbl support may require additional care here.  */
5796       coproc = 1;
5797       goto st;
5798     case M_SDC3_AB:
5799       s = "sdc3";
5800       /* Itbl support may require additional care here.  */
5801       coproc = 1;
5802       goto st;
5803     case M_SDL_AB:
5804       s = "sdl";
5805       goto st;
5806     case M_SDR_AB:
5807       s = "sdr";
5808     st:
5809       tempreg = AT;
5810       used_at = 1;
5811     ld_st:
5812       /* Itbl support may require additional care here.  */
5813       if (mask == M_LWC1_AB
5814           || mask == M_SWC1_AB
5815           || mask == M_LDC1_AB
5816           || mask == M_SDC1_AB
5817           || mask == M_L_DAB
5818           || mask == M_S_DAB)
5819         fmt = "T,o(b)";
5820       else if (coproc)
5821         fmt = "E,o(b)";
5822       else
5823         fmt = "t,o(b)";
5824
5825       /* Sign-extending 32-bit constants makes their handling easier.
5826          The HAVE_64BIT_GPRS... part is due to the linux kernel hack
5827          described below.  */
5828       if ((! HAVE_64BIT_ADDRESSES
5829            && (! HAVE_64BIT_GPRS && offset_expr.X_op == O_constant))
5830           && (offset_expr.X_op == O_constant)
5831           && ! ((offset_expr.X_add_number & ~((bfd_vma) 0x7fffffff))
5832                 == ~((bfd_vma) 0x7fffffff)))
5833         {
5834           if (offset_expr.X_add_number & ~((bfd_vma) 0xffffffff))
5835             as_bad (_("constant too large"));
5836
5837           offset_expr.X_add_number = (((offset_expr.X_add_number & 0xffffffff)
5838                                        ^ 0x80000000) - 0x80000000);
5839         }
5840
5841       if (offset_expr.X_op != O_constant
5842           && offset_expr.X_op != O_symbol)
5843         {
5844           as_bad (_("expression too complex"));
5845           offset_expr.X_op = O_constant;
5846         }
5847
5848       /* A constant expression in PIC code can be handled just as it
5849          is in non PIC code.  */
5850       if (mips_pic == NO_PIC
5851           || offset_expr.X_op == O_constant)
5852         {
5853           /* If this is a reference to a GP relative symbol, and there
5854              is no base register, we want
5855                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
5856              Otherwise, if there is no base register, we want
5857                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5858                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5859              If we have a constant, we need two instructions anyhow,
5860              so we always use the latter form.
5861
5862              If we have a base register, and this is a reference to a
5863              GP relative symbol, we want
5864                addu     $tempreg,$breg,$gp
5865                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
5866              Otherwise we want
5867                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5868                addu     $tempreg,$tempreg,$breg
5869                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5870              With a constant we always use the latter case.
5871
5872              With 64bit address space and no base register and $at usable,
5873              we want
5874                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5875                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5876                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5877                dsll32   $tempreg,0
5878                daddu    $tempreg,$at
5879                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5880              If we have a base register, we want
5881                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5882                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5883                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5884                daddu    $at,$breg
5885                dsll32   $tempreg,0
5886                daddu    $tempreg,$at
5887                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5888
5889              Without $at we can't generate the optimal path for superscalar
5890              processors here since this would require two temporary registers.
5891                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5892                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5893                dsll     $tempreg,16
5894                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5895                dsll     $tempreg,16
5896                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5897              If we have a base register, we want
5898                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5899                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5900                dsll     $tempreg,16
5901                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5902                dsll     $tempreg,16
5903                daddu    $tempreg,$tempreg,$breg
5904                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
5905
5906              If we have 64-bit addresses, as an optimization, for
5907              addresses which are 32-bit constants (e.g. kseg0/kseg1
5908              addresses) we fall back to the 32-bit address generation
5909              mechanism since it is more efficient.  Note that due to
5910              the signed offset used by memory operations, the 32-bit
5911              range is shifted down by 32768 here.  This code should
5912              probably attempt to generate 64-bit constants more
5913              efficiently in general.
5914
5915              As an extension for architectures with 64-bit registers,
5916              we don't truncate 64-bit addresses given as literal
5917              constants down to 32 bits, to support existing practice
5918              in the mips64 Linux (the kernel), that compiles source
5919              files with -mabi=64, assembling them as o32 or n32 (with
5920              -Wa,-32 or -Wa,-n32).  This is not beautiful, but since
5921              the whole kernel is loaded into a memory region that is
5922              addressable with sign-extended 32-bit addresses, it is
5923              wasteful to compute the upper 32 bits of every
5924              non-literal address, that takes more space and time.
5925              Some day this should probably be implemented as an
5926              assembler option, such that the kernel doesn't have to
5927              use such ugly hacks, even though it will still have to
5928              end up converting the binary to ELF32 for a number of
5929              platforms whose boot loaders don't support ELF64
5930              binaries.  */
5931           if ((HAVE_64BIT_ADDRESSES
5932                && ! (offset_expr.X_op == O_constant
5933                      && IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
5934               || (HAVE_64BIT_GPRS
5935                   && offset_expr.X_op == O_constant
5936                   && ! IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000)))
5937             {
5938               /* ??? We don't provide a GP-relative alternative for
5939                  these macros.  It used not to be possible with the
5940                  original relaxation code, but it could be done now.  */
5941
5942               if (used_at == 0 && ! mips_opts.noat)
5943                 {
5944                   macro_build (&offset_expr, "lui", "t,u", tempreg,
5945                                BFD_RELOC_MIPS_HIGHEST);
5946                   macro_build (&offset_expr, "lui", "t,u", AT,
5947                                BFD_RELOC_HI16_S);
5948                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
5949                                tempreg, BFD_RELOC_MIPS_HIGHER);
5950                   if (breg != 0)
5951                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
5952                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5953                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5954                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
5955                                tempreg);
5956                   used_at = 1;
5957                 }
5958               else
5959                 {
5960                   macro_build (&offset_expr, "lui", "t,u", tempreg,
5961                                BFD_RELOC_MIPS_HIGHEST);
5962                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
5963                                tempreg, BFD_RELOC_MIPS_HIGHER);
5964                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5965                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
5966                                tempreg, BFD_RELOC_HI16_S);
5967                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5968                   if (breg != 0)
5969                     macro_build (NULL, "daddu", "d,v,t",
5970                                  tempreg, tempreg, breg);
5971                   macro_build (&offset_expr, s, fmt, treg,
5972                                BFD_RELOC_LO16, tempreg);
5973                 }
5974
5975               return;
5976             }
5977
5978           if (offset_expr.X_op == O_constant
5979               && ! IS_SEXT_32BIT_NUM (offset_expr.X_add_number + 0x8000))
5980             as_bad (_("load/store address overflow (max 32 bits)"));
5981
5982           if (breg == 0)
5983             {
5984               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5985                   && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
5986                 {
5987                   relax_start (offset_expr.X_add_symbol);
5988                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
5989                                mips_gp_register);
5990                   relax_switch ();
5991                   used_at = 0;
5992                 }
5993               macro_build_lui (&offset_expr, tempreg);
5994               macro_build (&offset_expr, s, fmt, treg,
5995                            BFD_RELOC_LO16, tempreg);
5996               if (mips_relax.sequence)
5997                 relax_end ();
5998             }
5999           else
6000             {
6001               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6002                   && ! nopic_need_relax (offset_expr.X_add_symbol, 1))
6003                 {
6004                   relax_start (offset_expr.X_add_symbol);
6005                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6006                                tempreg, breg, mips_gp_register);
6007                   macro_build (&offset_expr, s, fmt, treg,
6008                                BFD_RELOC_GPREL16, tempreg);
6009                   relax_switch ();
6010                 }
6011               macro_build_lui (&offset_expr, tempreg);
6012               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6013                            tempreg, tempreg, breg);
6014               macro_build (&offset_expr, s, fmt, treg,
6015                            BFD_RELOC_LO16, tempreg);
6016               if (mips_relax.sequence)
6017                 relax_end ();
6018             }
6019         }
6020       else if (mips_pic == SVR4_PIC && ! mips_big_got)
6021         {
6022           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6023
6024           /* If this is a reference to an external symbol, we want
6025                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6026                nop
6027                <op>     $treg,0($tempreg)
6028              Otherwise we want
6029                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6030                nop
6031                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6032                <op>     $treg,0($tempreg)
6033
6034              For NewABI, we want
6035                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6036                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6037
6038              If there is a base register, we add it to $tempreg before
6039              the <op>.  If there is a constant, we stick it in the
6040              <op> instruction.  We don't handle constants larger than
6041              16 bits, because we have no way to load the upper 16 bits
6042              (actually, we could handle them for the subset of cases
6043              in which we are not using $at).  */
6044           assert (offset_expr.X_op == O_symbol);
6045           if (HAVE_NEWABI)
6046             {
6047               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6048                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6049               if (breg != 0)
6050                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6051                              tempreg, tempreg, breg);
6052               macro_build (&offset_expr, s, fmt, treg,
6053                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6054
6055               if (! used_at)
6056                 return;
6057
6058               break;
6059             }
6060           expr1.X_add_number = offset_expr.X_add_number;
6061           offset_expr.X_add_number = 0;
6062           if (expr1.X_add_number < -0x8000
6063               || expr1.X_add_number >= 0x8000)
6064             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6065           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6066                        lw_reloc_type, mips_gp_register);
6067           load_delay_nop ();
6068           relax_start (offset_expr.X_add_symbol);
6069           relax_switch ();
6070           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6071                        tempreg, BFD_RELOC_LO16);
6072           relax_end ();
6073           if (breg != 0)
6074             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6075                          tempreg, tempreg, breg);
6076           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6077         }
6078       else if (mips_pic == SVR4_PIC && ! HAVE_NEWABI)
6079         {
6080           int gpdelay;
6081
6082           /* If this is a reference to an external symbol, we want
6083                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6084                addu     $tempreg,$tempreg,$gp
6085                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6086                <op>     $treg,0($tempreg)
6087              Otherwise we want
6088                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6089                nop
6090                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6091                <op>     $treg,0($tempreg)
6092              If there is a base register, we add it to $tempreg before
6093              the <op>.  If there is a constant, we stick it in the
6094              <op> instruction.  We don't handle constants larger than
6095              16 bits, because we have no way to load the upper 16 bits
6096              (actually, we could handle them for the subset of cases
6097              in which we are not using $at).  */
6098           assert (offset_expr.X_op == O_symbol);
6099           expr1.X_add_number = offset_expr.X_add_number;
6100           offset_expr.X_add_number = 0;
6101           if (expr1.X_add_number < -0x8000
6102               || expr1.X_add_number >= 0x8000)
6103             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6104           gpdelay = reg_needs_delay (mips_gp_register);
6105           relax_start (offset_expr.X_add_symbol);
6106           macro_build (&offset_expr, "lui", "t,u", tempreg,
6107                        BFD_RELOC_MIPS_GOT_HI16);
6108           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6109                        mips_gp_register);
6110           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6111                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6112           relax_switch ();
6113           if (gpdelay)
6114             macro_build (NULL, "nop", "");
6115           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6116                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6117           load_delay_nop ();
6118           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6119                        tempreg, BFD_RELOC_LO16);
6120           relax_end ();
6121
6122           if (breg != 0)
6123             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6124                          tempreg, tempreg, breg);
6125           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6126         }
6127       else if (mips_pic == SVR4_PIC && HAVE_NEWABI)
6128         {
6129           /* If this is a reference to an external symbol, we want
6130                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6131                add      $tempreg,$tempreg,$gp
6132                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6133                <op>     $treg,<ofst>($tempreg)
6134              Otherwise, for local symbols, we want:
6135                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6136                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6137           assert (offset_expr.X_op == O_symbol);
6138           expr1.X_add_number = offset_expr.X_add_number;
6139           offset_expr.X_add_number = 0;
6140           if (expr1.X_add_number < -0x8000
6141               || expr1.X_add_number >= 0x8000)
6142             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6143           relax_start (offset_expr.X_add_symbol);
6144           macro_build (&offset_expr, "lui", "t,u", tempreg,
6145                        BFD_RELOC_MIPS_GOT_HI16);
6146           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6147                        mips_gp_register);
6148           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6149                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6150           if (breg != 0)
6151             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6152                          tempreg, tempreg, breg);
6153           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6154
6155           relax_switch ();
6156           offset_expr.X_add_number = expr1.X_add_number;
6157           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6158                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6159           if (breg != 0)
6160             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6161                          tempreg, tempreg, breg);
6162           macro_build (&offset_expr, s, fmt, treg,
6163                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6164           relax_end ();
6165         }
6166       else
6167         abort ();
6168
6169       if (! used_at)
6170         return;
6171
6172       break;
6173
6174     case M_LI:
6175     case M_LI_S:
6176       load_register (treg, &imm_expr, 0);
6177       return;
6178
6179     case M_DLI:
6180       load_register (treg, &imm_expr, 1);
6181       return;
6182
6183     case M_LI_SS:
6184       if (imm_expr.X_op == O_constant)
6185         {
6186           load_register (AT, &imm_expr, 0);
6187           macro_build (NULL, "mtc1", "t,G", AT, treg);
6188           break;
6189         }
6190       else
6191         {
6192           assert (offset_expr.X_op == O_symbol
6193                   && strcmp (segment_name (S_GET_SEGMENT
6194                                            (offset_expr.X_add_symbol)),
6195                              ".lit4") == 0
6196                   && offset_expr.X_add_number == 0);
6197           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6198                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6199           return;
6200         }
6201
6202     case M_LI_D:
6203       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6204          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6205          order 32 bits of the value and the low order 32 bits are either
6206          zero or in OFFSET_EXPR.  */
6207       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6208         {
6209           if (HAVE_64BIT_GPRS)
6210             load_register (treg, &imm_expr, 1);
6211           else
6212             {
6213               int hreg, lreg;
6214
6215               if (target_big_endian)
6216                 {
6217                   hreg = treg;
6218                   lreg = treg + 1;
6219                 }
6220               else
6221                 {
6222                   hreg = treg + 1;
6223                   lreg = treg;
6224                 }
6225
6226               if (hreg <= 31)
6227                 load_register (hreg, &imm_expr, 0);
6228               if (lreg <= 31)
6229                 {
6230                   if (offset_expr.X_op == O_absent)
6231                     move_register (lreg, 0);
6232                   else
6233                     {
6234                       assert (offset_expr.X_op == O_constant);
6235                       load_register (lreg, &offset_expr, 0);
6236                     }
6237                 }
6238             }
6239           return;
6240         }
6241
6242       /* We know that sym is in the .rdata section.  First we get the
6243          upper 16 bits of the address.  */
6244       if (mips_pic == NO_PIC)
6245         {
6246           macro_build_lui (&offset_expr, AT);
6247         }
6248       else if (mips_pic == SVR4_PIC)
6249         {
6250           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6251                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6252         }
6253       else
6254         abort ();
6255
6256       /* Now we load the register(s).  */
6257       if (HAVE_64BIT_GPRS)
6258         macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6259       else
6260         {
6261           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6262           if (treg != RA)
6263             {
6264               /* FIXME: How in the world do we deal with the possible
6265                  overflow here?  */
6266               offset_expr.X_add_number += 4;
6267               macro_build (&offset_expr, "lw", "t,o(b)",
6268                            treg + 1, BFD_RELOC_LO16, AT);
6269             }
6270         }
6271       break;
6272
6273     case M_LI_DD:
6274       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6275          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6276          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6277          the value and the low order 32 bits are either zero or in
6278          OFFSET_EXPR.  */
6279       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6280         {
6281           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6282           if (HAVE_64BIT_FPRS)
6283             {
6284               assert (HAVE_64BIT_GPRS);
6285               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6286             }
6287           else
6288             {
6289               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6290               if (offset_expr.X_op == O_absent)
6291                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6292               else
6293                 {
6294                   assert (offset_expr.X_op == O_constant);
6295                   load_register (AT, &offset_expr, 0);
6296                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6297                 }
6298             }
6299           break;
6300         }
6301
6302       assert (offset_expr.X_op == O_symbol
6303               && offset_expr.X_add_number == 0);
6304       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6305       if (strcmp (s, ".lit8") == 0)
6306         {
6307           if (mips_opts.isa != ISA_MIPS1)
6308             {
6309               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6310                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6311               return;
6312             }
6313           breg = mips_gp_register;
6314           r = BFD_RELOC_MIPS_LITERAL;
6315           goto dob;
6316         }
6317       else
6318         {
6319           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6320           if (mips_pic == SVR4_PIC)
6321             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6322                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6323           else
6324             {
6325               /* FIXME: This won't work for a 64 bit address.  */
6326               macro_build_lui (&offset_expr, AT);
6327             }
6328
6329           if (mips_opts.isa != ISA_MIPS1)
6330             {
6331               macro_build (&offset_expr, "ldc1", "T,o(b)",
6332                            treg, BFD_RELOC_LO16, AT);
6333               break;
6334             }
6335           breg = AT;
6336           r = BFD_RELOC_LO16;
6337           goto dob;
6338         }
6339
6340     case M_L_DOB:
6341       if (mips_opts.arch == CPU_R4650)
6342         {
6343           as_bad (_("opcode not supported on this processor"));
6344           return;
6345         }
6346       /* Even on a big endian machine $fn comes before $fn+1.  We have
6347          to adjust when loading from memory.  */
6348       r = BFD_RELOC_LO16;
6349     dob:
6350       assert (mips_opts.isa == ISA_MIPS1);
6351       macro_build (&offset_expr, "lwc1", "T,o(b)",
6352                    target_big_endian ? treg + 1 : treg, r, breg);
6353       /* FIXME: A possible overflow which I don't know how to deal
6354          with.  */
6355       offset_expr.X_add_number += 4;
6356       macro_build (&offset_expr, "lwc1", "T,o(b)",
6357                    target_big_endian ? treg : treg + 1, r, breg);
6358
6359       if (breg != AT)
6360         return;
6361       break;
6362
6363     case M_L_DAB:
6364       /*
6365        * The MIPS assembler seems to check for X_add_number not
6366        * being double aligned and generating:
6367        *        lui     at,%hi(foo+1)
6368        *        addu    at,at,v1
6369        *        addiu   at,at,%lo(foo+1)
6370        *        lwc1    f2,0(at)
6371        *        lwc1    f3,4(at)
6372        * But, the resulting address is the same after relocation so why
6373        * generate the extra instruction?
6374        */
6375       if (mips_opts.arch == CPU_R4650)
6376         {
6377           as_bad (_("opcode not supported on this processor"));
6378           return;
6379         }
6380       /* Itbl support may require additional care here.  */
6381       coproc = 1;
6382       if (mips_opts.isa != ISA_MIPS1)
6383         {
6384           s = "ldc1";
6385           goto ld;
6386         }
6387
6388       s = "lwc1";
6389       fmt = "T,o(b)";
6390       goto ldd_std;
6391
6392     case M_S_DAB:
6393       if (mips_opts.arch == CPU_R4650)
6394         {
6395           as_bad (_("opcode not supported on this processor"));
6396           return;
6397         }
6398
6399       if (mips_opts.isa != ISA_MIPS1)
6400         {
6401           s = "sdc1";
6402           goto st;
6403         }
6404
6405       s = "swc1";
6406       fmt = "T,o(b)";
6407       /* Itbl support may require additional care here.  */
6408       coproc = 1;
6409       goto ldd_std;
6410
6411     case M_LD_AB:
6412       if (HAVE_64BIT_GPRS)
6413         {
6414           s = "ld";
6415           goto ld;
6416         }
6417
6418       s = "lw";
6419       fmt = "t,o(b)";
6420       goto ldd_std;
6421
6422     case M_SD_AB:
6423       if (HAVE_64BIT_GPRS)
6424         {
6425           s = "sd";
6426           goto st;
6427         }
6428
6429       s = "sw";
6430       fmt = "t,o(b)";
6431
6432     ldd_std:
6433       if (offset_expr.X_op != O_symbol
6434           && offset_expr.X_op != O_constant)
6435         {
6436           as_bad (_("expression too complex"));
6437           offset_expr.X_op = O_constant;
6438         }
6439
6440       /* Even on a big endian machine $fn comes before $fn+1.  We have
6441          to adjust when loading from memory.  We set coproc if we must
6442          load $fn+1 first.  */
6443       /* Itbl support may require additional care here.  */
6444       if (! target_big_endian)
6445         coproc = 0;
6446
6447       if (mips_pic == NO_PIC
6448           || offset_expr.X_op == O_constant)
6449         {
6450           /* If this is a reference to a GP relative symbol, we want
6451                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6452                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6453              If we have a base register, we use this
6454                addu     $at,$breg,$gp
6455                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6456                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6457              If this is not a GP relative symbol, we want
6458                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6459                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6460                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6461              If there is a base register, we add it to $at after the
6462              lui instruction.  If there is a constant, we always use
6463              the last case.  */
6464           if ((valueT) offset_expr.X_add_number > MAX_GPREL_OFFSET
6465               || nopic_need_relax (offset_expr.X_add_symbol, 1))
6466             used_at = 1;
6467           else
6468             {
6469               relax_start (offset_expr.X_add_symbol);
6470               if (breg == 0)
6471                 {
6472                   tempreg = mips_gp_register;
6473                   used_at = 0;
6474                 }
6475               else
6476                 {
6477                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6478                                AT, breg, mips_gp_register);
6479                   tempreg = AT;
6480                   used_at = 1;
6481                 }
6482
6483               /* Itbl support may require additional care here.  */
6484               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6485                            BFD_RELOC_GPREL16, tempreg);
6486               offset_expr.X_add_number += 4;
6487
6488               /* Set mips_optimize to 2 to avoid inserting an
6489                  undesired nop.  */
6490               hold_mips_optimize = mips_optimize;
6491               mips_optimize = 2;
6492               /* Itbl support may require additional care here.  */
6493               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6494                            BFD_RELOC_GPREL16, tempreg);
6495               mips_optimize = hold_mips_optimize;
6496
6497               relax_switch ();
6498
6499               /* We just generated two relocs.  When tc_gen_reloc
6500                  handles this case, it will skip the first reloc and
6501                  handle the second.  The second reloc already has an
6502                  extra addend of 4, which we added above.  We must
6503                  subtract it out, and then subtract another 4 to make
6504                  the first reloc come out right.  The second reloc
6505                  will come out right because we are going to add 4 to
6506                  offset_expr when we build its instruction below.
6507
6508                  If we have a symbol, then we don't want to include
6509                  the offset, because it will wind up being included
6510                  when we generate the reloc.  */
6511
6512               if (offset_expr.X_op == O_constant)
6513                 offset_expr.X_add_number -= 8;
6514               else
6515                 {
6516                   offset_expr.X_add_number = -4;
6517                   offset_expr.X_op = O_constant;
6518                 }
6519             }
6520           macro_build_lui (&offset_expr, AT);
6521           if (breg != 0)
6522             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6523           /* Itbl support may require additional care here.  */
6524           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6525                        BFD_RELOC_LO16, AT);
6526           /* FIXME: How do we handle overflow here?  */
6527           offset_expr.X_add_number += 4;
6528           /* Itbl support may require additional care here.  */
6529           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6530                        BFD_RELOC_LO16, AT);
6531           if (mips_relax.sequence)
6532             relax_end ();
6533         }
6534       else if (mips_pic == SVR4_PIC && ! mips_big_got)
6535         {
6536           /* If this is a reference to an external symbol, we want
6537                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6538                nop
6539                <op>     $treg,0($at)
6540                <op>     $treg+1,4($at)
6541              Otherwise we want
6542                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6543                nop
6544                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6545                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6546              If there is a base register we add it to $at before the
6547              lwc1 instructions.  If there is a constant we include it
6548              in the lwc1 instructions.  */
6549           used_at = 1;
6550           expr1.X_add_number = offset_expr.X_add_number;
6551           if (expr1.X_add_number < -0x8000
6552               || expr1.X_add_number >= 0x8000 - 4)
6553             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6554           load_got_offset (AT, &offset_expr);
6555           load_delay_nop ();
6556           if (breg != 0)
6557             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6558
6559           /* Set mips_optimize to 2 to avoid inserting an undesired
6560              nop.  */
6561           hold_mips_optimize = mips_optimize;
6562           mips_optimize = 2;
6563
6564           /* Itbl support may require additional care here.  */
6565           relax_start (offset_expr.X_add_symbol);
6566           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6567                        BFD_RELOC_LO16, AT);
6568           expr1.X_add_number += 4;
6569           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6570                        BFD_RELOC_LO16, AT);
6571           relax_switch ();
6572           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6573                        BFD_RELOC_LO16, AT);
6574           offset_expr.X_add_number += 4;
6575           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6576                        BFD_RELOC_LO16, AT);
6577           relax_end ();
6578
6579           mips_optimize = hold_mips_optimize;
6580         }
6581       else if (mips_pic == SVR4_PIC)
6582         {
6583           int gpdelay;
6584
6585           /* If this is a reference to an external symbol, we want
6586                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
6587                addu     $at,$at,$gp
6588                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
6589                nop
6590                <op>     $treg,0($at)
6591                <op>     $treg+1,4($at)
6592              Otherwise we want
6593                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6594                nop
6595                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6596                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6597              If there is a base register we add it to $at before the
6598              lwc1 instructions.  If there is a constant we include it
6599              in the lwc1 instructions.  */
6600           used_at = 1;
6601           expr1.X_add_number = offset_expr.X_add_number;
6602           offset_expr.X_add_number = 0;
6603           if (expr1.X_add_number < -0x8000
6604               || expr1.X_add_number >= 0x8000 - 4)
6605             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6606           gpdelay = reg_needs_delay (mips_gp_register);
6607           relax_start (offset_expr.X_add_symbol);
6608           macro_build (&offset_expr, "lui", "t,u",
6609                        AT, BFD_RELOC_MIPS_GOT_HI16);
6610           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6611                        AT, AT, mips_gp_register);
6612           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6613                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
6614           load_delay_nop ();
6615           if (breg != 0)
6616             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6617           /* Itbl support may require additional care here.  */
6618           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6619                        BFD_RELOC_LO16, AT);
6620           expr1.X_add_number += 4;
6621
6622           /* Set mips_optimize to 2 to avoid inserting an undesired
6623              nop.  */
6624           hold_mips_optimize = mips_optimize;
6625           mips_optimize = 2;
6626           /* Itbl support may require additional care here.  */
6627           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6628                        BFD_RELOC_LO16, AT);
6629           mips_optimize = hold_mips_optimize;
6630           expr1.X_add_number -= 4;
6631
6632           relax_switch ();
6633           offset_expr.X_add_number = expr1.X_add_number;
6634           if (gpdelay)
6635             macro_build (NULL, "nop", "");
6636           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6637                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6638           load_delay_nop ();
6639           if (breg != 0)
6640             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6641           /* Itbl support may require additional care here.  */
6642           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6643                        BFD_RELOC_LO16, AT);
6644           offset_expr.X_add_number += 4;
6645
6646           /* Set mips_optimize to 2 to avoid inserting an undesired
6647              nop.  */
6648           hold_mips_optimize = mips_optimize;
6649           mips_optimize = 2;
6650           /* Itbl support may require additional care here.  */
6651           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6652                        BFD_RELOC_LO16, AT);
6653           mips_optimize = hold_mips_optimize;
6654           relax_end ();
6655         }
6656       else
6657         abort ();
6658
6659       if (! used_at)
6660         return;
6661
6662       break;
6663
6664     case M_LD_OB:
6665       s = "lw";
6666       goto sd_ob;
6667     case M_SD_OB:
6668       s = "sw";
6669     sd_ob:
6670       assert (HAVE_32BIT_ADDRESSES);
6671       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
6672       offset_expr.X_add_number += 4;
6673       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
6674       return;
6675
6676    /* New code added to support COPZ instructions.
6677       This code builds table entries out of the macros in mip_opcodes.
6678       R4000 uses interlocks to handle coproc delays.
6679       Other chips (like the R3000) require nops to be inserted for delays.
6680
6681       FIXME: Currently, we require that the user handle delays.
6682       In order to fill delay slots for non-interlocked chips,
6683       we must have a way to specify delays based on the coprocessor.
6684       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
6685       What are the side-effects of the cop instruction?
6686       What cache support might we have and what are its effects?
6687       Both coprocessor & memory require delays. how long???
6688       What registers are read/set/modified?
6689
6690       If an itbl is provided to interpret cop instructions,
6691       this knowledge can be encoded in the itbl spec.  */
6692
6693     case M_COP0:
6694       s = "c0";
6695       goto copz;
6696     case M_COP1:
6697       s = "c1";
6698       goto copz;
6699     case M_COP2:
6700       s = "c2";
6701       goto copz;
6702     case M_COP3:
6703       s = "c3";
6704     copz:
6705       /* For now we just do C (same as Cz).  The parameter will be
6706          stored in insn_opcode by mips_ip.  */
6707       macro_build (NULL, s, "C", ip->insn_opcode);
6708       return;
6709
6710     case M_MOVE:
6711       move_register (dreg, sreg);
6712       return;
6713
6714 #ifdef LOSING_COMPILER
6715     default:
6716       /* Try and see if this is a new itbl instruction.
6717          This code builds table entries out of the macros in mip_opcodes.
6718          FIXME: For now we just assemble the expression and pass it's
6719          value along as a 32-bit immediate.
6720          We may want to have the assembler assemble this value,
6721          so that we gain the assembler's knowledge of delay slots,
6722          symbols, etc.
6723          Would it be more efficient to use mask (id) here? */
6724       if (itbl_have_entries
6725           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
6726         {
6727           s = ip->insn_mo->name;
6728           s2 = "cop3";
6729           coproc = ITBL_DECODE_PNUM (immed_expr);;
6730           macro_build (&immed_expr, s, "C");
6731           return;
6732         }
6733       macro2 (ip);
6734       return;
6735     }
6736   if (mips_opts.noat)
6737     as_warn (_("Macro used $at after \".set noat\""));
6738 }
6739
6740 static void
6741 macro2 (struct mips_cl_insn *ip)
6742 {
6743   register int treg, sreg, dreg, breg;
6744   int tempreg;
6745   int mask;
6746   int used_at;
6747   expressionS expr1;
6748   const char *s;
6749   const char *s2;
6750   const char *fmt;
6751   int likely = 0;
6752   int dbl = 0;
6753   int coproc = 0;
6754   int lr = 0;
6755   int imm = 0;
6756   int off;
6757   offsetT maxnum;
6758   bfd_reloc_code_real_type r;
6759
6760   treg = (ip->insn_opcode >> 16) & 0x1f;
6761   dreg = (ip->insn_opcode >> 11) & 0x1f;
6762   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
6763   mask = ip->insn_mo->mask;
6764
6765   expr1.X_op = O_constant;
6766   expr1.X_op_symbol = NULL;
6767   expr1.X_add_symbol = NULL;
6768   expr1.X_add_number = 1;
6769
6770   switch (mask)
6771     {
6772 #endif /* LOSING_COMPILER */
6773
6774     case M_DMUL:
6775       dbl = 1;
6776     case M_MUL:
6777       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
6778       macro_build (NULL, "mflo", "d", dreg);
6779       return;
6780
6781     case M_DMUL_I:
6782       dbl = 1;
6783     case M_MUL_I:
6784       /* The MIPS assembler some times generates shifts and adds.  I'm
6785          not trying to be that fancy. GCC should do this for us
6786          anyway.  */
6787       load_register (AT, &imm_expr, dbl);
6788       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
6789       macro_build (NULL, "mflo", "d", dreg);
6790       break;
6791
6792     case M_DMULO_I:
6793       dbl = 1;
6794     case M_MULO_I:
6795       imm = 1;
6796       goto do_mulo;
6797
6798     case M_DMULO:
6799       dbl = 1;
6800     case M_MULO:
6801     do_mulo:
6802       mips_emit_delays (TRUE);
6803       ++mips_opts.noreorder;
6804       mips_any_noreorder = 1;
6805       if (imm)
6806         load_register (AT, &imm_expr, dbl);
6807       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
6808       macro_build (NULL, "mflo", "d", dreg);
6809       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
6810       macro_build (NULL, "mfhi", "d", AT);
6811       if (mips_trap)
6812         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
6813       else
6814         {
6815           expr1.X_add_number = 8;
6816           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
6817           macro_build (NULL, "nop", "", 0);
6818           macro_build (NULL, "break", "c", 6);
6819         }
6820       --mips_opts.noreorder;
6821       macro_build (NULL, "mflo", "d", dreg);
6822       break;
6823
6824     case M_DMULOU_I:
6825       dbl = 1;
6826     case M_MULOU_I:
6827       imm = 1;
6828       goto do_mulou;
6829
6830     case M_DMULOU:
6831       dbl = 1;
6832     case M_MULOU:
6833     do_mulou:
6834       mips_emit_delays (TRUE);
6835       ++mips_opts.noreorder;
6836       mips_any_noreorder = 1;
6837       if (imm)
6838         load_register (AT, &imm_expr, dbl);
6839       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
6840                    sreg, imm ? AT : treg);
6841       macro_build (NULL, "mfhi", "d", AT);
6842       macro_build (NULL, "mflo", "d", dreg);
6843       if (mips_trap)
6844         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
6845       else
6846         {
6847           expr1.X_add_number = 8;
6848           macro_build (&expr1, "beq", "s,t,p", AT, 0);
6849           macro_build (NULL, "nop", "", 0);
6850           macro_build (NULL, "break", "c", 6);
6851         }
6852       --mips_opts.noreorder;
6853       break;
6854
6855     case M_DROL:
6856       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
6857         {
6858           if (dreg == sreg)
6859             {
6860               tempreg = AT;
6861               used_at = 1;
6862             }
6863           else
6864             {
6865               tempreg = dreg;
6866               used_at = 0;
6867             }
6868           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
6869           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
6870           if (used_at)
6871             break;
6872           return;
6873         }
6874       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
6875       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
6876       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
6877       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6878       break;
6879
6880     case M_ROL:
6881       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
6882         {
6883           if (dreg == sreg)
6884             {
6885               tempreg = AT;
6886               used_at = 1;
6887             }
6888           else
6889             {
6890               tempreg = dreg;
6891               used_at = 0;
6892             }
6893           macro_build (NULL, "negu", "d,w", tempreg, treg);
6894           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
6895           if (used_at)
6896             break;
6897           return;
6898         }
6899       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
6900       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
6901       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
6902       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6903       break;
6904
6905     case M_DROL_I:
6906       {
6907         unsigned int rot;
6908         char *l, *r;
6909
6910         if (imm_expr.X_op != O_constant)
6911           as_bad (_("Improper rotate count"));
6912         rot = imm_expr.X_add_number & 0x3f;
6913         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
6914           {
6915             rot = (64 - rot) & 0x3f;
6916             if (rot >= 32)
6917               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
6918             else
6919               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
6920             return;
6921           }
6922         if (rot == 0)
6923           {
6924             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
6925             return;
6926           }
6927         l = (rot < 0x20) ? "dsll" : "dsll32";
6928         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
6929         rot &= 0x1f;
6930         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
6931         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
6932         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6933       }
6934       break;
6935
6936     case M_ROL_I:
6937       {
6938         unsigned int rot;
6939
6940         if (imm_expr.X_op != O_constant)
6941           as_bad (_("Improper rotate count"));
6942         rot = imm_expr.X_add_number & 0x1f;
6943         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
6944           {
6945             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
6946             return;
6947           }
6948         if (rot == 0)
6949           {
6950             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
6951             return;
6952           }
6953         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
6954         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
6955         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6956       }
6957       break;
6958
6959     case M_DROR:
6960       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
6961         {
6962           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
6963           return;
6964         }
6965       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
6966       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
6967       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
6968       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6969       break;
6970
6971     case M_ROR:
6972       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
6973         {
6974           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
6975           return;
6976         }
6977       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
6978       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
6979       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
6980       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
6981       break;
6982
6983     case M_DROR_I:
6984       {
6985         unsigned int rot;
6986         char *l, *r;
6987
6988         if (imm_expr.X_op != O_constant)
6989           as_bad (_("Improper rotate count"));
6990         rot = imm_expr.X_add_number & 0x3f;
6991         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
6992           {
6993             if (rot >= 32)
6994               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
6995             else
6996               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
6997             return;
6998           }
6999         if (rot == 0)
7000           {
7001             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7002             return;
7003           }
7004         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7005         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7006         rot &= 0x1f;
7007         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7008         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7009         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7010       }
7011       break;
7012
7013     case M_ROR_I:
7014       {
7015         unsigned int rot;
7016
7017         if (imm_expr.X_op != O_constant)
7018           as_bad (_("Improper rotate count"));
7019         rot = imm_expr.X_add_number & 0x1f;
7020         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7021           {
7022             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7023             return;
7024           }
7025         if (rot == 0)
7026           {
7027             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7028             return;
7029           }
7030         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7031         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7032         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7033       }
7034       break;
7035
7036     case M_S_DOB:
7037       if (mips_opts.arch == CPU_R4650)
7038         {
7039           as_bad (_("opcode not supported on this processor"));
7040           return;
7041         }
7042       assert (mips_opts.isa == ISA_MIPS1);
7043       /* Even on a big endian machine $fn comes before $fn+1.  We have
7044          to adjust when storing to memory.  */
7045       macro_build (&offset_expr, "swc1", "T,o(b)",
7046                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7047       offset_expr.X_add_number += 4;
7048       macro_build (&offset_expr, "swc1", "T,o(b)",
7049                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7050       return;
7051
7052     case M_SEQ:
7053       if (sreg == 0)
7054         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7055       else if (treg == 0)
7056         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7057       else
7058         {
7059           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7060           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7061         }
7062       return;
7063
7064     case M_SEQ_I:
7065       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7066         {
7067           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7068           return;
7069         }
7070       if (sreg == 0)
7071         {
7072           as_warn (_("Instruction %s: result is always false"),
7073                    ip->insn_mo->name);
7074           move_register (dreg, 0);
7075           return;
7076         }
7077       if (imm_expr.X_op == O_constant
7078           && imm_expr.X_add_number >= 0
7079           && imm_expr.X_add_number < 0x10000)
7080         {
7081           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7082           used_at = 0;
7083         }
7084       else if (imm_expr.X_op == O_constant
7085                && imm_expr.X_add_number > -0x8000
7086                && imm_expr.X_add_number < 0)
7087         {
7088           imm_expr.X_add_number = -imm_expr.X_add_number;
7089           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7090                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7091           used_at = 0;
7092         }
7093       else
7094         {
7095           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7096           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7097           used_at = 1;
7098         }
7099       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7100       if (used_at)
7101         break;
7102       return;
7103
7104     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7105       s = "slt";
7106       goto sge;
7107     case M_SGEU:
7108       s = "sltu";
7109     sge:
7110       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7111       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7112       return;
7113
7114     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7115     case M_SGEU_I:
7116       if (imm_expr.X_op == O_constant
7117           && imm_expr.X_add_number >= -0x8000
7118           && imm_expr.X_add_number < 0x8000)
7119         {
7120           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7121                        dreg, sreg, BFD_RELOC_LO16);
7122           used_at = 0;
7123         }
7124       else
7125         {
7126           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7127           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7128                        dreg, sreg, AT);
7129           used_at = 1;
7130         }
7131       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7132       if (used_at)
7133         break;
7134       return;
7135
7136     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7137       s = "slt";
7138       goto sgt;
7139     case M_SGTU:
7140       s = "sltu";
7141     sgt:
7142       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7143       return;
7144
7145     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7146       s = "slt";
7147       goto sgti;
7148     case M_SGTU_I:
7149       s = "sltu";
7150     sgti:
7151       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7152       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7153       break;
7154
7155     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7156       s = "slt";
7157       goto sle;
7158     case M_SLEU:
7159       s = "sltu";
7160     sle:
7161       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7162       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7163       return;
7164
7165     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7166       s = "slt";
7167       goto slei;
7168     case M_SLEU_I:
7169       s = "sltu";
7170     slei:
7171       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7172       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7173       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7174       break;
7175
7176     case M_SLT_I:
7177       if (imm_expr.X_op == O_constant
7178           && imm_expr.X_add_number >= -0x8000
7179           && imm_expr.X_add_number < 0x8000)
7180         {
7181           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7182           return;
7183         }
7184       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7185       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7186       break;
7187
7188     case M_SLTU_I:
7189       if (imm_expr.X_op == O_constant
7190           && imm_expr.X_add_number >= -0x8000
7191           && imm_expr.X_add_number < 0x8000)
7192         {
7193           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7194                        BFD_RELOC_LO16);
7195           return;
7196         }
7197       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7198       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7199       break;
7200
7201     case M_SNE:
7202       if (sreg == 0)
7203         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7204       else if (treg == 0)
7205         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7206       else
7207         {
7208           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7209           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7210         }
7211       return;
7212
7213     case M_SNE_I:
7214       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7215         {
7216           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7217           return;
7218         }
7219       if (sreg == 0)
7220         {
7221           as_warn (_("Instruction %s: result is always true"),
7222                    ip->insn_mo->name);
7223           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7224                        dreg, 0, BFD_RELOC_LO16);
7225           return;
7226         }
7227       if (imm_expr.X_op == O_constant
7228           && imm_expr.X_add_number >= 0
7229           && imm_expr.X_add_number < 0x10000)
7230         {
7231           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7232           used_at = 0;
7233         }
7234       else if (imm_expr.X_op == O_constant
7235                && imm_expr.X_add_number > -0x8000
7236                && imm_expr.X_add_number < 0)
7237         {
7238           imm_expr.X_add_number = -imm_expr.X_add_number;
7239           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7240                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7241           used_at = 0;
7242         }
7243       else
7244         {
7245           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7246           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7247           used_at = 1;
7248         }
7249       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7250       if (used_at)
7251         break;
7252       return;
7253
7254     case M_DSUB_I:
7255       dbl = 1;
7256     case M_SUB_I:
7257       if (imm_expr.X_op == O_constant
7258           && imm_expr.X_add_number > -0x8000
7259           && imm_expr.X_add_number <= 0x8000)
7260         {
7261           imm_expr.X_add_number = -imm_expr.X_add_number;
7262           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7263                        dreg, sreg, BFD_RELOC_LO16);
7264           return;
7265         }
7266       load_register (AT, &imm_expr, dbl);
7267       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7268       break;
7269
7270     case M_DSUBU_I:
7271       dbl = 1;
7272     case M_SUBU_I:
7273       if (imm_expr.X_op == O_constant
7274           && imm_expr.X_add_number > -0x8000
7275           && imm_expr.X_add_number <= 0x8000)
7276         {
7277           imm_expr.X_add_number = -imm_expr.X_add_number;
7278           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7279                        dreg, sreg, BFD_RELOC_LO16);
7280           return;
7281         }
7282       load_register (AT, &imm_expr, dbl);
7283       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7284       break;
7285
7286     case M_TEQ_I:
7287       s = "teq";
7288       goto trap;
7289     case M_TGE_I:
7290       s = "tge";
7291       goto trap;
7292     case M_TGEU_I:
7293       s = "tgeu";
7294       goto trap;
7295     case M_TLT_I:
7296       s = "tlt";
7297       goto trap;
7298     case M_TLTU_I:
7299       s = "tltu";
7300       goto trap;
7301     case M_TNE_I:
7302       s = "tne";
7303     trap:
7304       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7305       macro_build (NULL, s, "s,t", sreg, AT);
7306       break;
7307
7308     case M_TRUNCWS:
7309     case M_TRUNCWD:
7310       assert (mips_opts.isa == ISA_MIPS1);
7311       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7312       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7313
7314       /*
7315        * Is the double cfc1 instruction a bug in the mips assembler;
7316        * or is there a reason for it?
7317        */
7318       mips_emit_delays (TRUE);
7319       ++mips_opts.noreorder;
7320       mips_any_noreorder = 1;
7321       macro_build (NULL, "cfc1", "t,G", treg, RA);
7322       macro_build (NULL, "cfc1", "t,G", treg, RA);
7323       macro_build (NULL, "nop", "");
7324       expr1.X_add_number = 3;
7325       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7326       expr1.X_add_number = 2;
7327       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7328       macro_build (NULL, "ctc1", "t,G", AT, RA);
7329       macro_build (NULL, "nop", "");
7330       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7331                    dreg, sreg);
7332       macro_build (NULL, "ctc1", "t,G", treg, RA);
7333       macro_build (NULL, "nop", "");
7334       --mips_opts.noreorder;
7335       break;
7336
7337     case M_ULH:
7338       s = "lb";
7339       goto ulh;
7340     case M_ULHU:
7341       s = "lbu";
7342     ulh:
7343       if (offset_expr.X_add_number >= 0x7fff)
7344         as_bad (_("operand overflow"));
7345       if (! target_big_endian)
7346         ++offset_expr.X_add_number;
7347       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7348       if (! target_big_endian)
7349         --offset_expr.X_add_number;
7350       else
7351         ++offset_expr.X_add_number;
7352       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7353       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7354       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7355       break;
7356
7357     case M_ULD:
7358       s = "ldl";
7359       s2 = "ldr";
7360       off = 7;
7361       goto ulw;
7362     case M_ULW:
7363       s = "lwl";
7364       s2 = "lwr";
7365       off = 3;
7366     ulw:
7367       if (offset_expr.X_add_number >= 0x8000 - off)
7368         as_bad (_("operand overflow"));
7369       if (treg != breg)
7370         tempreg = treg;
7371       else
7372         tempreg = AT;
7373       if (! target_big_endian)
7374         offset_expr.X_add_number += off;
7375       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7376       if (! target_big_endian)
7377         offset_expr.X_add_number -= off;
7378       else
7379         offset_expr.X_add_number += off;
7380       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7381
7382       /* If necessary, move the result in tempreg the final destination.  */
7383       if (treg == tempreg)
7384         return;
7385       /* Protect second load's delay slot.  */
7386       load_delay_nop ();
7387       move_register (treg, tempreg);
7388       break;
7389
7390     case M_ULD_A:
7391       s = "ldl";
7392       s2 = "ldr";
7393       off = 7;
7394       goto ulwa;
7395     case M_ULW_A:
7396       s = "lwl";
7397       s2 = "lwr";
7398       off = 3;
7399     ulwa:
7400       used_at = 1;
7401       load_address (AT, &offset_expr, &used_at);
7402       if (breg != 0)
7403         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7404       if (! target_big_endian)
7405         expr1.X_add_number = off;
7406       else
7407         expr1.X_add_number = 0;
7408       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7409       if (! target_big_endian)
7410         expr1.X_add_number = 0;
7411       else
7412         expr1.X_add_number = off;
7413       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7414       break;
7415
7416     case M_ULH_A:
7417     case M_ULHU_A:
7418       used_at = 1;
7419       load_address (AT, &offset_expr, &used_at);
7420       if (breg != 0)
7421         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7422       if (target_big_endian)
7423         expr1.X_add_number = 0;
7424       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7425                    treg, BFD_RELOC_LO16, AT);
7426       if (target_big_endian)
7427         expr1.X_add_number = 1;
7428       else
7429         expr1.X_add_number = 0;
7430       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7431       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7432       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7433       break;
7434
7435     case M_USH:
7436       if (offset_expr.X_add_number >= 0x7fff)
7437         as_bad (_("operand overflow"));
7438       if (target_big_endian)
7439         ++offset_expr.X_add_number;
7440       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7441       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7442       if (target_big_endian)
7443         --offset_expr.X_add_number;
7444       else
7445         ++offset_expr.X_add_number;
7446       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7447       break;
7448
7449     case M_USD:
7450       s = "sdl";
7451       s2 = "sdr";
7452       off = 7;
7453       goto usw;
7454     case M_USW:
7455       s = "swl";
7456       s2 = "swr";
7457       off = 3;
7458     usw:
7459       if (offset_expr.X_add_number >= 0x8000 - off)
7460         as_bad (_("operand overflow"));
7461       if (! target_big_endian)
7462         offset_expr.X_add_number += off;
7463       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7464       if (! target_big_endian)
7465         offset_expr.X_add_number -= off;
7466       else
7467         offset_expr.X_add_number += off;
7468       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7469       return;
7470
7471     case M_USD_A:
7472       s = "sdl";
7473       s2 = "sdr";
7474       off = 7;
7475       goto uswa;
7476     case M_USW_A:
7477       s = "swl";
7478       s2 = "swr";
7479       off = 3;
7480     uswa:
7481       used_at = 1;
7482       load_address (AT, &offset_expr, &used_at);
7483       if (breg != 0)
7484         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7485       if (! target_big_endian)
7486         expr1.X_add_number = off;
7487       else
7488         expr1.X_add_number = 0;
7489       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7490       if (! target_big_endian)
7491         expr1.X_add_number = 0;
7492       else
7493         expr1.X_add_number = off;
7494       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7495       break;
7496
7497     case M_USH_A:
7498       used_at = 1;
7499       load_address (AT, &offset_expr, &used_at);
7500       if (breg != 0)
7501         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7502       if (! target_big_endian)
7503         expr1.X_add_number = 0;
7504       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7505       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7506       if (! target_big_endian)
7507         expr1.X_add_number = 1;
7508       else
7509         expr1.X_add_number = 0;
7510       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7511       if (! target_big_endian)
7512         expr1.X_add_number = 0;
7513       else
7514         expr1.X_add_number = 1;
7515       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7516       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7517       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7518       break;
7519
7520     default:
7521       /* FIXME: Check if this is one of the itbl macros, since they
7522          are added dynamically.  */
7523       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7524       break;
7525     }
7526   if (mips_opts.noat)
7527     as_warn (_("Macro used $at after \".set noat\""));
7528 }
7529
7530 /* Implement macros in mips16 mode.  */
7531
7532 static void
7533 mips16_macro (struct mips_cl_insn *ip)
7534 {
7535   int mask;
7536   int xreg, yreg, zreg, tmp;
7537   expressionS expr1;
7538   int dbl;
7539   const char *s, *s2, *s3;
7540
7541   mask = ip->insn_mo->mask;
7542
7543   xreg = (ip->insn_opcode >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX;
7544   yreg = (ip->insn_opcode >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY;
7545   zreg = (ip->insn_opcode >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ;
7546
7547   expr1.X_op = O_constant;
7548   expr1.X_op_symbol = NULL;
7549   expr1.X_add_symbol = NULL;
7550   expr1.X_add_number = 1;
7551
7552   dbl = 0;
7553
7554   switch (mask)
7555     {
7556     default:
7557       internalError ();
7558
7559     case M_DDIV_3:
7560       dbl = 1;
7561     case M_DIV_3:
7562       s = "mflo";
7563       goto do_div3;
7564     case M_DREM_3:
7565       dbl = 1;
7566     case M_REM_3:
7567       s = "mfhi";
7568     do_div3:
7569       mips_emit_delays (TRUE);
7570       ++mips_opts.noreorder;
7571       mips_any_noreorder = 1;
7572       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7573       expr1.X_add_number = 2;
7574       macro_build (&expr1, "bnez", "x,p", yreg);
7575       macro_build (NULL, "break", "6", 7);
7576
7577       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7578          since that causes an overflow.  We should do that as well,
7579          but I don't see how to do the comparisons without a temporary
7580          register.  */
7581       --mips_opts.noreorder;
7582       macro_build (NULL, s, "x", zreg);
7583       break;
7584
7585     case M_DIVU_3:
7586       s = "divu";
7587       s2 = "mflo";
7588       goto do_divu3;
7589     case M_REMU_3:
7590       s = "divu";
7591       s2 = "mfhi";
7592       goto do_divu3;
7593     case M_DDIVU_3:
7594       s = "ddivu";
7595       s2 = "mflo";
7596       goto do_divu3;
7597     case M_DREMU_3:
7598       s = "ddivu";
7599       s2 = "mfhi";
7600     do_divu3:
7601       mips_emit_delays (TRUE);
7602       ++mips_opts.noreorder;
7603       mips_any_noreorder = 1;
7604       macro_build (NULL, s, "0,x,y", xreg, yreg);
7605       expr1.X_add_number = 2;
7606       macro_build (&expr1, "bnez", "x,p", yreg);
7607       macro_build (NULL, "break", "6", 7);
7608       --mips_opts.noreorder;
7609       macro_build (NULL, s2, "x", zreg);
7610       break;
7611
7612     case M_DMUL:
7613       dbl = 1;
7614     case M_MUL:
7615       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
7616       macro_build (NULL, "mflo", "x", zreg);
7617       return;
7618
7619     case M_DSUBU_I:
7620       dbl = 1;
7621       goto do_subu;
7622     case M_SUBU_I:
7623     do_subu:
7624       if (imm_expr.X_op != O_constant)
7625         as_bad (_("Unsupported large constant"));
7626       imm_expr.X_add_number = -imm_expr.X_add_number;
7627       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
7628       break;
7629
7630     case M_SUBU_I_2:
7631       if (imm_expr.X_op != O_constant)
7632         as_bad (_("Unsupported large constant"));
7633       imm_expr.X_add_number = -imm_expr.X_add_number;
7634       macro_build (&imm_expr, "addiu", "x,k", xreg);
7635       break;
7636
7637     case M_DSUBU_I_2:
7638       if (imm_expr.X_op != O_constant)
7639         as_bad (_("Unsupported large constant"));
7640       imm_expr.X_add_number = -imm_expr.X_add_number;
7641       macro_build (&imm_expr, "daddiu", "y,j", yreg);
7642       break;
7643
7644     case M_BEQ:
7645       s = "cmp";
7646       s2 = "bteqz";
7647       goto do_branch;
7648     case M_BNE:
7649       s = "cmp";
7650       s2 = "btnez";
7651       goto do_branch;
7652     case M_BLT:
7653       s = "slt";
7654       s2 = "btnez";
7655       goto do_branch;
7656     case M_BLTU:
7657       s = "sltu";
7658       s2 = "btnez";
7659       goto do_branch;
7660     case M_BLE:
7661       s = "slt";
7662       s2 = "bteqz";
7663       goto do_reverse_branch;
7664     case M_BLEU:
7665       s = "sltu";
7666       s2 = "bteqz";
7667       goto do_reverse_branch;
7668     case M_BGE:
7669       s = "slt";
7670       s2 = "bteqz";
7671       goto do_branch;
7672     case M_BGEU:
7673       s = "sltu";
7674       s2 = "bteqz";
7675       goto do_branch;
7676     case M_BGT:
7677       s = "slt";
7678       s2 = "btnez";
7679       goto do_reverse_branch;
7680     case M_BGTU:
7681       s = "sltu";
7682       s2 = "btnez";
7683
7684     do_reverse_branch:
7685       tmp = xreg;
7686       xreg = yreg;
7687       yreg = tmp;
7688
7689     do_branch:
7690       macro_build (NULL, s, "x,y", xreg, yreg);
7691       macro_build (&offset_expr, s2, "p");
7692       break;
7693
7694     case M_BEQ_I:
7695       s = "cmpi";
7696       s2 = "bteqz";
7697       s3 = "x,U";
7698       goto do_branch_i;
7699     case M_BNE_I:
7700       s = "cmpi";
7701       s2 = "btnez";
7702       s3 = "x,U";
7703       goto do_branch_i;
7704     case M_BLT_I:
7705       s = "slti";
7706       s2 = "btnez";
7707       s3 = "x,8";
7708       goto do_branch_i;
7709     case M_BLTU_I:
7710       s = "sltiu";
7711       s2 = "btnez";
7712       s3 = "x,8";
7713       goto do_branch_i;
7714     case M_BLE_I:
7715       s = "slti";
7716       s2 = "btnez";
7717       s3 = "x,8";
7718       goto do_addone_branch_i;
7719     case M_BLEU_I:
7720       s = "sltiu";
7721       s2 = "btnez";
7722       s3 = "x,8";
7723       goto do_addone_branch_i;
7724     case M_BGE_I:
7725       s = "slti";
7726       s2 = "bteqz";
7727       s3 = "x,8";
7728       goto do_branch_i;
7729     case M_BGEU_I:
7730       s = "sltiu";
7731       s2 = "bteqz";
7732       s3 = "x,8";
7733       goto do_branch_i;
7734     case M_BGT_I:
7735       s = "slti";
7736       s2 = "bteqz";
7737       s3 = "x,8";
7738       goto do_addone_branch_i;
7739     case M_BGTU_I:
7740       s = "sltiu";
7741       s2 = "bteqz";
7742       s3 = "x,8";
7743
7744     do_addone_branch_i:
7745       if (imm_expr.X_op != O_constant)
7746         as_bad (_("Unsupported large constant"));
7747       ++imm_expr.X_add_number;
7748
7749     do_branch_i:
7750       macro_build (&imm_expr, s, s3, xreg);
7751       macro_build (&offset_expr, s2, "p");
7752       break;
7753
7754     case M_ABS:
7755       expr1.X_add_number = 0;
7756       macro_build (&expr1, "slti", "x,8", yreg);
7757       if (xreg != yreg)
7758         move_register (xreg, yreg);
7759       expr1.X_add_number = 2;
7760       macro_build (&expr1, "bteqz", "p");
7761       macro_build (NULL, "neg", "x,w", xreg, xreg);
7762     }
7763 }
7764
7765 /* For consistency checking, verify that all bits are specified either
7766    by the match/mask part of the instruction definition, or by the
7767    operand list.  */
7768 static int
7769 validate_mips_insn (const struct mips_opcode *opc)
7770 {
7771   const char *p = opc->args;
7772   char c;
7773   unsigned long used_bits = opc->mask;
7774
7775   if ((used_bits & opc->match) != opc->match)
7776     {
7777       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
7778               opc->name, opc->args);
7779       return 0;
7780     }
7781 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
7782   while (*p)
7783     switch (c = *p++)
7784       {
7785       case ',': break;
7786       case '(': break;
7787       case ')': break;
7788       case '+':
7789         switch (c = *p++)
7790           {
7791           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
7792           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
7793           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7794           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
7795                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
7796           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
7797           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
7798           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7799           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
7800           case 'I': break;
7801           default:
7802             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
7803                     c, opc->name, opc->args);
7804             return 0;
7805           }
7806         break;
7807       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7808       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
7809       case 'A': break;
7810       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
7811       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
7812       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
7813       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7814       case 'F': break;
7815       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7816       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
7817       case 'I': break;
7818       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
7819       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7820       case 'L': break;
7821       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
7822       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
7823       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
7824       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
7825                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7826       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
7827       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7828       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7829       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7830       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7831       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
7832       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
7833       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
7834       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
7835       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7836       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
7837       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
7838       case 'f': break;
7839       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
7840       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
7841       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7842       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
7843       case 'l': break;
7844       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7845       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
7846       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
7847       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7848       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7849       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7850       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
7851       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
7852       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7853       case 'x': break;
7854       case 'z': break;
7855       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
7856       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
7857                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
7858       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
7859       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
7860       case '[': break;
7861       case ']': break;
7862       default:
7863         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
7864                 c, opc->name, opc->args);
7865         return 0;
7866       }
7867 #undef USE_BITS
7868   if (used_bits != 0xffffffff)
7869     {
7870       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
7871               ~used_bits & 0xffffffff, opc->name, opc->args);
7872       return 0;
7873     }
7874   return 1;
7875 }
7876
7877 /* This routine assembles an instruction into its binary format.  As a
7878    side effect, it sets one of the global variables imm_reloc or
7879    offset_reloc to the type of relocation to do if one of the operands
7880    is an address expression.  */
7881
7882 static void
7883 mips_ip (char *str, struct mips_cl_insn *ip)
7884 {
7885   char *s;
7886   const char *args;
7887   char c = 0;
7888   struct mips_opcode *insn;
7889   char *argsStart;
7890   unsigned int regno;
7891   unsigned int lastregno = 0;
7892   unsigned int lastpos = 0;
7893   unsigned int limlo, limhi;
7894   char *s_reset;
7895   char save_c = 0;
7896
7897   insn_error = NULL;
7898
7899   /* If the instruction contains a '.', we first try to match an instruction
7900      including the '.'.  Then we try again without the '.'.  */
7901   insn = NULL;
7902   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
7903     continue;
7904
7905   /* If we stopped on whitespace, then replace the whitespace with null for
7906      the call to hash_find.  Save the character we replaced just in case we
7907      have to re-parse the instruction.  */
7908   if (ISSPACE (*s))
7909     {
7910       save_c = *s;
7911       *s++ = '\0';
7912     }
7913
7914   insn = (struct mips_opcode *) hash_find (op_hash, str);
7915
7916   /* If we didn't find the instruction in the opcode table, try again, but
7917      this time with just the instruction up to, but not including the
7918      first '.'.  */
7919   if (insn == NULL)
7920     {
7921       /* Restore the character we overwrite above (if any).  */
7922       if (save_c)
7923         *(--s) = save_c;
7924
7925       /* Scan up to the first '.' or whitespace.  */
7926       for (s = str;
7927            *s != '\0' && *s != '.' && !ISSPACE (*s);
7928            ++s)
7929         continue;
7930
7931       /* If we did not find a '.', then we can quit now.  */
7932       if (*s != '.')
7933         {
7934           insn_error = "unrecognized opcode";
7935           return;
7936         }
7937
7938       /* Lookup the instruction in the hash table.  */
7939       *s++ = '\0';
7940       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
7941         {
7942           insn_error = "unrecognized opcode";
7943           return;
7944         }
7945     }
7946
7947   argsStart = s;
7948   for (;;)
7949     {
7950       bfd_boolean ok;
7951
7952       assert (strcmp (insn->name, str) == 0);
7953
7954       if (OPCODE_IS_MEMBER (insn,
7955                             (mips_opts.isa
7956                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
7957                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
7958                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
7959                             mips_opts.arch))
7960         ok = TRUE;
7961       else
7962         ok = FALSE;
7963
7964       if (insn->pinfo != INSN_MACRO)
7965         {
7966           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
7967             ok = FALSE;
7968         }
7969
7970       if (! ok)
7971         {
7972           if (insn + 1 < &mips_opcodes[NUMOPCODES]
7973               && strcmp (insn->name, insn[1].name) == 0)
7974             {
7975               ++insn;
7976               continue;
7977             }
7978           else
7979             {
7980               if (!insn_error)
7981                 {
7982                   static char buf[100];
7983                   sprintf (buf,
7984                            _("opcode not supported on this processor: %s (%s)"),
7985                            mips_cpu_info_from_arch (mips_opts.arch)->name,
7986                            mips_cpu_info_from_isa (mips_opts.isa)->name);
7987                   insn_error = buf;
7988                 }
7989               if (save_c)
7990                 *(--s) = save_c;
7991               return;
7992             }
7993         }
7994
7995       ip->insn_mo = insn;
7996       ip->insn_opcode = insn->match;
7997       insn_error = NULL;
7998       for (args = insn->args;; ++args)
7999         {
8000           int is_mdmx;
8001
8002           s += strspn (s, " \t");
8003           is_mdmx = 0;
8004           switch (*args)
8005             {
8006             case '\0':          /* end of args */
8007               if (*s == '\0')
8008                 return;
8009               break;
8010
8011             case ',':
8012               if (*s++ == *args)
8013                 continue;
8014               s--;
8015               switch (*++args)
8016                 {
8017                 case 'r':
8018                 case 'v':
8019                   ip->insn_opcode |= lastregno << OP_SH_RS;
8020                   continue;
8021
8022                 case 'w':
8023                   ip->insn_opcode |= lastregno << OP_SH_RT;
8024                   continue;
8025
8026                 case 'W':
8027                   ip->insn_opcode |= lastregno << OP_SH_FT;
8028                   continue;
8029
8030                 case 'V':
8031                   ip->insn_opcode |= lastregno << OP_SH_FS;
8032                   continue;
8033                 }
8034               break;
8035
8036             case '(':
8037               /* Handle optional base register.
8038                  Either the base register is omitted or
8039                  we must have a left paren.  */
8040               /* This is dependent on the next operand specifier
8041                  is a base register specification.  */
8042               assert (args[1] == 'b' || args[1] == '5'
8043                       || args[1] == '-' || args[1] == '4');
8044               if (*s == '\0')
8045                 return;
8046
8047             case ')':           /* these must match exactly */
8048             case '[':
8049             case ']':
8050               if (*s++ == *args)
8051                 continue;
8052               break;
8053
8054             case '+':           /* Opcode extension character.  */
8055               switch (*++args)
8056                 {
8057                 case 'A':               /* ins/ext position, becomes LSB.  */
8058                   limlo = 0;
8059                   limhi = 31;
8060                   goto do_lsb;
8061                 case 'E':
8062                   limlo = 32;
8063                   limhi = 63;
8064                   goto do_lsb;
8065 do_lsb:
8066                   my_getExpression (&imm_expr, s);
8067                   check_absolute_expr (ip, &imm_expr);
8068                   if ((unsigned long) imm_expr.X_add_number < limlo
8069                       || (unsigned long) imm_expr.X_add_number > limhi)
8070                     {
8071                       as_bad (_("Improper position (%lu)"),
8072                               (unsigned long) imm_expr.X_add_number);
8073                       imm_expr.X_add_number = limlo;
8074                     }
8075                   lastpos = imm_expr.X_add_number;
8076                   ip->insn_opcode |= (imm_expr.X_add_number
8077                                       & OP_MASK_SHAMT) << OP_SH_SHAMT;
8078                   imm_expr.X_op = O_absent;
8079                   s = expr_end;
8080                   continue;
8081
8082                 case 'B':               /* ins size, becomes MSB.  */
8083                   limlo = 1;
8084                   limhi = 32;
8085                   goto do_msb;
8086                 case 'F':
8087                   limlo = 33;
8088                   limhi = 64;
8089                   goto do_msb;
8090 do_msb:
8091                   my_getExpression (&imm_expr, s);
8092                   check_absolute_expr (ip, &imm_expr);
8093                   /* Check for negative input so that small negative numbers
8094                      will not succeed incorrectly.  The checks against
8095                      (pos+size) transitively check "size" itself,
8096                      assuming that "pos" is reasonable.  */
8097                   if ((long) imm_expr.X_add_number < 0
8098                       || ((unsigned long) imm_expr.X_add_number
8099                           + lastpos) < limlo
8100                       || ((unsigned long) imm_expr.X_add_number
8101                           + lastpos) > limhi)
8102                     {
8103                       as_bad (_("Improper insert size (%lu, position %lu)"),
8104                               (unsigned long) imm_expr.X_add_number,
8105                               (unsigned long) lastpos);
8106                       imm_expr.X_add_number = limlo - lastpos;
8107                     }
8108                   ip->insn_opcode |= ((lastpos + imm_expr.X_add_number - 1)
8109                                       & OP_MASK_INSMSB) << OP_SH_INSMSB;
8110                   imm_expr.X_op = O_absent;
8111                   s = expr_end;
8112                   continue;
8113
8114                 case 'C':               /* ext size, becomes MSBD.  */
8115                   limlo = 1;
8116                   limhi = 32;
8117                   goto do_msbd;
8118                 case 'G':
8119                   limlo = 33;
8120                   limhi = 64;
8121                   goto do_msbd;
8122                 case 'H':
8123                   limlo = 33;
8124                   limhi = 64;
8125                   goto do_msbd;
8126 do_msbd:
8127                   my_getExpression (&imm_expr, s);
8128                   check_absolute_expr (ip, &imm_expr);
8129                   /* Check for negative input so that small negative numbers
8130                      will not succeed incorrectly.  The checks against
8131                      (pos+size) transitively check "size" itself,
8132                      assuming that "pos" is reasonable.  */
8133                   if ((long) imm_expr.X_add_number < 0
8134                       || ((unsigned long) imm_expr.X_add_number
8135                           + lastpos) < limlo
8136                       || ((unsigned long) imm_expr.X_add_number
8137                           + lastpos) > limhi)
8138                     {
8139                       as_bad (_("Improper extract size (%lu, position %lu)"),
8140                               (unsigned long) imm_expr.X_add_number,
8141                               (unsigned long) lastpos);
8142                       imm_expr.X_add_number = limlo - lastpos;
8143                     }
8144                   ip->insn_opcode |= ((imm_expr.X_add_number - 1)
8145                                       & OP_MASK_EXTMSBD) << OP_SH_EXTMSBD;
8146                   imm_expr.X_op = O_absent;
8147                   s = expr_end;
8148                   continue;
8149
8150                 case 'D':
8151                   /* +D is for disassembly only; never match.  */
8152                   break;
8153
8154                 case 'I':
8155                   /* "+I" is like "I", except that imm2_expr is used.  */
8156                   my_getExpression (&imm2_expr, s);
8157                   if (imm2_expr.X_op != O_big
8158                       && imm2_expr.X_op != O_constant)
8159                   insn_error = _("absolute expression required");
8160                   normalize_constant_expr (&imm2_expr);
8161                   s = expr_end;
8162                   continue;
8163
8164                 default:
8165                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8166                     *args, insn->name, insn->args);
8167                   /* Further processing is fruitless.  */
8168                   return;
8169                 }
8170               break;
8171
8172             case '<':           /* must be at least one digit */
8173               /*
8174                * According to the manual, if the shift amount is greater
8175                * than 31 or less than 0, then the shift amount should be
8176                * mod 32.  In reality the mips assembler issues an error.
8177                * We issue a warning and mask out all but the low 5 bits.
8178                */
8179               my_getExpression (&imm_expr, s);
8180               check_absolute_expr (ip, &imm_expr);
8181               if ((unsigned long) imm_expr.X_add_number > 31)
8182                 {
8183                   as_warn (_("Improper shift amount (%lu)"),
8184                            (unsigned long) imm_expr.X_add_number);
8185                   imm_expr.X_add_number &= OP_MASK_SHAMT;
8186                 }
8187               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_SHAMT;
8188               imm_expr.X_op = O_absent;
8189               s = expr_end;
8190               continue;
8191
8192             case '>':           /* shift amount minus 32 */
8193               my_getExpression (&imm_expr, s);
8194               check_absolute_expr (ip, &imm_expr);
8195               if ((unsigned long) imm_expr.X_add_number < 32
8196                   || (unsigned long) imm_expr.X_add_number > 63)
8197                 break;
8198               ip->insn_opcode |= (imm_expr.X_add_number - 32) << OP_SH_SHAMT;
8199               imm_expr.X_op = O_absent;
8200               s = expr_end;
8201               continue;
8202
8203             case 'k':           /* cache code */
8204             case 'h':           /* prefx code */
8205               my_getExpression (&imm_expr, s);
8206               check_absolute_expr (ip, &imm_expr);
8207               if ((unsigned long) imm_expr.X_add_number > 31)
8208                 {
8209                   as_warn (_("Invalid value for `%s' (%lu)"),
8210                            ip->insn_mo->name,
8211                            (unsigned long) imm_expr.X_add_number);
8212                   imm_expr.X_add_number &= 0x1f;
8213                 }
8214               if (*args == 'k')
8215                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CACHE;
8216               else
8217                 ip->insn_opcode |= imm_expr.X_add_number << OP_SH_PREFX;
8218               imm_expr.X_op = O_absent;
8219               s = expr_end;
8220               continue;
8221
8222             case 'c':           /* break code */
8223               my_getExpression (&imm_expr, s);
8224               check_absolute_expr (ip, &imm_expr);
8225               if ((unsigned long) imm_expr.X_add_number > 1023)
8226                 {
8227                   as_warn (_("Illegal break code (%lu)"),
8228                            (unsigned long) imm_expr.X_add_number);
8229                   imm_expr.X_add_number &= OP_MASK_CODE;
8230                 }
8231               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE;
8232               imm_expr.X_op = O_absent;
8233               s = expr_end;
8234               continue;
8235
8236             case 'q':           /* lower break code */
8237               my_getExpression (&imm_expr, s);
8238               check_absolute_expr (ip, &imm_expr);
8239               if ((unsigned long) imm_expr.X_add_number > 1023)
8240                 {
8241                   as_warn (_("Illegal lower break code (%lu)"),
8242                            (unsigned long) imm_expr.X_add_number);
8243                   imm_expr.X_add_number &= OP_MASK_CODE2;
8244                 }
8245               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE2;
8246               imm_expr.X_op = O_absent;
8247               s = expr_end;
8248               continue;
8249
8250             case 'B':           /* 20-bit syscall/break code.  */
8251               my_getExpression (&imm_expr, s);
8252               check_absolute_expr (ip, &imm_expr);
8253               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
8254                 as_warn (_("Illegal 20-bit code (%lu)"),
8255                          (unsigned long) imm_expr.X_add_number);
8256               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE20;
8257               imm_expr.X_op = O_absent;
8258               s = expr_end;
8259               continue;
8260
8261             case 'C':           /* Coprocessor code */
8262               my_getExpression (&imm_expr, s);
8263               check_absolute_expr (ip, &imm_expr);
8264               if ((unsigned long) imm_expr.X_add_number >= (1 << 25))
8265                 {
8266                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
8267                            (unsigned long) imm_expr.X_add_number);
8268                   imm_expr.X_add_number &= ((1 << 25) - 1);
8269                 }
8270               ip->insn_opcode |= imm_expr.X_add_number;
8271               imm_expr.X_op = O_absent;
8272               s = expr_end;
8273               continue;
8274
8275             case 'J':           /* 19-bit wait code.  */
8276               my_getExpression (&imm_expr, s);
8277               check_absolute_expr (ip, &imm_expr);
8278               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
8279                 as_warn (_("Illegal 19-bit code (%lu)"),
8280                          (unsigned long) imm_expr.X_add_number);
8281               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_CODE19;
8282               imm_expr.X_op = O_absent;
8283               s = expr_end;
8284               continue;
8285
8286             case 'P':           /* Performance register */
8287               my_getExpression (&imm_expr, s);
8288               check_absolute_expr (ip, &imm_expr);
8289               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
8290                 {
8291                   as_warn (_("Invalid performance register (%lu)"),
8292                            (unsigned long) imm_expr.X_add_number);
8293                   imm_expr.X_add_number &= OP_MASK_PERFREG;
8294                 }
8295               ip->insn_opcode |= (imm_expr.X_add_number << OP_SH_PERFREG);
8296               imm_expr.X_op = O_absent;
8297               s = expr_end;
8298               continue;
8299
8300             case 'b':           /* base register */
8301             case 'd':           /* destination register */
8302             case 's':           /* source register */
8303             case 't':           /* target register */
8304             case 'r':           /* both target and source */
8305             case 'v':           /* both dest and source */
8306             case 'w':           /* both dest and target */
8307             case 'E':           /* coprocessor target register */
8308             case 'G':           /* coprocessor destination register */
8309             case 'K':           /* 'rdhwr' destination register */
8310             case 'x':           /* ignore register name */
8311             case 'z':           /* must be zero register */
8312             case 'U':           /* destination register (clo/clz).  */
8313               s_reset = s;
8314               if (s[0] == '$')
8315                 {
8316
8317                   if (ISDIGIT (s[1]))
8318                     {
8319                       ++s;
8320                       regno = 0;
8321                       do
8322                         {
8323                           regno *= 10;
8324                           regno += *s - '0';
8325                           ++s;
8326                         }
8327                       while (ISDIGIT (*s));
8328                       if (regno > 31)
8329                         as_bad (_("Invalid register number (%d)"), regno);
8330                     }
8331                   else if (*args == 'E' || *args == 'G' || *args == 'K')
8332                     goto notreg;
8333                   else
8334                     {
8335                       if (s[1] == 'r' && s[2] == 'a')
8336                         {
8337                           s += 3;
8338                           regno = RA;
8339                         }
8340                       else if (s[1] == 'f' && s[2] == 'p')
8341                         {
8342                           s += 3;
8343                           regno = FP;
8344                         }
8345                       else if (s[1] == 's' && s[2] == 'p')
8346                         {
8347                           s += 3;
8348                           regno = SP;
8349                         }
8350                       else if (s[1] == 'g' && s[2] == 'p')
8351                         {
8352                           s += 3;
8353                           regno = GP;
8354                         }
8355                       else if (s[1] == 'a' && s[2] == 't')
8356                         {
8357                           s += 3;
8358                           regno = AT;
8359                         }
8360                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
8361                         {
8362                           s += 4;
8363                           regno = KT0;
8364                         }
8365                       else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
8366                         {
8367                           s += 4;
8368                           regno = KT1;
8369                         }
8370                       else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
8371                         {
8372                           s += 5;
8373                           regno = ZERO;
8374                         }
8375                       else if (itbl_have_entries)
8376                         {
8377                           char *p, *n;
8378                           unsigned long r;
8379
8380                           p = s + 1;    /* advance past '$' */
8381                           n = itbl_get_field (&p);  /* n is name */
8382
8383                           /* See if this is a register defined in an
8384                              itbl entry.  */
8385                           if (itbl_get_reg_val (n, &r))
8386                             {
8387                               /* Get_field advances to the start of
8388                                  the next field, so we need to back
8389                                  rack to the end of the last field.  */
8390                               if (p)
8391                                 s = p - 1;
8392                               else
8393                                 s = strchr (s, '\0');
8394                               regno = r;
8395                             }
8396                           else
8397                             goto notreg;
8398                         }
8399                       else
8400                         goto notreg;
8401                     }
8402                   if (regno == AT
8403                       && ! mips_opts.noat
8404                       && *args != 'E'
8405                       && *args != 'G'
8406                       && *args != 'K')
8407                     as_warn (_("Used $at without \".set noat\""));
8408                   c = *args;
8409                   if (*s == ' ')
8410                     ++s;
8411                   if (args[1] != *s)
8412                     {
8413                       if (c == 'r' || c == 'v' || c == 'w')
8414                         {
8415                           regno = lastregno;
8416                           s = s_reset;
8417                           ++args;
8418                         }
8419                     }
8420                   /* 'z' only matches $0.  */
8421                   if (c == 'z' && regno != 0)
8422                     break;
8423
8424         /* Now that we have assembled one operand, we use the args string
8425          * to figure out where it goes in the instruction.  */
8426                   switch (c)
8427                     {
8428                     case 'r':
8429                     case 's':
8430                     case 'v':
8431                     case 'b':
8432                       ip->insn_opcode |= regno << OP_SH_RS;
8433                       break;
8434                     case 'd':
8435                     case 'G':
8436                     case 'K':
8437                       ip->insn_opcode |= regno << OP_SH_RD;
8438                       break;
8439                     case 'U':
8440                       ip->insn_opcode |= regno << OP_SH_RD;
8441                       ip->insn_opcode |= regno << OP_SH_RT;
8442                       break;
8443                     case 'w':
8444                     case 't':
8445                     case 'E':
8446                       ip->insn_opcode |= regno << OP_SH_RT;
8447                       break;
8448                     case 'x':
8449                       /* This case exists because on the r3000 trunc
8450                          expands into a macro which requires a gp
8451                          register.  On the r6000 or r4000 it is
8452                          assembled into a single instruction which
8453                          ignores the register.  Thus the insn version
8454                          is MIPS_ISA2 and uses 'x', and the macro
8455                          version is MIPS_ISA1 and uses 't'.  */
8456                       break;
8457                     case 'z':
8458                       /* This case is for the div instruction, which
8459                          acts differently if the destination argument
8460                          is $0.  This only matches $0, and is checked
8461                          outside the switch.  */
8462                       break;
8463                     case 'D':
8464                       /* Itbl operand; not yet implemented. FIXME ?? */
8465                       break;
8466                       /* What about all other operands like 'i', which
8467                          can be specified in the opcode table? */
8468                     }
8469                   lastregno = regno;
8470                   continue;
8471                 }
8472             notreg:
8473               switch (*args++)
8474                 {
8475                 case 'r':
8476                 case 'v':
8477                   ip->insn_opcode |= lastregno << OP_SH_RS;
8478                   continue;
8479                 case 'w':
8480                   ip->insn_opcode |= lastregno << OP_SH_RT;
8481                   continue;
8482                 }
8483               break;
8484
8485             case 'O':           /* MDMX alignment immediate constant.  */
8486               my_getExpression (&imm_expr, s);
8487               check_absolute_expr (ip, &imm_expr);
8488               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
8489                 {
8490                   as_warn ("Improper align amount (%ld), using low bits",
8491                            (long) imm_expr.X_add_number);
8492                   imm_expr.X_add_number &= OP_MASK_ALN;
8493                 }
8494               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
8495               imm_expr.X_op = O_absent;
8496               s = expr_end;
8497               continue;
8498
8499             case 'Q':           /* MDMX vector, element sel, or const.  */
8500               if (s[0] != '$')
8501                 {
8502                   /* MDMX Immediate.  */
8503                   my_getExpression (&imm_expr, s);
8504                   check_absolute_expr (ip, &imm_expr);
8505                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
8506                     {
8507                       as_warn (_("Invalid MDMX Immediate (%ld)"),
8508                                (long) imm_expr.X_add_number);
8509                       imm_expr.X_add_number &= OP_MASK_FT;
8510                     }
8511                   imm_expr.X_add_number &= OP_MASK_FT;
8512                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8513                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
8514                   else
8515                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
8516                   ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
8517                   imm_expr.X_op = O_absent;
8518                   s = expr_end;
8519                   continue;
8520                 }
8521               /* Not MDMX Immediate.  Fall through.  */
8522             case 'X':           /* MDMX destination register.  */
8523             case 'Y':           /* MDMX source register.  */
8524             case 'Z':           /* MDMX target register.  */
8525               is_mdmx = 1;
8526             case 'D':           /* floating point destination register */
8527             case 'S':           /* floating point source register */
8528             case 'T':           /* floating point target register */
8529             case 'R':           /* floating point source register */
8530             case 'V':
8531             case 'W':
8532               s_reset = s;
8533               /* Accept $fN for FP and MDMX register numbers, and in
8534                  addition accept $vN for MDMX register numbers.  */
8535               if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
8536                   || (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
8537                       && ISDIGIT (s[2])))
8538                 {
8539                   s += 2;
8540                   regno = 0;
8541                   do
8542                     {
8543                       regno *= 10;
8544                       regno += *s - '0';
8545                       ++s;
8546                     }
8547                   while (ISDIGIT (*s));
8548
8549                   if (regno > 31)
8550                     as_bad (_("Invalid float register number (%d)"), regno);
8551
8552                   if ((regno & 1) != 0
8553                       && HAVE_32BIT_FPRS
8554                       && ! (strcmp (str, "mtc1") == 0
8555                             || strcmp (str, "mfc1") == 0
8556                             || strcmp (str, "lwc1") == 0
8557                             || strcmp (str, "swc1") == 0
8558                             || strcmp (str, "l.s") == 0
8559                             || strcmp (str, "s.s") == 0))
8560                     as_warn (_("Float register should be even, was %d"),
8561                              regno);
8562
8563                   c = *args;
8564                   if (*s == ' ')
8565                     ++s;
8566                   if (args[1] != *s)
8567                     {
8568                       if (c == 'V' || c == 'W')
8569                         {
8570                           regno = lastregno;
8571                           s = s_reset;
8572                           ++args;
8573                         }
8574                     }
8575                   switch (c)
8576                     {
8577                     case 'D':
8578                     case 'X':
8579                       ip->insn_opcode |= regno << OP_SH_FD;
8580                       break;
8581                     case 'V':
8582                     case 'S':
8583                     case 'Y':
8584                       ip->insn_opcode |= regno << OP_SH_FS;
8585                       break;
8586                     case 'Q':
8587                       /* This is like 'Z', but also needs to fix the MDMX
8588                          vector/scalar select bits.  Note that the
8589                          scalar immediate case is handled above.  */
8590                       if (*s == '[')
8591                         {
8592                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
8593                           int max_el = (is_qh ? 3 : 7);
8594                           s++;
8595                           my_getExpression(&imm_expr, s);
8596                           check_absolute_expr (ip, &imm_expr);
8597                           s = expr_end;
8598                           if (imm_expr.X_add_number > max_el)
8599                             as_bad(_("Bad element selector %ld"),
8600                                    (long) imm_expr.X_add_number);
8601                           imm_expr.X_add_number &= max_el;
8602                           ip->insn_opcode |= (imm_expr.X_add_number
8603                                               << (OP_SH_VSEL +
8604                                                   (is_qh ? 2 : 1)));
8605                           imm_expr.X_op = O_absent;
8606                           if (*s != ']')
8607                             as_warn(_("Expecting ']' found '%s'"), s);
8608                           else
8609                             s++;
8610                         }
8611                       else
8612                         {
8613                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
8614                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
8615                                                 << OP_SH_VSEL);
8616                           else
8617                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
8618                                                 OP_SH_VSEL);
8619                         }
8620                       /* Fall through */
8621                     case 'W':
8622                     case 'T':
8623                     case 'Z':
8624                       ip->insn_opcode |= regno << OP_SH_FT;
8625                       break;
8626                     case 'R':
8627                       ip->insn_opcode |= regno << OP_SH_FR;
8628                       break;
8629                     }
8630                   lastregno = regno;
8631                   continue;
8632                 }
8633
8634               switch (*args++)
8635                 {
8636                 case 'V':
8637                   ip->insn_opcode |= lastregno << OP_SH_FS;
8638                   continue;
8639                 case 'W':
8640                   ip->insn_opcode |= lastregno << OP_SH_FT;
8641                   continue;
8642                 }
8643               break;
8644
8645             case 'I':
8646               my_getExpression (&imm_expr, s);
8647               if (imm_expr.X_op != O_big
8648                   && imm_expr.X_op != O_constant)
8649                 insn_error = _("absolute expression required");
8650               normalize_constant_expr (&imm_expr);
8651               s = expr_end;
8652               continue;
8653
8654             case 'A':
8655               my_getExpression (&offset_expr, s);
8656               *imm_reloc = BFD_RELOC_32;
8657               s = expr_end;
8658               continue;
8659
8660             case 'F':
8661             case 'L':
8662             case 'f':
8663             case 'l':
8664               {
8665                 int f64;
8666                 int using_gprs;
8667                 char *save_in;
8668                 char *err;
8669                 unsigned char temp[8];
8670                 int len;
8671                 unsigned int length;
8672                 segT seg;
8673                 subsegT subseg;
8674                 char *p;
8675
8676                 /* These only appear as the last operand in an
8677                    instruction, and every instruction that accepts
8678                    them in any variant accepts them in all variants.
8679                    This means we don't have to worry about backing out
8680                    any changes if the instruction does not match.
8681
8682                    The difference between them is the size of the
8683                    floating point constant and where it goes.  For 'F'
8684                    and 'L' the constant is 64 bits; for 'f' and 'l' it
8685                    is 32 bits.  Where the constant is placed is based
8686                    on how the MIPS assembler does things:
8687                     F -- .rdata
8688                     L -- .lit8
8689                     f -- immediate value
8690                     l -- .lit4
8691
8692                     The .lit4 and .lit8 sections are only used if
8693                     permitted by the -G argument.
8694
8695                     The code below needs to know whether the target register
8696                     is 32 or 64 bits wide.  It relies on the fact 'f' and
8697                     'F' are used with GPR-based instructions and 'l' and
8698                     'L' are used with FPR-based instructions.  */
8699
8700                 f64 = *args == 'F' || *args == 'L';
8701                 using_gprs = *args == 'F' || *args == 'f';
8702
8703                 save_in = input_line_pointer;
8704                 input_line_pointer = s;
8705                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
8706                 length = len;
8707                 s = input_line_pointer;
8708                 input_line_pointer = save_in;
8709                 if (err != NULL && *err != '\0')
8710                   {
8711                     as_bad (_("Bad floating point constant: %s"), err);
8712                     memset (temp, '\0', sizeof temp);
8713                     length = f64 ? 8 : 4;
8714                   }
8715
8716                 assert (length == (unsigned) (f64 ? 8 : 4));
8717
8718                 if (*args == 'f'
8719                     || (*args == 'l'
8720                         && (g_switch_value < 4
8721                             || (temp[0] == 0 && temp[1] == 0)
8722                             || (temp[2] == 0 && temp[3] == 0))))
8723                   {
8724                     imm_expr.X_op = O_constant;
8725                     if (! target_big_endian)
8726                       imm_expr.X_add_number = bfd_getl32 (temp);
8727                     else
8728                       imm_expr.X_add_number = bfd_getb32 (temp);
8729                   }
8730                 else if (length > 4
8731                          && ! mips_disable_float_construction
8732                          /* Constants can only be constructed in GPRs and
8733                             copied to FPRs if the GPRs are at least as wide
8734                             as the FPRs.  Force the constant into memory if
8735                             we are using 64-bit FPRs but the GPRs are only
8736                             32 bits wide.  */
8737                          && (using_gprs
8738                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
8739                          && ((temp[0] == 0 && temp[1] == 0)
8740                              || (temp[2] == 0 && temp[3] == 0))
8741                          && ((temp[4] == 0 && temp[5] == 0)
8742                              || (temp[6] == 0 && temp[7] == 0)))
8743                   {
8744                     /* The value is simple enough to load with a couple of
8745                        instructions.  If using 32-bit registers, set
8746                        imm_expr to the high order 32 bits and offset_expr to
8747                        the low order 32 bits.  Otherwise, set imm_expr to
8748                        the entire 64 bit constant.  */
8749                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
8750                       {
8751                         imm_expr.X_op = O_constant;
8752                         offset_expr.X_op = O_constant;
8753                         if (! target_big_endian)
8754                           {
8755                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
8756                             offset_expr.X_add_number = bfd_getl32 (temp);
8757                           }
8758                         else
8759                           {
8760                             imm_expr.X_add_number = bfd_getb32 (temp);
8761                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
8762                           }
8763                         if (offset_expr.X_add_number == 0)
8764                           offset_expr.X_op = O_absent;
8765                       }
8766                     else if (sizeof (imm_expr.X_add_number) > 4)
8767                       {
8768                         imm_expr.X_op = O_constant;
8769                         if (! target_big_endian)
8770                           imm_expr.X_add_number = bfd_getl64 (temp);
8771                         else
8772                           imm_expr.X_add_number = bfd_getb64 (temp);
8773                       }
8774                     else
8775                       {
8776                         imm_expr.X_op = O_big;
8777                         imm_expr.X_add_number = 4;
8778                         if (! target_big_endian)
8779                           {
8780                             generic_bignum[0] = bfd_getl16 (temp);
8781                             generic_bignum[1] = bfd_getl16 (temp + 2);
8782                             generic_bignum[2] = bfd_getl16 (temp + 4);
8783                             generic_bignum[3] = bfd_getl16 (temp + 6);
8784                           }
8785                         else
8786                           {
8787                             generic_bignum[0] = bfd_getb16 (temp + 6);
8788                             generic_bignum[1] = bfd_getb16 (temp + 4);
8789                             generic_bignum[2] = bfd_getb16 (temp + 2);
8790                             generic_bignum[3] = bfd_getb16 (temp);
8791                           }
8792                       }
8793                   }
8794                 else
8795                   {
8796                     const char *newname;
8797                     segT new_seg;
8798
8799                     /* Switch to the right section.  */
8800                     seg = now_seg;
8801                     subseg = now_subseg;
8802                     switch (*args)
8803                       {
8804                       default: /* unused default case avoids warnings.  */
8805                       case 'L':
8806                         newname = RDATA_SECTION_NAME;
8807                         if (g_switch_value >= 8)
8808                           newname = ".lit8";
8809                         break;
8810                       case 'F':
8811                         newname = RDATA_SECTION_NAME;
8812                         break;
8813                       case 'l':
8814                         assert (g_switch_value >= 4);
8815                         newname = ".lit4";
8816                         break;
8817                       }
8818                     new_seg = subseg_new (newname, (subsegT) 0);
8819                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
8820                       bfd_set_section_flags (stdoutput, new_seg,
8821                                              (SEC_ALLOC
8822                                               | SEC_LOAD
8823                                               | SEC_READONLY
8824                                               | SEC_DATA));
8825                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
8826                     if (OUTPUT_FLAVOR == bfd_target_elf_flavour
8827                         && strcmp (TARGET_OS, "elf") != 0)
8828                       record_alignment (new_seg, 4);
8829                     else
8830                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
8831                     if (seg == now_seg)
8832                       as_bad (_("Can't use floating point insn in this section"));
8833
8834                     /* Set the argument to the current address in the
8835                        section.  */
8836                     offset_expr.X_op = O_symbol;
8837                     offset_expr.X_add_symbol =
8838                       symbol_new ("L0\001", now_seg,
8839                                   (valueT) frag_now_fix (), frag_now);
8840                     offset_expr.X_add_number = 0;
8841
8842                     /* Put the floating point number into the section.  */
8843                     p = frag_more ((int) length);
8844                     memcpy (p, temp, length);
8845
8846                     /* Switch back to the original section.  */
8847                     subseg_set (seg, subseg);
8848                   }
8849               }
8850               continue;
8851
8852             case 'i':           /* 16 bit unsigned immediate */
8853             case 'j':           /* 16 bit signed immediate */
8854               *imm_reloc = BFD_RELOC_LO16;
8855               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
8856                 {
8857                   int more;
8858                   offsetT minval, maxval;
8859
8860                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
8861                           && strcmp (insn->name, insn[1].name) == 0);
8862
8863                   /* If the expression was written as an unsigned number,
8864                      only treat it as signed if there are no more
8865                      alternatives.  */
8866                   if (more
8867                       && *args == 'j'
8868                       && sizeof (imm_expr.X_add_number) <= 4
8869                       && imm_expr.X_op == O_constant
8870                       && imm_expr.X_add_number < 0
8871                       && imm_expr.X_unsigned
8872                       && HAVE_64BIT_GPRS)
8873                     break;
8874
8875                   /* For compatibility with older assemblers, we accept
8876                      0x8000-0xffff as signed 16-bit numbers when only
8877                      signed numbers are allowed.  */
8878                   if (*args == 'i')
8879                     minval = 0, maxval = 0xffff;
8880                   else if (more)
8881                     minval = -0x8000, maxval = 0x7fff;
8882                   else
8883                     minval = -0x8000, maxval = 0xffff;
8884
8885                   if (imm_expr.X_op != O_constant
8886                       || imm_expr.X_add_number < minval
8887                       || imm_expr.X_add_number > maxval)
8888                     {
8889                       if (more)
8890                         break;
8891                       if (imm_expr.X_op == O_constant
8892                           || imm_expr.X_op == O_big)
8893                         as_bad (_("expression out of range"));
8894                     }
8895                 }
8896               s = expr_end;
8897               continue;
8898
8899             case 'o':           /* 16 bit offset */
8900               /* Check whether there is only a single bracketed expression
8901                  left.  If so, it must be the base register and the
8902                  constant must be zero.  */
8903               if (*s == '(' && strchr (s + 1, '(') == 0)
8904                 {
8905                   offset_expr.X_op = O_constant;
8906                   offset_expr.X_add_number = 0;
8907                   continue;
8908                 }
8909
8910               /* If this value won't fit into a 16 bit offset, then go
8911                  find a macro that will generate the 32 bit offset
8912                  code pattern.  */
8913               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
8914                   && (offset_expr.X_op != O_constant
8915                       || offset_expr.X_add_number >= 0x8000
8916                       || offset_expr.X_add_number < -0x8000))
8917                 break;
8918
8919               s = expr_end;
8920               continue;
8921
8922             case 'p':           /* pc relative offset */
8923               *offset_reloc = BFD_RELOC_16_PCREL_S2;
8924               my_getExpression (&offset_expr, s);
8925               s = expr_end;
8926               continue;
8927
8928             case 'u':           /* upper 16 bits */
8929               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
8930                   && imm_expr.X_op == O_constant
8931                   && (imm_expr.X_add_number < 0
8932                       || imm_expr.X_add_number >= 0x10000))
8933                 as_bad (_("lui expression not in range 0..65535"));
8934               s = expr_end;
8935               continue;
8936
8937             case 'a':           /* 26 bit address */
8938               my_getExpression (&offset_expr, s);
8939               s = expr_end;
8940               *offset_reloc = BFD_RELOC_MIPS_JMP;
8941               continue;
8942
8943             case 'N':           /* 3 bit branch condition code */
8944             case 'M':           /* 3 bit compare condition code */
8945               if (strncmp (s, "$fcc", 4) != 0)
8946                 break;
8947               s += 4;
8948               regno = 0;
8949               do
8950                 {
8951                   regno *= 10;
8952                   regno += *s - '0';
8953                   ++s;
8954                 }
8955               while (ISDIGIT (*s));
8956               if (regno > 7)
8957                 as_bad (_("Invalid condition code register $fcc%d"), regno);
8958               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
8959                    || strcmp(str + strlen(str) - 5, "any2f") == 0
8960                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
8961                   && (regno & 1) != 0)
8962                 as_warn(_("Condition code register should be even for %s, was %d"),
8963                         str, regno);
8964               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
8965                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
8966                   && (regno & 3) != 0)
8967                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
8968                         str, regno);
8969               if (*args == 'N')
8970                 ip->insn_opcode |= regno << OP_SH_BCC;
8971               else
8972                 ip->insn_opcode |= regno << OP_SH_CCC;
8973               continue;
8974
8975             case 'H':
8976               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
8977                 s += 2;
8978               if (ISDIGIT (*s))
8979                 {
8980                   c = 0;
8981                   do
8982                     {
8983                       c *= 10;
8984                       c += *s - '0';
8985                       ++s;
8986                     }
8987                   while (ISDIGIT (*s));
8988                 }
8989               else
8990                 c = 8; /* Invalid sel value.  */
8991
8992               if (c > 7)
8993                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
8994               ip->insn_opcode |= c;
8995               continue;
8996
8997             case 'e':
8998               /* Must be at least one digit.  */
8999               my_getExpression (&imm_expr, s);
9000               check_absolute_expr (ip, &imm_expr);
9001
9002               if ((unsigned long) imm_expr.X_add_number
9003                   > (unsigned long) OP_MASK_VECBYTE)
9004                 {
9005                   as_bad (_("bad byte vector index (%ld)"),
9006                            (long) imm_expr.X_add_number);
9007                   imm_expr.X_add_number = 0;
9008                 }
9009
9010               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECBYTE;
9011               imm_expr.X_op = O_absent;
9012               s = expr_end;
9013               continue;
9014
9015             case '%':
9016               my_getExpression (&imm_expr, s);
9017               check_absolute_expr (ip, &imm_expr);
9018
9019               if ((unsigned long) imm_expr.X_add_number
9020                   > (unsigned long) OP_MASK_VECALIGN)
9021                 {
9022                   as_bad (_("bad byte vector index (%ld)"),
9023                            (long) imm_expr.X_add_number);
9024                   imm_expr.X_add_number = 0;
9025                 }
9026
9027               ip->insn_opcode |= imm_expr.X_add_number << OP_SH_VECALIGN;
9028               imm_expr.X_op = O_absent;
9029               s = expr_end;
9030               continue;
9031
9032             default:
9033               as_bad (_("bad char = '%c'\n"), *args);
9034               internalError ();
9035             }
9036           break;
9037         }
9038       /* Args don't match.  */
9039       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9040           !strcmp (insn->name, insn[1].name))
9041         {
9042           ++insn;
9043           s = argsStart;
9044           insn_error = _("illegal operands");
9045           continue;
9046         }
9047       if (save_c)
9048         *(--s) = save_c;
9049       insn_error = _("illegal operands");
9050       return;
9051     }
9052 }
9053
9054 /* This routine assembles an instruction into its binary format when
9055    assembling for the mips16.  As a side effect, it sets one of the
9056    global variables imm_reloc or offset_reloc to the type of
9057    relocation to do if one of the operands is an address expression.
9058    It also sets mips16_small and mips16_ext if the user explicitly
9059    requested a small or extended instruction.  */
9060
9061 static void
9062 mips16_ip (char *str, struct mips_cl_insn *ip)
9063 {
9064   char *s;
9065   const char *args;
9066   struct mips_opcode *insn;
9067   char *argsstart;
9068   unsigned int regno;
9069   unsigned int lastregno = 0;
9070   char *s_reset;
9071
9072   insn_error = NULL;
9073
9074   mips16_small = FALSE;
9075   mips16_ext = FALSE;
9076
9077   for (s = str; ISLOWER (*s); ++s)
9078     ;
9079   switch (*s)
9080     {
9081     case '\0':
9082       break;
9083
9084     case ' ':
9085       *s++ = '\0';
9086       break;
9087
9088     case '.':
9089       if (s[1] == 't' && s[2] == ' ')
9090         {
9091           *s = '\0';
9092           mips16_small = TRUE;
9093           s += 3;
9094           break;
9095         }
9096       else if (s[1] == 'e' && s[2] == ' ')
9097         {
9098           *s = '\0';
9099           mips16_ext = TRUE;
9100           s += 3;
9101           break;
9102         }
9103       /* Fall through.  */
9104     default:
9105       insn_error = _("unknown opcode");
9106       return;
9107     }
9108
9109   if (mips_opts.noautoextend && ! mips16_ext)
9110     mips16_small = TRUE;
9111
9112   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9113     {
9114       insn_error = _("unrecognized opcode");
9115       return;
9116     }
9117
9118   argsstart = s;
9119   for (;;)
9120     {
9121       assert (strcmp (insn->name, str) == 0);
9122
9123       ip->insn_mo = insn;
9124       ip->insn_opcode = insn->match;
9125       ip->use_extend = FALSE;
9126       imm_expr.X_op = O_absent;
9127       imm_reloc[0] = BFD_RELOC_UNUSED;
9128       imm_reloc[1] = BFD_RELOC_UNUSED;
9129       imm_reloc[2] = BFD_RELOC_UNUSED;
9130       imm2_expr.X_op = O_absent;
9131       offset_expr.X_op = O_absent;
9132       offset_reloc[0] = BFD_RELOC_UNUSED;
9133       offset_reloc[1] = BFD_RELOC_UNUSED;
9134       offset_reloc[2] = BFD_RELOC_UNUSED;
9135       for (args = insn->args; 1; ++args)
9136         {
9137           int c;
9138
9139           if (*s == ' ')
9140             ++s;
9141
9142           /* In this switch statement we call break if we did not find
9143              a match, continue if we did find a match, or return if we
9144              are done.  */
9145
9146           c = *args;
9147           switch (c)
9148             {
9149             case '\0':
9150               if (*s == '\0')
9151                 {
9152                   /* Stuff the immediate value in now, if we can.  */
9153                   if (imm_expr.X_op == O_constant
9154                       && *imm_reloc > BFD_RELOC_UNUSED
9155                       && insn->pinfo != INSN_MACRO)
9156                     {
9157                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9158                                     imm_expr.X_add_number, TRUE, mips16_small,
9159                                     mips16_ext, &ip->insn_opcode,
9160                                     &ip->use_extend, &ip->extend);
9161                       imm_expr.X_op = O_absent;
9162                       *imm_reloc = BFD_RELOC_UNUSED;
9163                     }
9164
9165                   return;
9166                 }
9167               break;
9168
9169             case ',':
9170               if (*s++ == c)
9171                 continue;
9172               s--;
9173               switch (*++args)
9174                 {
9175                 case 'v':
9176                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9177                   continue;
9178                 case 'w':
9179                   ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9180                   continue;
9181                 }
9182               break;
9183
9184             case '(':
9185             case ')':
9186               if (*s++ == c)
9187                 continue;
9188               break;
9189
9190             case 'v':
9191             case 'w':
9192               if (s[0] != '$')
9193                 {
9194                   if (c == 'v')
9195                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RX;
9196                   else
9197                     ip->insn_opcode |= lastregno << MIPS16OP_SH_RY;
9198                   ++args;
9199                   continue;
9200                 }
9201               /* Fall through.  */
9202             case 'x':
9203             case 'y':
9204             case 'z':
9205             case 'Z':
9206             case '0':
9207             case 'S':
9208             case 'R':
9209             case 'X':
9210             case 'Y':
9211               if (s[0] != '$')
9212                 break;
9213               s_reset = s;
9214               if (ISDIGIT (s[1]))
9215                 {
9216                   ++s;
9217                   regno = 0;
9218                   do
9219                     {
9220                       regno *= 10;
9221                       regno += *s - '0';
9222                       ++s;
9223                     }
9224                   while (ISDIGIT (*s));
9225                   if (regno > 31)
9226                     {
9227                       as_bad (_("invalid register number (%d)"), regno);
9228                       regno = 2;
9229                     }
9230                 }
9231               else
9232                 {
9233                   if (s[1] == 'r' && s[2] == 'a')
9234                     {
9235                       s += 3;
9236                       regno = RA;
9237                     }
9238                   else if (s[1] == 'f' && s[2] == 'p')
9239                     {
9240                       s += 3;
9241                       regno = FP;
9242                     }
9243                   else if (s[1] == 's' && s[2] == 'p')
9244                     {
9245                       s += 3;
9246                       regno = SP;
9247                     }
9248                   else if (s[1] == 'g' && s[2] == 'p')
9249                     {
9250                       s += 3;
9251                       regno = GP;
9252                     }
9253                   else if (s[1] == 'a' && s[2] == 't')
9254                     {
9255                       s += 3;
9256                       regno = AT;
9257                     }
9258                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '0')
9259                     {
9260                       s += 4;
9261                       regno = KT0;
9262                     }
9263                   else if (s[1] == 'k' && s[2] == 't' && s[3] == '1')
9264                     {
9265                       s += 4;
9266                       regno = KT1;
9267                     }
9268                   else if (s[1] == 'z' && s[2] == 'e' && s[3] == 'r' && s[4] == 'o')
9269                     {
9270                       s += 5;
9271                       regno = ZERO;
9272                     }
9273                   else
9274                     break;
9275                 }
9276
9277               if (*s == ' ')
9278                 ++s;
9279               if (args[1] != *s)
9280                 {
9281                   if (c == 'v' || c == 'w')
9282                     {
9283                       regno = mips16_to_32_reg_map[lastregno];
9284                       s = s_reset;
9285                       ++args;
9286                     }
9287                 }
9288
9289               switch (c)
9290                 {
9291                 case 'x':
9292                 case 'y':
9293                 case 'z':
9294                 case 'v':
9295                 case 'w':
9296                 case 'Z':
9297                   regno = mips32_to_16_reg_map[regno];
9298                   break;
9299
9300                 case '0':
9301                   if (regno != 0)
9302                     regno = ILLEGAL_REG;
9303                   break;
9304
9305                 case 'S':
9306                   if (regno != SP)
9307                     regno = ILLEGAL_REG;
9308                   break;
9309
9310                 case 'R':
9311                   if (regno != RA)
9312                     regno = ILLEGAL_REG;
9313                   break;
9314
9315                 case 'X':
9316                 case 'Y':
9317                   if (regno == AT && ! mips_opts.noat)
9318                     as_warn (_("used $at without \".set noat\""));
9319                   break;
9320
9321                 default:
9322                   internalError ();
9323                 }
9324
9325               if (regno == ILLEGAL_REG)
9326                 break;
9327
9328               switch (c)
9329                 {
9330                 case 'x':
9331                 case 'v':
9332                   ip->insn_opcode |= regno << MIPS16OP_SH_RX;
9333                   break;
9334                 case 'y':
9335                 case 'w':
9336                   ip->insn_opcode |= regno << MIPS16OP_SH_RY;
9337                   break;
9338                 case 'z':
9339                   ip->insn_opcode |= regno << MIPS16OP_SH_RZ;
9340                   break;
9341                 case 'Z':
9342                   ip->insn_opcode |= regno << MIPS16OP_SH_MOVE32Z;
9343                 case '0':
9344                 case 'S':
9345                 case 'R':
9346                   break;
9347                 case 'X':
9348                   ip->insn_opcode |= regno << MIPS16OP_SH_REGR32;
9349                   break;
9350                 case 'Y':
9351                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
9352                   ip->insn_opcode |= regno << MIPS16OP_SH_REG32R;
9353                   break;
9354                 default:
9355                   internalError ();
9356                 }
9357
9358               lastregno = regno;
9359               continue;
9360
9361             case 'P':
9362               if (strncmp (s, "$pc", 3) == 0)
9363                 {
9364                   s += 3;
9365                   continue;
9366                 }
9367               break;
9368
9369             case '<':
9370             case '>':
9371             case '[':
9372             case ']':
9373             case '4':
9374             case '5':
9375             case 'H':
9376             case 'W':
9377             case 'D':
9378             case 'j':
9379             case '8':
9380             case 'V':
9381             case 'C':
9382             case 'U':
9383             case 'k':
9384             case 'K':
9385               if (s[0] == '%'
9386                   && strncmp (s + 1, "gprel(", sizeof "gprel(" - 1) == 0)
9387                 {
9388                   /* This is %gprel(SYMBOL).  We need to read SYMBOL,
9389                      and generate the appropriate reloc.  If the text
9390                      inside %gprel is not a symbol name with an
9391                      optional offset, then we generate a normal reloc
9392                      and will probably fail later.  */
9393                   my_getExpression (&imm_expr, s + sizeof "%gprel" - 1);
9394                   if (imm_expr.X_op == O_symbol)
9395                     {
9396                       mips16_ext = TRUE;
9397                       *imm_reloc = BFD_RELOC_MIPS16_GPREL;
9398                       s = expr_end;
9399                       ip->use_extend = TRUE;
9400                       ip->extend = 0;
9401                       continue;
9402                     }
9403                 }
9404               else
9405                 {
9406                   /* Just pick up a normal expression.  */
9407                   my_getExpression (&imm_expr, s);
9408                 }
9409
9410               if (imm_expr.X_op == O_register)
9411                 {
9412                   /* What we thought was an expression turned out to
9413                      be a register.  */
9414
9415                   if (s[0] == '(' && args[1] == '(')
9416                     {
9417                       /* It looks like the expression was omitted
9418                          before a register indirection, which means
9419                          that the expression is implicitly zero.  We
9420                          still set up imm_expr, so that we handle
9421                          explicit extensions correctly.  */
9422                       imm_expr.X_op = O_constant;
9423                       imm_expr.X_add_number = 0;
9424                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9425                       continue;
9426                     }
9427
9428                   break;
9429                 }
9430
9431               /* We need to relax this instruction.  */
9432               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
9433               s = expr_end;
9434               continue;
9435
9436             case 'p':
9437             case 'q':
9438             case 'A':
9439             case 'B':
9440             case 'E':
9441               /* We use offset_reloc rather than imm_reloc for the PC
9442                  relative operands.  This lets macros with both
9443                  immediate and address operands work correctly.  */
9444               my_getExpression (&offset_expr, s);
9445
9446               if (offset_expr.X_op == O_register)
9447                 break;
9448
9449               /* We need to relax this instruction.  */
9450               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
9451               s = expr_end;
9452               continue;
9453
9454             case '6':           /* break code */
9455               my_getExpression (&imm_expr, s);
9456               check_absolute_expr (ip, &imm_expr);
9457               if ((unsigned long) imm_expr.X_add_number > 63)
9458                 {
9459                   as_warn (_("Invalid value for `%s' (%lu)"),
9460                            ip->insn_mo->name,
9461                            (unsigned long) imm_expr.X_add_number);
9462                   imm_expr.X_add_number &= 0x3f;
9463                 }
9464               ip->insn_opcode |= imm_expr.X_add_number << MIPS16OP_SH_IMM6;
9465               imm_expr.X_op = O_absent;
9466               s = expr_end;
9467               continue;
9468
9469             case 'a':           /* 26 bit address */
9470               my_getExpression (&offset_expr, s);
9471               s = expr_end;
9472               *offset_reloc = BFD_RELOC_MIPS16_JMP;
9473               ip->insn_opcode <<= 16;
9474               continue;
9475
9476             case 'l':           /* register list for entry macro */
9477             case 'L':           /* register list for exit macro */
9478               {
9479                 int mask;
9480
9481                 if (c == 'l')
9482                   mask = 0;
9483                 else
9484                   mask = 7 << 3;
9485                 while (*s != '\0')
9486                   {
9487                     int freg, reg1, reg2;
9488
9489                     while (*s == ' ' || *s == ',')
9490                       ++s;
9491                     if (*s != '$')
9492                       {
9493                         as_bad (_("can't parse register list"));
9494                         break;
9495                       }
9496                     ++s;
9497                     if (*s != 'f')
9498                       freg = 0;
9499                     else
9500                       {
9501                         freg = 1;
9502                         ++s;
9503                       }
9504                     reg1 = 0;
9505                     while (ISDIGIT (*s))
9506                       {
9507                         reg1 *= 10;
9508                         reg1 += *s - '0';
9509                         ++s;
9510                       }
9511                     if (*s == ' ')
9512                       ++s;
9513                     if (*s != '-')
9514                       reg2 = reg1;
9515                     else
9516                       {
9517                         ++s;
9518                         if (*s != '$')
9519                           break;
9520                         ++s;
9521                         if (freg)
9522                           {
9523                             if (*s == 'f')
9524                               ++s;
9525                             else
9526                               {
9527                                 as_bad (_("invalid register list"));
9528                                 break;
9529                               }
9530                           }
9531                         reg2 = 0;
9532                         while (ISDIGIT (*s))
9533                           {
9534                             reg2 *= 10;
9535                             reg2 += *s - '0';
9536                             ++s;
9537                           }
9538                       }
9539                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
9540                       {
9541                         mask &= ~ (7 << 3);
9542                         mask |= 5 << 3;
9543                       }
9544                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
9545                       {
9546                         mask &= ~ (7 << 3);
9547                         mask |= 6 << 3;
9548                       }
9549                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
9550                       mask |= (reg2 - 3) << 3;
9551                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
9552                       mask |= (reg2 - 15) << 1;
9553                     else if (reg1 == RA && reg2 == RA)
9554                       mask |= 1;
9555                     else
9556                       {
9557                         as_bad (_("invalid register list"));
9558                         break;
9559                       }
9560                   }
9561                 /* The mask is filled in in the opcode table for the
9562                    benefit of the disassembler.  We remove it before
9563                    applying the actual mask.  */
9564                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
9565                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
9566               }
9567             continue;
9568
9569             case 'e':           /* extend code */
9570               my_getExpression (&imm_expr, s);
9571               check_absolute_expr (ip, &imm_expr);
9572               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
9573                 {
9574                   as_warn (_("Invalid value for `%s' (%lu)"),
9575                            ip->insn_mo->name,
9576                            (unsigned long) imm_expr.X_add_number);
9577                   imm_expr.X_add_number &= 0x7ff;
9578                 }
9579               ip->insn_opcode |= imm_expr.X_add_number;
9580               imm_expr.X_op = O_absent;
9581               s = expr_end;
9582               continue;
9583
9584             default:
9585               internalError ();
9586             }
9587           break;
9588         }
9589
9590       /* Args don't match.  */
9591       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
9592           strcmp (insn->name, insn[1].name) == 0)
9593         {
9594           ++insn;
9595           s = argsstart;
9596           continue;
9597         }
9598
9599       insn_error = _("illegal operands");
9600
9601       return;
9602     }
9603 }
9604
9605 /* This structure holds information we know about a mips16 immediate
9606    argument type.  */
9607
9608 struct mips16_immed_operand
9609 {
9610   /* The type code used in the argument string in the opcode table.  */
9611   int type;
9612   /* The number of bits in the short form of the opcode.  */
9613   int nbits;
9614   /* The number of bits in the extended form of the opcode.  */
9615   int extbits;
9616   /* The amount by which the short form is shifted when it is used;
9617      for example, the sw instruction has a shift count of 2.  */
9618   int shift;
9619   /* The amount by which the short form is shifted when it is stored
9620      into the instruction code.  */
9621   int op_shift;
9622   /* Non-zero if the short form is unsigned.  */
9623   int unsp;
9624   /* Non-zero if the extended form is unsigned.  */
9625   int extu;
9626   /* Non-zero if the value is PC relative.  */
9627   int pcrel;
9628 };
9629
9630 /* The mips16 immediate operand types.  */
9631
9632 static const struct mips16_immed_operand mips16_immed_operands[] =
9633 {
9634   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9635   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9636   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
9637   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
9638   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
9639   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
9640   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
9641   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
9642   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
9643   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
9644   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
9645   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
9646   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
9647   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
9648   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
9649   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
9650   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9651   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
9652   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
9653   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
9654   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
9655 };
9656
9657 #define MIPS16_NUM_IMMED \
9658   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
9659
9660 /* Handle a mips16 instruction with an immediate value.  This or's the
9661    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
9662    whether an extended value is needed; if one is needed, it sets
9663    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
9664    If SMALL is true, an unextended opcode was explicitly requested.
9665    If EXT is true, an extended opcode was explicitly requested.  If
9666    WARN is true, warn if EXT does not match reality.  */
9667
9668 static void
9669 mips16_immed (char *file, unsigned int line, int type, offsetT val,
9670               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
9671               unsigned long *insn, bfd_boolean *use_extend,
9672               unsigned short *extend)
9673 {
9674   register const struct mips16_immed_operand *op;
9675   int mintiny, maxtiny;
9676   bfd_boolean needext;
9677
9678   op = mips16_immed_operands;
9679   while (op->type != type)
9680     {
9681       ++op;
9682       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
9683     }
9684
9685   if (op->unsp)
9686     {
9687       if (type == '<' || type == '>' || type == '[' || type == ']')
9688         {
9689           mintiny = 1;
9690           maxtiny = 1 << op->nbits;
9691         }
9692       else
9693         {
9694           mintiny = 0;
9695           maxtiny = (1 << op->nbits) - 1;
9696         }
9697     }
9698   else
9699     {
9700       mintiny = - (1 << (op->nbits - 1));
9701       maxtiny = (1 << (op->nbits - 1)) - 1;
9702     }
9703
9704   /* Branch offsets have an implicit 0 in the lowest bit.  */
9705   if (type == 'p' || type == 'q')
9706     val /= 2;
9707
9708   if ((val & ((1 << op->shift) - 1)) != 0
9709       || val < (mintiny << op->shift)
9710       || val > (maxtiny << op->shift))
9711     needext = TRUE;
9712   else
9713     needext = FALSE;
9714
9715   if (warn && ext && ! needext)
9716     as_warn_where (file, line,
9717                    _("extended operand requested but not required"));
9718   if (small && needext)
9719     as_bad_where (file, line, _("invalid unextended operand value"));
9720
9721   if (small || (! ext && ! needext))
9722     {
9723       int insnval;
9724
9725       *use_extend = FALSE;
9726       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
9727       insnval <<= op->op_shift;
9728       *insn |= insnval;
9729     }
9730   else
9731     {
9732       long minext, maxext;
9733       int extval;
9734
9735       if (op->extu)
9736         {
9737           minext = 0;
9738           maxext = (1 << op->extbits) - 1;
9739         }
9740       else
9741         {
9742           minext = - (1 << (op->extbits - 1));
9743           maxext = (1 << (op->extbits - 1)) - 1;
9744         }
9745       if (val < minext || val > maxext)
9746         as_bad_where (file, line,
9747                       _("operand value out of range for instruction"));
9748
9749       *use_extend = TRUE;
9750       if (op->extbits == 16)
9751         {
9752           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
9753           val &= 0x1f;
9754         }
9755       else if (op->extbits == 15)
9756         {
9757           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
9758           val &= 0xf;
9759         }
9760       else
9761         {
9762           extval = ((val & 0x1f) << 6) | (val & 0x20);
9763           val = 0;
9764         }
9765
9766       *extend = (unsigned short) extval;
9767       *insn |= val;
9768     }
9769 }
9770 \f
9771 static const struct percent_op_match
9772 {
9773   const char *str;
9774   bfd_reloc_code_real_type reloc;
9775 } percent_op[] =
9776 {
9777   {"%lo", BFD_RELOC_LO16},
9778 #ifdef OBJ_ELF
9779   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
9780   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
9781   {"%call16", BFD_RELOC_MIPS_CALL16},
9782   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
9783   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
9784   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
9785   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
9786   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
9787   {"%got", BFD_RELOC_MIPS_GOT16},
9788   {"%gp_rel", BFD_RELOC_GPREL16},
9789   {"%half", BFD_RELOC_16},
9790   {"%highest", BFD_RELOC_MIPS_HIGHEST},
9791   {"%higher", BFD_RELOC_MIPS_HIGHER},
9792   {"%neg", BFD_RELOC_MIPS_SUB},
9793 #endif
9794   {"%hi", BFD_RELOC_HI16_S}
9795 };
9796
9797
9798 /* Return true if *STR points to a relocation operator.  When returning true,
9799    move *STR over the operator and store its relocation code in *RELOC.
9800    Leave both *STR and *RELOC alone when returning false.  */
9801
9802 static bfd_boolean
9803 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
9804 {
9805   size_t i;
9806
9807   for (i = 0; i < ARRAY_SIZE (percent_op); i++)
9808     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
9809       {
9810         *str += strlen (percent_op[i].str);
9811         *reloc = percent_op[i].reloc;
9812
9813         /* Check whether the output BFD supports this relocation.
9814            If not, issue an error and fall back on something safe.  */
9815         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
9816           {
9817             as_bad ("relocation %s isn't supported by the current ABI",
9818                     percent_op[i].str);
9819             *reloc = BFD_RELOC_UNUSED;
9820           }
9821         return TRUE;
9822       }
9823   return FALSE;
9824 }
9825
9826
9827 /* Parse string STR as a 16-bit relocatable operand.  Store the
9828    expression in *EP and the relocations in the array starting
9829    at RELOC.  Return the number of relocation operators used.
9830
9831    On exit, EXPR_END points to the first character after the expression.  */
9832
9833 static size_t
9834 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
9835                        char *str)
9836 {
9837   bfd_reloc_code_real_type reversed_reloc[3];
9838   size_t reloc_index, i;
9839   int crux_depth, str_depth;
9840   char *crux;
9841
9842   /* Search for the start of the main expression, recoding relocations
9843      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
9844      of the main expression and with CRUX_DEPTH containing the number
9845      of open brackets at that point.  */
9846   reloc_index = -1;
9847   str_depth = 0;
9848   do
9849     {
9850       reloc_index++;
9851       crux = str;
9852       crux_depth = str_depth;
9853
9854       /* Skip over whitespace and brackets, keeping count of the number
9855          of brackets.  */
9856       while (*str == ' ' || *str == '\t' || *str == '(')
9857         if (*str++ == '(')
9858           str_depth++;
9859     }
9860   while (*str == '%'
9861          && reloc_index < (HAVE_NEWABI ? 3 : 1)
9862          && parse_relocation (&str, &reversed_reloc[reloc_index]));
9863
9864   my_getExpression (ep, crux);
9865   str = expr_end;
9866
9867   /* Match every open bracket.  */
9868   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
9869     if (*str++ == ')')
9870       crux_depth--;
9871
9872   if (crux_depth > 0)
9873     as_bad ("unclosed '('");
9874
9875   expr_end = str;
9876
9877   if (reloc_index != 0)
9878     {
9879       prev_reloc_op_frag = frag_now;
9880       for (i = 0; i < reloc_index; i++)
9881         reloc[i] = reversed_reloc[reloc_index - 1 - i];
9882     }
9883
9884   return reloc_index;
9885 }
9886
9887 static void
9888 my_getExpression (expressionS *ep, char *str)
9889 {
9890   char *save_in;
9891   valueT val;
9892
9893   save_in = input_line_pointer;
9894   input_line_pointer = str;
9895   expression (ep);
9896   expr_end = input_line_pointer;
9897   input_line_pointer = save_in;
9898
9899   /* If we are in mips16 mode, and this is an expression based on `.',
9900      then we bump the value of the symbol by 1 since that is how other
9901      text symbols are handled.  We don't bother to handle complex
9902      expressions, just `.' plus or minus a constant.  */
9903   if (mips_opts.mips16
9904       && ep->X_op == O_symbol
9905       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
9906       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
9907       && symbol_get_frag (ep->X_add_symbol) == frag_now
9908       && symbol_constant_p (ep->X_add_symbol)
9909       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
9910     S_SET_VALUE (ep->X_add_symbol, val + 1);
9911 }
9912
9913 /* Turn a string in input_line_pointer into a floating point constant
9914    of type TYPE, and store the appropriate bytes in *LITP.  The number
9915    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
9916    returned, or NULL on OK.  */
9917
9918 char *
9919 md_atof (int type, char *litP, int *sizeP)
9920 {
9921   int prec;
9922   LITTLENUM_TYPE words[4];
9923   char *t;
9924   int i;
9925
9926   switch (type)
9927     {
9928     case 'f':
9929       prec = 2;
9930       break;
9931
9932     case 'd':
9933       prec = 4;
9934       break;
9935
9936     default:
9937       *sizeP = 0;
9938       return _("bad call to md_atof");
9939     }
9940
9941   t = atof_ieee (input_line_pointer, type, words);
9942   if (t)
9943     input_line_pointer = t;
9944
9945   *sizeP = prec * 2;
9946
9947   if (! target_big_endian)
9948     {
9949       for (i = prec - 1; i >= 0; i--)
9950         {
9951           md_number_to_chars (litP, words[i], 2);
9952           litP += 2;
9953         }
9954     }
9955   else
9956     {
9957       for (i = 0; i < prec; i++)
9958         {
9959           md_number_to_chars (litP, words[i], 2);
9960           litP += 2;
9961         }
9962     }
9963
9964   return NULL;
9965 }
9966
9967 void
9968 md_number_to_chars (char *buf, valueT val, int n)
9969 {
9970   if (target_big_endian)
9971     number_to_chars_bigendian (buf, val, n);
9972   else
9973     number_to_chars_littleendian (buf, val, n);
9974 }
9975 \f
9976 #ifdef OBJ_ELF
9977 static int support_64bit_objects(void)
9978 {
9979   const char **list, **l;
9980   int yes;
9981
9982   list = bfd_target_list ();
9983   for (l = list; *l != NULL; l++)
9984 #ifdef TE_TMIPS
9985     /* This is traditional mips */
9986     if (strcmp (*l, "elf64-tradbigmips") == 0
9987         || strcmp (*l, "elf64-tradlittlemips") == 0)
9988 #else
9989     if (strcmp (*l, "elf64-bigmips") == 0
9990         || strcmp (*l, "elf64-littlemips") == 0)
9991 #endif
9992       break;
9993   yes = (*l != NULL);
9994   free (list);
9995   return yes;
9996 }
9997 #endif /* OBJ_ELF */
9998
9999 const char *md_shortopts = "O::g::G:";
10000
10001 struct option md_longopts[] =
10002 {
10003   /* Options which specify architecture.  */
10004 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10005 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10006   {"march", required_argument, NULL, OPTION_MARCH},
10007 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10008   {"mtune", required_argument, NULL, OPTION_MTUNE},
10009 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10010   {"mips0", no_argument, NULL, OPTION_MIPS1},
10011   {"mips1", no_argument, NULL, OPTION_MIPS1},
10012 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10013   {"mips2", no_argument, NULL, OPTION_MIPS2},
10014 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10015   {"mips3", no_argument, NULL, OPTION_MIPS3},
10016 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10017   {"mips4", no_argument, NULL, OPTION_MIPS4},
10018 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10019   {"mips5", no_argument, NULL, OPTION_MIPS5},
10020 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10021   {"mips32", no_argument, NULL, OPTION_MIPS32},
10022 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10023   {"mips64", no_argument, NULL, OPTION_MIPS64},
10024 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10025   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10026 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10027   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10028
10029   /* Options which specify Application Specific Extensions (ASEs).  */
10030 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10031 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10032   {"mips16", no_argument, NULL, OPTION_MIPS16},
10033 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10034   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10035 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10036   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10037 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10038   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10039 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10040   {"mdmx", no_argument, NULL, OPTION_MDMX},
10041 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10042   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10043
10044   /* Old-style architecture options.  Don't add more of these.  */
10045 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 6)
10046 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10047   {"m4650", no_argument, NULL, OPTION_M4650},
10048 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10049   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10050 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10051   {"m4010", no_argument, NULL, OPTION_M4010},
10052 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10053   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10054 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10055   {"m4100", no_argument, NULL, OPTION_M4100},
10056 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10057   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10058 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10059   {"m3900", no_argument, NULL, OPTION_M3900},
10060 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10061   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10062
10063   /* Options which enable bug fixes.  */
10064 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10065 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10066   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10067 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10068   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10069   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10070 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10071 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10072   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10073   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10074
10075   /* Miscellaneous options.  */
10076 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 4)
10077 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10078   {"trap", no_argument, NULL, OPTION_TRAP},
10079   {"no-break", no_argument, NULL, OPTION_TRAP},
10080 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10081   {"break", no_argument, NULL, OPTION_BREAK},
10082   {"no-trap", no_argument, NULL, OPTION_BREAK},
10083 #define OPTION_EB (OPTION_MISC_BASE + 2)
10084   {"EB", no_argument, NULL, OPTION_EB},
10085 #define OPTION_EL (OPTION_MISC_BASE + 3)
10086   {"EL", no_argument, NULL, OPTION_EL},
10087 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10088   {"mfp32", no_argument, NULL, OPTION_FP32},
10089 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10090   {"mgp32", no_argument, NULL, OPTION_GP32},
10091 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10092   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10093 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10094   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10095 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10096   {"mfp64", no_argument, NULL, OPTION_FP64},
10097 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10098   {"mgp64", no_argument, NULL, OPTION_GP64},
10099 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10100 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10101   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10102   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10103
10104   /* ELF-specific options.  */
10105 #ifdef OBJ_ELF
10106 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 12)
10107 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10108   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10109   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10110 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10111   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10112 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10113   {"xgot",        no_argument, NULL, OPTION_XGOT},
10114 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10115   {"mabi", required_argument, NULL, OPTION_MABI},
10116 #define OPTION_32          (OPTION_ELF_BASE + 4)
10117   {"32",          no_argument, NULL, OPTION_32},
10118 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10119   {"n32",         no_argument, NULL, OPTION_N32},
10120 #define OPTION_64          (OPTION_ELF_BASE + 6)
10121   {"64",          no_argument, NULL, OPTION_64},
10122 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10123   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10124 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10125   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10126 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
10127   {"mpdr", no_argument, NULL, OPTION_PDR},
10128 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
10129   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10130 #endif /* OBJ_ELF */
10131
10132   {NULL, no_argument, NULL, 0}
10133 };
10134 size_t md_longopts_size = sizeof (md_longopts);
10135
10136 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10137    NEW_VALUE.  Warn if another value was already specified.  Note:
10138    we have to defer parsing the -march and -mtune arguments in order
10139    to handle 'from-abi' correctly, since the ABI might be specified
10140    in a later argument.  */
10141
10142 static void
10143 mips_set_option_string (const char **string_ptr, const char *new_value)
10144 {
10145   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10146     as_warn (_("A different %s was already specified, is now %s"),
10147              string_ptr == &mips_arch_string ? "-march" : "-mtune",
10148              new_value);
10149
10150   *string_ptr = new_value;
10151 }
10152
10153 int
10154 md_parse_option (int c, char *arg)
10155 {
10156   switch (c)
10157     {
10158     case OPTION_CONSTRUCT_FLOATS:
10159       mips_disable_float_construction = 0;
10160       break;
10161
10162     case OPTION_NO_CONSTRUCT_FLOATS:
10163       mips_disable_float_construction = 1;
10164       break;
10165
10166     case OPTION_TRAP:
10167       mips_trap = 1;
10168       break;
10169
10170     case OPTION_BREAK:
10171       mips_trap = 0;
10172       break;
10173
10174     case OPTION_EB:
10175       target_big_endian = 1;
10176       break;
10177
10178     case OPTION_EL:
10179       target_big_endian = 0;
10180       break;
10181
10182     case 'O':
10183       if (arg && arg[1] == '0')
10184         mips_optimize = 1;
10185       else
10186         mips_optimize = 2;
10187       break;
10188
10189     case 'g':
10190       if (arg == NULL)
10191         mips_debug = 2;
10192       else
10193         mips_debug = atoi (arg);
10194       /* When the MIPS assembler sees -g or -g2, it does not do
10195          optimizations which limit full symbolic debugging.  We take
10196          that to be equivalent to -O0.  */
10197       if (mips_debug == 2)
10198         mips_optimize = 1;
10199       break;
10200
10201     case OPTION_MIPS1:
10202       file_mips_isa = ISA_MIPS1;
10203       break;
10204
10205     case OPTION_MIPS2:
10206       file_mips_isa = ISA_MIPS2;
10207       break;
10208
10209     case OPTION_MIPS3:
10210       file_mips_isa = ISA_MIPS3;
10211       break;
10212
10213     case OPTION_MIPS4:
10214       file_mips_isa = ISA_MIPS4;
10215       break;
10216
10217     case OPTION_MIPS5:
10218       file_mips_isa = ISA_MIPS5;
10219       break;
10220
10221     case OPTION_MIPS32:
10222       file_mips_isa = ISA_MIPS32;
10223       break;
10224
10225     case OPTION_MIPS32R2:
10226       file_mips_isa = ISA_MIPS32R2;
10227       break;
10228
10229     case OPTION_MIPS64R2:
10230       file_mips_isa = ISA_MIPS64R2;
10231       break;
10232
10233     case OPTION_MIPS64:
10234       file_mips_isa = ISA_MIPS64;
10235       break;
10236
10237     case OPTION_MTUNE:
10238       mips_set_option_string (&mips_tune_string, arg);
10239       break;
10240
10241     case OPTION_MARCH:
10242       mips_set_option_string (&mips_arch_string, arg);
10243       break;
10244
10245     case OPTION_M4650:
10246       mips_set_option_string (&mips_arch_string, "4650");
10247       mips_set_option_string (&mips_tune_string, "4650");
10248       break;
10249
10250     case OPTION_NO_M4650:
10251       break;
10252
10253     case OPTION_M4010:
10254       mips_set_option_string (&mips_arch_string, "4010");
10255       mips_set_option_string (&mips_tune_string, "4010");
10256       break;
10257
10258     case OPTION_NO_M4010:
10259       break;
10260
10261     case OPTION_M4100:
10262       mips_set_option_string (&mips_arch_string, "4100");
10263       mips_set_option_string (&mips_tune_string, "4100");
10264       break;
10265
10266     case OPTION_NO_M4100:
10267       break;
10268
10269     case OPTION_M3900:
10270       mips_set_option_string (&mips_arch_string, "3900");
10271       mips_set_option_string (&mips_tune_string, "3900");
10272       break;
10273
10274     case OPTION_NO_M3900:
10275       break;
10276
10277     case OPTION_MDMX:
10278       mips_opts.ase_mdmx = 1;
10279       break;
10280
10281     case OPTION_NO_MDMX:
10282       mips_opts.ase_mdmx = 0;
10283       break;
10284
10285     case OPTION_MIPS16:
10286       mips_opts.mips16 = 1;
10287       mips_no_prev_insn (FALSE);
10288       break;
10289
10290     case OPTION_NO_MIPS16:
10291       mips_opts.mips16 = 0;
10292       mips_no_prev_insn (FALSE);
10293       break;
10294
10295     case OPTION_MIPS3D:
10296       mips_opts.ase_mips3d = 1;
10297       break;
10298
10299     case OPTION_NO_MIPS3D:
10300       mips_opts.ase_mips3d = 0;
10301       break;
10302
10303     case OPTION_FIX_VR4120:
10304       mips_fix_vr4120 = 1;
10305       break;
10306
10307     case OPTION_NO_FIX_VR4120:
10308       mips_fix_vr4120 = 0;
10309       break;
10310
10311     case OPTION_RELAX_BRANCH:
10312       mips_relax_branch = 1;
10313       break;
10314
10315     case OPTION_NO_RELAX_BRANCH:
10316       mips_relax_branch = 0;
10317       break;
10318
10319 #ifdef OBJ_ELF
10320       /* When generating ELF code, we permit -KPIC and -call_shared to
10321          select SVR4_PIC, and -non_shared to select no PIC.  This is
10322          intended to be compatible with Irix 5.  */
10323     case OPTION_CALL_SHARED:
10324       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10325         {
10326           as_bad (_("-call_shared is supported only for ELF format"));
10327           return 0;
10328         }
10329       mips_pic = SVR4_PIC;
10330       mips_abicalls = TRUE;
10331       if (g_switch_seen && g_switch_value != 0)
10332         {
10333           as_bad (_("-G may not be used with SVR4 PIC code"));
10334           return 0;
10335         }
10336       g_switch_value = 0;
10337       break;
10338
10339     case OPTION_NON_SHARED:
10340       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10341         {
10342           as_bad (_("-non_shared is supported only for ELF format"));
10343           return 0;
10344         }
10345       mips_pic = NO_PIC;
10346       mips_abicalls = FALSE;
10347       break;
10348
10349       /* The -xgot option tells the assembler to use 32 offsets when
10350          accessing the got in SVR4_PIC mode.  It is for Irix
10351          compatibility.  */
10352     case OPTION_XGOT:
10353       mips_big_got = 1;
10354       break;
10355 #endif /* OBJ_ELF */
10356
10357     case 'G':
10358       if (mips_pic == SVR4_PIC)
10359         {
10360           as_bad (_("-G may not be used with SVR4 PIC code"));
10361           return 0;
10362         }
10363       else
10364         g_switch_value = atoi (arg);
10365       g_switch_seen = 1;
10366       break;
10367
10368 #ifdef OBJ_ELF
10369       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
10370          and -mabi=64.  */
10371     case OPTION_32:
10372       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10373         {
10374           as_bad (_("-32 is supported for ELF format only"));
10375           return 0;
10376         }
10377       mips_abi = O32_ABI;
10378       break;
10379
10380     case OPTION_N32:
10381       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10382         {
10383           as_bad (_("-n32 is supported for ELF format only"));
10384           return 0;
10385         }
10386       mips_abi = N32_ABI;
10387       break;
10388
10389     case OPTION_64:
10390       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10391         {
10392           as_bad (_("-64 is supported for ELF format only"));
10393           return 0;
10394         }
10395       mips_abi = N64_ABI;
10396       if (! support_64bit_objects())
10397         as_fatal (_("No compiled in support for 64 bit object file format"));
10398       break;
10399 #endif /* OBJ_ELF */
10400
10401     case OPTION_GP32:
10402       file_mips_gp32 = 1;
10403       break;
10404
10405     case OPTION_GP64:
10406       file_mips_gp32 = 0;
10407       break;
10408
10409     case OPTION_FP32:
10410       file_mips_fp32 = 1;
10411       break;
10412
10413     case OPTION_FP64:
10414       file_mips_fp32 = 0;
10415       break;
10416
10417 #ifdef OBJ_ELF
10418     case OPTION_MABI:
10419       if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
10420         {
10421           as_bad (_("-mabi is supported for ELF format only"));
10422           return 0;
10423         }
10424       if (strcmp (arg, "32") == 0)
10425         mips_abi = O32_ABI;
10426       else if (strcmp (arg, "o64") == 0)
10427         mips_abi = O64_ABI;
10428       else if (strcmp (arg, "n32") == 0)
10429         mips_abi = N32_ABI;
10430       else if (strcmp (arg, "64") == 0)
10431         {
10432           mips_abi = N64_ABI;
10433           if (! support_64bit_objects())
10434             as_fatal (_("No compiled in support for 64 bit object file "
10435                         "format"));
10436         }
10437       else if (strcmp (arg, "eabi") == 0)
10438         mips_abi = EABI_ABI;
10439       else
10440         {
10441           as_fatal (_("invalid abi -mabi=%s"), arg);
10442           return 0;
10443         }
10444       break;
10445 #endif /* OBJ_ELF */
10446
10447     case OPTION_M7000_HILO_FIX:
10448       mips_7000_hilo_fix = TRUE;
10449       break;
10450
10451     case OPTION_MNO_7000_HILO_FIX:
10452       mips_7000_hilo_fix = FALSE;
10453       break;
10454
10455 #ifdef OBJ_ELF
10456     case OPTION_MDEBUG:
10457       mips_flag_mdebug = TRUE;
10458       break;
10459
10460     case OPTION_NO_MDEBUG:
10461       mips_flag_mdebug = FALSE;
10462       break;
10463
10464     case OPTION_PDR:
10465       mips_flag_pdr = TRUE;
10466       break;
10467
10468     case OPTION_NO_PDR:
10469       mips_flag_pdr = FALSE;
10470       break;
10471 #endif /* OBJ_ELF */
10472
10473     default:
10474       return 0;
10475     }
10476
10477   return 1;
10478 }
10479 \f
10480 /* Set up globals to generate code for the ISA or processor
10481    described by INFO.  */
10482
10483 static void
10484 mips_set_architecture (const struct mips_cpu_info *info)
10485 {
10486   if (info != 0)
10487     {
10488       file_mips_arch = info->cpu;
10489       mips_opts.arch = info->cpu;
10490       mips_opts.isa = info->isa;
10491     }
10492 }
10493
10494
10495 /* Likewise for tuning.  */
10496
10497 static void
10498 mips_set_tune (const struct mips_cpu_info *info)
10499 {
10500   if (info != 0)
10501     mips_tune = info->cpu;
10502 }
10503
10504
10505 void
10506 mips_after_parse_args (void)
10507 {
10508   const struct mips_cpu_info *arch_info = 0;
10509   const struct mips_cpu_info *tune_info = 0;
10510
10511   /* GP relative stuff not working for PE */
10512   if (strncmp (TARGET_OS, "pe", 2) == 0
10513       && g_switch_value != 0)
10514     {
10515       if (g_switch_seen)
10516         as_bad (_("-G not supported in this configuration."));
10517       g_switch_value = 0;
10518     }
10519
10520   if (mips_abi == NO_ABI)
10521     mips_abi = MIPS_DEFAULT_ABI;
10522
10523   /* The following code determines the architecture and register size.
10524      Similar code was added to GCC 3.3 (see override_options() in
10525      config/mips/mips.c).  The GAS and GCC code should be kept in sync
10526      as much as possible.  */
10527
10528   if (mips_arch_string != 0)
10529     arch_info = mips_parse_cpu ("-march", mips_arch_string);
10530
10531   if (file_mips_isa != ISA_UNKNOWN)
10532     {
10533       /* Handle -mipsN.  At this point, file_mips_isa contains the
10534          ISA level specified by -mipsN, while arch_info->isa contains
10535          the -march selection (if any).  */
10536       if (arch_info != 0)
10537         {
10538           /* -march takes precedence over -mipsN, since it is more descriptive.
10539              There's no harm in specifying both as long as the ISA levels
10540              are the same.  */
10541           if (file_mips_isa != arch_info->isa)
10542             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
10543                     mips_cpu_info_from_isa (file_mips_isa)->name,
10544                     mips_cpu_info_from_isa (arch_info->isa)->name);
10545         }
10546       else
10547         arch_info = mips_cpu_info_from_isa (file_mips_isa);
10548     }
10549
10550   if (arch_info == 0)
10551     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
10552
10553   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
10554     as_bad ("-march=%s is not compatible with the selected ABI",
10555             arch_info->name);
10556
10557   mips_set_architecture (arch_info);
10558
10559   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
10560   if (mips_tune_string != 0)
10561     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
10562
10563   if (tune_info == 0)
10564     mips_set_tune (arch_info);
10565   else
10566     mips_set_tune (tune_info);
10567
10568   if (file_mips_gp32 >= 0)
10569     {
10570       /* The user specified the size of the integer registers.  Make sure
10571          it agrees with the ABI and ISA.  */
10572       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
10573         as_bad (_("-mgp64 used with a 32-bit processor"));
10574       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
10575         as_bad (_("-mgp32 used with a 64-bit ABI"));
10576       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
10577         as_bad (_("-mgp64 used with a 32-bit ABI"));
10578     }
10579   else
10580     {
10581       /* Infer the integer register size from the ABI and processor.
10582          Restrict ourselves to 32-bit registers if that's all the
10583          processor has, or if the ABI cannot handle 64-bit registers.  */
10584       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
10585                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
10586     }
10587
10588   /* ??? GAS treats single-float processors as though they had 64-bit
10589      float registers (although it complains when double-precision
10590      instructions are used).  As things stand, saying they have 32-bit
10591      registers would lead to spurious "register must be even" messages.
10592      So here we assume float registers are always the same size as
10593      integer ones, unless the user says otherwise.  */
10594   if (file_mips_fp32 < 0)
10595     file_mips_fp32 = file_mips_gp32;
10596
10597   /* End of GCC-shared inference code.  */
10598
10599   /* This flag is set when we have a 64-bit capable CPU but use only
10600      32-bit wide registers.  Note that EABI does not use it.  */
10601   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
10602       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
10603           || mips_abi == O32_ABI))
10604     mips_32bitmode = 1;
10605
10606   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
10607     as_bad (_("trap exception not supported at ISA 1"));
10608
10609   /* If the selected architecture includes support for ASEs, enable
10610      generation of code for them.  */
10611   if (mips_opts.mips16 == -1)
10612     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
10613   if (mips_opts.ase_mips3d == -1)
10614     mips_opts.ase_mips3d = (CPU_HAS_MIPS3D (file_mips_arch)) ? 1 : 0;
10615   if (mips_opts.ase_mdmx == -1)
10616     mips_opts.ase_mdmx = (CPU_HAS_MDMX (file_mips_arch)) ? 1 : 0;
10617
10618   file_mips_isa = mips_opts.isa;
10619   file_ase_mips16 = mips_opts.mips16;
10620   file_ase_mips3d = mips_opts.ase_mips3d;
10621   file_ase_mdmx = mips_opts.ase_mdmx;
10622   mips_opts.gp32 = file_mips_gp32;
10623   mips_opts.fp32 = file_mips_fp32;
10624
10625   if (mips_flag_mdebug < 0)
10626     {
10627 #ifdef OBJ_MAYBE_ECOFF
10628       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
10629         mips_flag_mdebug = 1;
10630       else
10631 #endif /* OBJ_MAYBE_ECOFF */
10632         mips_flag_mdebug = 0;
10633     }
10634 }
10635 \f
10636 void
10637 mips_init_after_args (void)
10638 {
10639   /* initialize opcodes */
10640   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
10641   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
10642 }
10643
10644 long
10645 md_pcrel_from (fixS *fixP)
10646 {
10647   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
10648   switch (fixP->fx_r_type)
10649     {
10650     case BFD_RELOC_16_PCREL_S2:
10651     case BFD_RELOC_MIPS_JMP:
10652       /* Return the address of the delay slot.  */
10653       return addr + 4;
10654     default:
10655       return addr;
10656     }
10657 }
10658
10659 /* This is called before the symbol table is processed.  In order to
10660    work with gcc when using mips-tfile, we must keep all local labels.
10661    However, in other cases, we want to discard them.  If we were
10662    called with -g, but we didn't see any debugging information, it may
10663    mean that gcc is smuggling debugging information through to
10664    mips-tfile, in which case we must generate all local labels.  */
10665
10666 void
10667 mips_frob_file_before_adjust (void)
10668 {
10669 #ifndef NO_ECOFF_DEBUGGING
10670   if (ECOFF_DEBUGGING
10671       && mips_debug != 0
10672       && ! ecoff_debugging_seen)
10673     flag_keep_locals = 1;
10674 #endif
10675 }
10676
10677 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
10678    the corresponding LO16 reloc.  This is called before md_apply_fix3 and
10679    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
10680    relocation operators.
10681
10682    For our purposes, a %lo() expression matches a %got() or %hi()
10683    expression if:
10684
10685       (a) it refers to the same symbol; and
10686       (b) the offset applied in the %lo() expression is no lower than
10687           the offset applied in the %got() or %hi().
10688
10689    (b) allows us to cope with code like:
10690
10691         lui     $4,%hi(foo)
10692         lh      $4,%lo(foo+2)($4)
10693
10694    ...which is legal on RELA targets, and has a well-defined behaviour
10695    if the user knows that adding 2 to "foo" will not induce a carry to
10696    the high 16 bits.
10697
10698    When several %lo()s match a particular %got() or %hi(), we use the
10699    following rules to distinguish them:
10700
10701      (1) %lo()s with smaller offsets are a better match than %lo()s with
10702          higher offsets.
10703
10704      (2) %lo()s with no matching %got() or %hi() are better than those
10705          that already have a matching %got() or %hi().
10706
10707      (3) later %lo()s are better than earlier %lo()s.
10708
10709    These rules are applied in order.
10710
10711    (1) means, among other things, that %lo()s with identical offsets are
10712    chosen if they exist.
10713
10714    (2) means that we won't associate several high-part relocations with
10715    the same low-part relocation unless there's no alternative.  Having
10716    several high parts for the same low part is a GNU extension; this rule
10717    allows careful users to avoid it.
10718
10719    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
10720    with the last high-part relocation being at the front of the list.
10721    It therefore makes sense to choose the last matching low-part
10722    relocation, all other things being equal.  It's also easier
10723    to code that way.  */
10724
10725 void
10726 mips_frob_file (void)
10727 {
10728   struct mips_hi_fixup *l;
10729
10730   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
10731     {
10732       segment_info_type *seginfo;
10733       bfd_boolean matched_lo_p;
10734       fixS **hi_pos, **lo_pos, **pos;
10735
10736       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
10737
10738       /* If a GOT16 relocation turns out to be against a global symbol,
10739          there isn't supposed to be a matching LO.  */
10740       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
10741           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
10742         continue;
10743
10744       /* Check quickly whether the next fixup happens to be a matching %lo.  */
10745       if (fixup_has_matching_lo_p (l->fixp))
10746         continue;
10747
10748       seginfo = seg_info (l->seg);
10749
10750       /* Set HI_POS to the position of this relocation in the chain.
10751          Set LO_POS to the position of the chosen low-part relocation.
10752          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
10753          relocation that matches an immediately-preceding high-part
10754          relocation.  */
10755       hi_pos = NULL;
10756       lo_pos = NULL;
10757       matched_lo_p = FALSE;
10758       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
10759         {
10760           if (*pos == l->fixp)
10761             hi_pos = pos;
10762
10763           if ((*pos)->fx_r_type == BFD_RELOC_LO16
10764               && (*pos)->fx_addsy == l->fixp->fx_addsy
10765               && (*pos)->fx_offset >= l->fixp->fx_offset
10766               && (lo_pos == NULL
10767                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
10768                   || (!matched_lo_p
10769                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
10770             lo_pos = pos;
10771
10772           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
10773                           && fixup_has_matching_lo_p (*pos));
10774         }
10775
10776       /* If we found a match, remove the high-part relocation from its
10777          current position and insert it before the low-part relocation.
10778          Make the offsets match so that fixup_has_matching_lo_p()
10779          will return true.
10780
10781          We don't warn about unmatched high-part relocations since some
10782          versions of gcc have been known to emit dead "lui ...%hi(...)"
10783          instructions.  */
10784       if (lo_pos != NULL)
10785         {
10786           l->fixp->fx_offset = (*lo_pos)->fx_offset;
10787           if (l->fixp->fx_next != *lo_pos)
10788             {
10789               *hi_pos = l->fixp->fx_next;
10790               l->fixp->fx_next = *lo_pos;
10791               *lo_pos = l->fixp;
10792             }
10793         }
10794     }
10795 }
10796
10797 /* We may have combined relocations without symbols in the N32/N64 ABI.
10798    We have to prevent gas from dropping them.  */
10799
10800 int
10801 mips_force_relocation (fixS *fixp)
10802 {
10803   if (generic_force_reloc (fixp))
10804     return 1;
10805
10806   if (HAVE_NEWABI
10807       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
10808       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
10809           || fixp->fx_r_type == BFD_RELOC_HI16_S
10810           || fixp->fx_r_type == BFD_RELOC_LO16))
10811     return 1;
10812
10813   return 0;
10814 }
10815
10816 /* This hook is called before a fix is simplified.  We don't really
10817    decide whether to skip a fix here.  Rather, we turn global symbols
10818    used as branch targets into local symbols, such that they undergo
10819    simplification.  We can only do this if the symbol is defined and
10820    it is in the same section as the branch.  If this doesn't hold, we
10821    emit a better error message than just saying the relocation is not
10822    valid for the selected object format.
10823
10824    FIXP is the fix-up we're going to try to simplify, SEG is the
10825    segment in which the fix up occurs.  The return value should be
10826    non-zero to indicate the fix-up is valid for further
10827    simplifications.  */
10828
10829 int
10830 mips_validate_fix (struct fix *fixP, asection *seg)
10831 {
10832   /* There's a lot of discussion on whether it should be possible to
10833      use R_MIPS_PC16 to represent branch relocations.  The outcome
10834      seems to be that it can, but gas/bfd are very broken in creating
10835      RELA relocations for this, so for now we only accept branches to
10836      symbols in the same section.  Anything else is of dubious value,
10837      since there's no guarantee that at link time the symbol would be
10838      in range.  Even for branches to local symbols this is arguably
10839      wrong, since it we assume the symbol is not going to be
10840      overridden, which should be possible per ELF library semantics,
10841      but then, there isn't a dynamic relocation that could be used to
10842      this effect, and the target would likely be out of range as well.
10843
10844      Unfortunately, it seems that there is too much code out there
10845      that relies on branches to symbols that are global to be resolved
10846      as if they were local, like the IRIX tools do, so we do it as
10847      well, but with a warning so that people are reminded to fix their
10848      code.  If we ever get back to using R_MIPS_PC16 for branch
10849      targets, this entire block should go away (and probably the
10850      whole function).  */
10851
10852   if (fixP->fx_r_type == BFD_RELOC_16_PCREL_S2
10853       && ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
10854            || OUTPUT_FLAVOR == bfd_target_elf_flavour)
10855           || bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16_PCREL_S2) == NULL)
10856       && fixP->fx_addsy)
10857     {
10858       if (! S_IS_DEFINED (fixP->fx_addsy))
10859         {
10860           as_bad_where (fixP->fx_file, fixP->fx_line,
10861                         _("Cannot branch to undefined symbol."));
10862           /* Avoid any further errors about this fixup.  */
10863           fixP->fx_done = 1;
10864         }
10865       else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
10866         {
10867           as_bad_where (fixP->fx_file, fixP->fx_line,
10868                         _("Cannot branch to symbol in another section."));
10869           fixP->fx_done = 1;
10870         }
10871       else if (S_IS_EXTERNAL (fixP->fx_addsy))
10872         {
10873           symbolS *sym = fixP->fx_addsy;
10874
10875           if (mips_pic == SVR4_PIC)
10876             as_warn_where (fixP->fx_file, fixP->fx_line,
10877                            _("Pretending global symbol used as branch target is local."));
10878
10879           fixP->fx_addsy = symbol_create (S_GET_NAME (sym),
10880                                           S_GET_SEGMENT (sym),
10881                                           S_GET_VALUE (sym),
10882                                           symbol_get_frag (sym));
10883           copy_symbol_attributes (fixP->fx_addsy, sym);
10884           S_CLEAR_EXTERNAL (fixP->fx_addsy);
10885           assert (symbol_resolved_p (sym));
10886           symbol_mark_resolved (fixP->fx_addsy);
10887         }
10888     }
10889
10890   return 1;
10891 }
10892
10893 /* Apply a fixup to the object file.  */
10894
10895 void
10896 md_apply_fix3 (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
10897 {
10898   bfd_byte *buf;
10899   long insn;
10900   static int previous_fx_r_type = 0;
10901   reloc_howto_type *howto;
10902
10903   /* We ignore generic BFD relocations we don't know about.  */
10904   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
10905   if (! howto)
10906     return;
10907
10908   assert (fixP->fx_size == 4
10909           || fixP->fx_r_type == BFD_RELOC_16
10910           || fixP->fx_r_type == BFD_RELOC_64
10911           || fixP->fx_r_type == BFD_RELOC_CTOR
10912           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
10913           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
10914           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY);
10915
10916   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
10917
10918   /* We are not done if this is a composite relocation to set up gp.  */
10919   assert (! fixP->fx_pcrel);
10920   if (fixP->fx_addsy == NULL
10921       && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
10922            || (fixP->fx_r_type == BFD_RELOC_64
10923                && (previous_fx_r_type == BFD_RELOC_GPREL32
10924                    || previous_fx_r_type == BFD_RELOC_GPREL16))
10925            || (previous_fx_r_type == BFD_RELOC_MIPS_SUB
10926                && (fixP->fx_r_type == BFD_RELOC_HI16_S
10927                    || fixP->fx_r_type == BFD_RELOC_LO16))))
10928     fixP->fx_done = 1;
10929   previous_fx_r_type = fixP->fx_r_type;
10930
10931   switch (fixP->fx_r_type)
10932     {
10933     case BFD_RELOC_MIPS_JMP:
10934     case BFD_RELOC_MIPS_SHIFT5:
10935     case BFD_RELOC_MIPS_SHIFT6:
10936     case BFD_RELOC_MIPS_GOT_DISP:
10937     case BFD_RELOC_MIPS_GOT_PAGE:
10938     case BFD_RELOC_MIPS_GOT_OFST:
10939     case BFD_RELOC_MIPS_SUB:
10940     case BFD_RELOC_MIPS_INSERT_A:
10941     case BFD_RELOC_MIPS_INSERT_B:
10942     case BFD_RELOC_MIPS_DELETE:
10943     case BFD_RELOC_MIPS_HIGHEST:
10944     case BFD_RELOC_MIPS_HIGHER:
10945     case BFD_RELOC_MIPS_SCN_DISP:
10946     case BFD_RELOC_MIPS_REL16:
10947     case BFD_RELOC_MIPS_RELGOT:
10948     case BFD_RELOC_MIPS_JALR:
10949     case BFD_RELOC_HI16:
10950     case BFD_RELOC_HI16_S:
10951     case BFD_RELOC_GPREL16:
10952     case BFD_RELOC_MIPS_LITERAL:
10953     case BFD_RELOC_MIPS_CALL16:
10954     case BFD_RELOC_MIPS_GOT16:
10955     case BFD_RELOC_GPREL32:
10956     case BFD_RELOC_MIPS_GOT_HI16:
10957     case BFD_RELOC_MIPS_GOT_LO16:
10958     case BFD_RELOC_MIPS_CALL_HI16:
10959     case BFD_RELOC_MIPS_CALL_LO16:
10960     case BFD_RELOC_MIPS16_GPREL:
10961       assert (! fixP->fx_pcrel);
10962       /* Nothing needed to do. The value comes from the reloc entry */
10963       break;
10964
10965     case BFD_RELOC_MIPS16_JMP:
10966       /* We currently always generate a reloc against a symbol, which
10967          means that we don't want an addend even if the symbol is
10968          defined.  */
10969       *valP = 0;
10970       break;
10971
10972     case BFD_RELOC_64:
10973       /* This is handled like BFD_RELOC_32, but we output a sign
10974          extended value if we are only 32 bits.  */
10975       if (fixP->fx_done)
10976         {
10977           if (8 <= sizeof (valueT))
10978             md_number_to_chars (buf, *valP, 8);
10979           else
10980             {
10981               valueT hiv;
10982
10983               if ((*valP & 0x80000000) != 0)
10984                 hiv = 0xffffffff;
10985               else
10986                 hiv = 0;
10987               md_number_to_chars ((char *)(buf + target_big_endian ? 4 : 0),
10988                                   *valP, 4);
10989               md_number_to_chars ((char *)(buf + target_big_endian ? 0 : 4),
10990                                   hiv, 4);
10991             }
10992         }
10993       break;
10994
10995     case BFD_RELOC_RVA:
10996     case BFD_RELOC_32:
10997       /* If we are deleting this reloc entry, we must fill in the
10998          value now.  This can happen if we have a .word which is not
10999          resolved when it appears but is later defined.   */
11000       if (fixP->fx_done)
11001         md_number_to_chars (buf, *valP, 4);
11002       break;
11003
11004     case BFD_RELOC_16:
11005       /* If we are deleting this reloc entry, we must fill in the
11006          value now.  */
11007       if (fixP->fx_done)
11008         md_number_to_chars (buf, *valP, 2);
11009       break;
11010
11011     case BFD_RELOC_LO16:
11012       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11013          may be safe to remove, but if so it's not obvious.  */
11014       /* When handling an embedded PIC switch statement, we can wind
11015          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11016       if (fixP->fx_done)
11017         {
11018           if (*valP + 0x8000 > 0xffff)
11019             as_bad_where (fixP->fx_file, fixP->fx_line,
11020                           _("relocation overflow"));
11021           if (target_big_endian)
11022             buf += 2;
11023           md_number_to_chars (buf, *valP, 2);
11024         }
11025       break;
11026
11027     case BFD_RELOC_16_PCREL_S2:
11028       if ((*valP & 0x3) != 0)
11029         as_bad_where (fixP->fx_file, fixP->fx_line,
11030                       _("Branch to odd address (%lx)"), (long) *valP);
11031
11032       /*
11033        * We need to save the bits in the instruction since fixup_segment()
11034        * might be deleting the relocation entry (i.e., a branch within
11035        * the current segment).
11036        */
11037       if (! fixP->fx_done)
11038         break;
11039
11040       /* update old instruction data */
11041       if (target_big_endian)
11042         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11043       else
11044         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11045
11046       if (*valP + 0x20000 <= 0x3ffff)
11047         {
11048           insn |= (*valP >> 2) & 0xffff;
11049           md_number_to_chars (buf, insn, 4);
11050         }
11051       else if (mips_pic == NO_PIC
11052                && fixP->fx_done
11053                && fixP->fx_frag->fr_address >= text_section->vma
11054                && (fixP->fx_frag->fr_address
11055                    < text_section->vma + bfd_get_section_size (text_section))
11056                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
11057                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
11058                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11059         {
11060           /* The branch offset is too large.  If this is an
11061              unconditional branch, and we are not generating PIC code,
11062              we can convert it to an absolute jump instruction.  */
11063           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
11064             insn = 0x0c000000;  /* jal */
11065           else
11066             insn = 0x08000000;  /* j */
11067           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11068           fixP->fx_done = 0;
11069           fixP->fx_addsy = section_symbol (text_section);
11070           *valP += md_pcrel_from (fixP);
11071           md_number_to_chars (buf, insn, 4);
11072         }
11073       else
11074         {
11075           /* If we got here, we have branch-relaxation disabled,
11076              and there's nothing we can do to fix this instruction
11077              without turning it into a longer sequence.  */
11078           as_bad_where (fixP->fx_file, fixP->fx_line,
11079                         _("Branch out of range"));
11080         }
11081       break;
11082
11083     case BFD_RELOC_VTABLE_INHERIT:
11084       fixP->fx_done = 0;
11085       if (fixP->fx_addsy
11086           && !S_IS_DEFINED (fixP->fx_addsy)
11087           && !S_IS_WEAK (fixP->fx_addsy))
11088         S_SET_WEAK (fixP->fx_addsy);
11089       break;
11090
11091     case BFD_RELOC_VTABLE_ENTRY:
11092       fixP->fx_done = 0;
11093       break;
11094
11095     default:
11096       internalError ();
11097     }
11098
11099   /* Remember value for tc_gen_reloc.  */
11100   fixP->fx_addnumber = *valP;
11101 }
11102
11103 #if 0
11104 void
11105 printInsn (unsigned long oc)
11106 {
11107   const struct mips_opcode *p;
11108   int treg, sreg, dreg, shamt;
11109   short imm;
11110   const char *args;
11111   int i;
11112
11113   for (i = 0; i < NUMOPCODES; ++i)
11114     {
11115       p = &mips_opcodes[i];
11116       if (((oc & p->mask) == p->match) && (p->pinfo != INSN_MACRO))
11117         {
11118           printf ("%08lx %s\t", oc, p->name);
11119           treg = (oc >> 16) & 0x1f;
11120           sreg = (oc >> 21) & 0x1f;
11121           dreg = (oc >> 11) & 0x1f;
11122           shamt = (oc >> 6) & 0x1f;
11123           imm = oc;
11124           for (args = p->args;; ++args)
11125             {
11126               switch (*args)
11127                 {
11128                 case '\0':
11129                   printf ("\n");
11130                   break;
11131
11132                 case ',':
11133                 case '(':
11134                 case ')':
11135                   printf ("%c", *args);
11136                   continue;
11137
11138                 case 'r':
11139                   assert (treg == sreg);
11140                   printf ("$%d,$%d", treg, sreg);
11141                   continue;
11142
11143                 case 'd':
11144                 case 'G':
11145                   printf ("$%d", dreg);
11146                   continue;
11147
11148                 case 't':
11149                 case 'E':
11150                   printf ("$%d", treg);
11151                   continue;
11152
11153                 case 'k':
11154                   printf ("0x%x", treg);
11155                   continue;
11156
11157                 case 'b':
11158                 case 's':
11159                   printf ("$%d", sreg);
11160                   continue;
11161
11162                 case 'a':
11163                   printf ("0x%08lx", oc & 0x1ffffff);
11164                   continue;
11165
11166                 case 'i':
11167                 case 'j':
11168                 case 'o':
11169                 case 'u':
11170                   printf ("%d", imm);
11171                   continue;
11172
11173                 case '<':
11174                 case '>':
11175                   printf ("$%d", shamt);
11176                   continue;
11177
11178                 default:
11179                   internalError ();
11180                 }
11181               break;
11182             }
11183           return;
11184         }
11185     }
11186   printf (_("%08lx  UNDEFINED\n"), oc);
11187 }
11188 #endif
11189
11190 static symbolS *
11191 get_symbol (void)
11192 {
11193   int c;
11194   char *name;
11195   symbolS *p;
11196
11197   name = input_line_pointer;
11198   c = get_symbol_end ();
11199   p = (symbolS *) symbol_find_or_make (name);
11200   *input_line_pointer = c;
11201   return p;
11202 }
11203
11204 /* Align the current frag to a given power of two.  The MIPS assembler
11205    also automatically adjusts any preceding label.  */
11206
11207 static void
11208 mips_align (int to, int fill, symbolS *label)
11209 {
11210   mips_emit_delays (FALSE);
11211   frag_align (to, fill, 0);
11212   record_alignment (now_seg, to);
11213   if (label != NULL)
11214     {
11215       assert (S_GET_SEGMENT (label) == now_seg);
11216       symbol_set_frag (label, frag_now);
11217       S_SET_VALUE (label, (valueT) frag_now_fix ());
11218     }
11219 }
11220
11221 /* Align to a given power of two.  .align 0 turns off the automatic
11222    alignment used by the data creating pseudo-ops.  */
11223
11224 static void
11225 s_align (int x ATTRIBUTE_UNUSED)
11226 {
11227   register int temp;
11228   register long temp_fill;
11229   long max_alignment = 15;
11230
11231   /*
11232
11233     o  Note that the assembler pulls down any immediately preceding label
11234        to the aligned address.
11235     o  It's not documented but auto alignment is reinstated by
11236        a .align pseudo instruction.
11237     o  Note also that after auto alignment is turned off the mips assembler
11238        issues an error on attempt to assemble an improperly aligned data item.
11239        We don't.
11240
11241     */
11242
11243   temp = get_absolute_expression ();
11244   if (temp > max_alignment)
11245     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
11246   else if (temp < 0)
11247     {
11248       as_warn (_("Alignment negative: 0 assumed."));
11249       temp = 0;
11250     }
11251   if (*input_line_pointer == ',')
11252     {
11253       ++input_line_pointer;
11254       temp_fill = get_absolute_expression ();
11255     }
11256   else
11257     temp_fill = 0;
11258   if (temp)
11259     {
11260       auto_align = 1;
11261       mips_align (temp, (int) temp_fill,
11262                   insn_labels != NULL ? insn_labels->label : NULL);
11263     }
11264   else
11265     {
11266       auto_align = 0;
11267     }
11268
11269   demand_empty_rest_of_line ();
11270 }
11271
11272 void
11273 mips_flush_pending_output (void)
11274 {
11275   mips_emit_delays (FALSE);
11276   mips_clear_insn_labels ();
11277 }
11278
11279 static void
11280 s_change_sec (int sec)
11281 {
11282   segT seg;
11283
11284 #ifdef OBJ_ELF
11285   /* The ELF backend needs to know that we are changing sections, so
11286      that .previous works correctly.  We could do something like check
11287      for an obj_section_change_hook macro, but that might be confusing
11288      as it would not be appropriate to use it in the section changing
11289      functions in read.c, since obj-elf.c intercepts those.  FIXME:
11290      This should be cleaner, somehow.  */
11291   obj_elf_section_change_hook ();
11292 #endif
11293
11294   mips_emit_delays (FALSE);
11295   switch (sec)
11296     {
11297     case 't':
11298       s_text (0);
11299       break;
11300     case 'd':
11301       s_data (0);
11302       break;
11303     case 'b':
11304       subseg_set (bss_section, (subsegT) get_absolute_expression ());
11305       demand_empty_rest_of_line ();
11306       break;
11307
11308     case 'r':
11309       seg = subseg_new (RDATA_SECTION_NAME,
11310                         (subsegT) get_absolute_expression ());
11311       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11312         {
11313           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
11314                                                   | SEC_READONLY | SEC_RELOC
11315                                                   | SEC_DATA));
11316           if (strcmp (TARGET_OS, "elf") != 0)
11317             record_alignment (seg, 4);
11318         }
11319       demand_empty_rest_of_line ();
11320       break;
11321
11322     case 's':
11323       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
11324       if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
11325         {
11326           bfd_set_section_flags (stdoutput, seg,
11327                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
11328           if (strcmp (TARGET_OS, "elf") != 0)
11329             record_alignment (seg, 4);
11330         }
11331       demand_empty_rest_of_line ();
11332       break;
11333     }
11334
11335   auto_align = 1;
11336 }
11337
11338 void
11339 s_change_section (int ignore ATTRIBUTE_UNUSED)
11340 {
11341 #ifdef OBJ_ELF
11342   char *section_name;
11343   char c;
11344   char next_c = 0;
11345   int section_type;
11346   int section_flag;
11347   int section_entry_size;
11348   int section_alignment;
11349
11350   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
11351     return;
11352
11353   section_name = input_line_pointer;
11354   c = get_symbol_end ();
11355   if (c)
11356     next_c = *(input_line_pointer + 1);
11357
11358   /* Do we have .section Name<,"flags">?  */
11359   if (c != ',' || (c == ',' && next_c == '"'))
11360     {
11361       /* just after name is now '\0'.  */
11362       *input_line_pointer = c;
11363       input_line_pointer = section_name;
11364       obj_elf_section (ignore);
11365       return;
11366     }
11367   input_line_pointer++;
11368
11369   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
11370   if (c == ',')
11371     section_type = get_absolute_expression ();
11372   else
11373     section_type = 0;
11374   if (*input_line_pointer++ == ',')
11375     section_flag = get_absolute_expression ();
11376   else
11377     section_flag = 0;
11378   if (*input_line_pointer++ == ',')
11379     section_entry_size = get_absolute_expression ();
11380   else
11381     section_entry_size = 0;
11382   if (*input_line_pointer++ == ',')
11383     section_alignment = get_absolute_expression ();
11384   else
11385     section_alignment = 0;
11386
11387   section_name = xstrdup (section_name);
11388
11389   /* When using the generic form of .section (as implemented by obj-elf.c),
11390      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
11391      traditionally had to fall back on the more common @progbits instead.
11392
11393      There's nothing really harmful in this, since bfd will correct
11394      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
11395      means that, for backwards compatibiltiy, the special_section entries
11396      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
11397
11398      Even so, we shouldn't force users of the MIPS .section syntax to
11399      incorrectly label the sections as SHT_PROGBITS.  The best compromise
11400      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
11401      generic type-checking code.  */
11402   if (section_type == SHT_MIPS_DWARF)
11403     section_type = SHT_PROGBITS;
11404
11405   obj_elf_change_section (section_name, section_type, section_flag,
11406                           section_entry_size, 0, 0, 0);
11407
11408   if (now_seg->name != section_name)
11409     free (section_name);
11410 #endif /* OBJ_ELF */
11411 }
11412
11413 void
11414 mips_enable_auto_align (void)
11415 {
11416   auto_align = 1;
11417 }
11418
11419 static void
11420 s_cons (int log_size)
11421 {
11422   symbolS *label;
11423
11424   label = insn_labels != NULL ? insn_labels->label : NULL;
11425   mips_emit_delays (FALSE);
11426   if (log_size > 0 && auto_align)
11427     mips_align (log_size, 0, label);
11428   mips_clear_insn_labels ();
11429   cons (1 << log_size);
11430 }
11431
11432 static void
11433 s_float_cons (int type)
11434 {
11435   symbolS *label;
11436
11437   label = insn_labels != NULL ? insn_labels->label : NULL;
11438
11439   mips_emit_delays (FALSE);
11440
11441   if (auto_align)
11442     {
11443       if (type == 'd')
11444         mips_align (3, 0, label);
11445       else
11446         mips_align (2, 0, label);
11447     }
11448
11449   mips_clear_insn_labels ();
11450
11451   float_cons (type);
11452 }
11453
11454 /* Handle .globl.  We need to override it because on Irix 5 you are
11455    permitted to say
11456        .globl foo .text
11457    where foo is an undefined symbol, to mean that foo should be
11458    considered to be the address of a function.  */
11459
11460 static void
11461 s_mips_globl (int x ATTRIBUTE_UNUSED)
11462 {
11463   char *name;
11464   int c;
11465   symbolS *symbolP;
11466   flagword flag;
11467
11468   name = input_line_pointer;
11469   c = get_symbol_end ();
11470   symbolP = symbol_find_or_make (name);
11471   *input_line_pointer = c;
11472   SKIP_WHITESPACE ();
11473
11474   /* On Irix 5, every global symbol that is not explicitly labelled as
11475      being a function is apparently labelled as being an object.  */
11476   flag = BSF_OBJECT;
11477
11478   if (! is_end_of_line[(unsigned char) *input_line_pointer])
11479     {
11480       char *secname;
11481       asection *sec;
11482
11483       secname = input_line_pointer;
11484       c = get_symbol_end ();
11485       sec = bfd_get_section_by_name (stdoutput, secname);
11486       if (sec == NULL)
11487         as_bad (_("%s: no such section"), secname);
11488       *input_line_pointer = c;
11489
11490       if (sec != NULL && (sec->flags & SEC_CODE) != 0)
11491         flag = BSF_FUNCTION;
11492     }
11493
11494   symbol_get_bfdsym (symbolP)->flags |= flag;
11495
11496   S_SET_EXTERNAL (symbolP);
11497   demand_empty_rest_of_line ();
11498 }
11499
11500 static void
11501 s_option (int x ATTRIBUTE_UNUSED)
11502 {
11503   char *opt;
11504   char c;
11505
11506   opt = input_line_pointer;
11507   c = get_symbol_end ();
11508
11509   if (*opt == 'O')
11510     {
11511       /* FIXME: What does this mean?  */
11512     }
11513   else if (strncmp (opt, "pic", 3) == 0)
11514     {
11515       int i;
11516
11517       i = atoi (opt + 3);
11518       if (i == 0)
11519         mips_pic = NO_PIC;
11520       else if (i == 2)
11521         {
11522         mips_pic = SVR4_PIC;
11523           mips_abicalls = TRUE;
11524         }
11525       else
11526         as_bad (_(".option pic%d not supported"), i);
11527
11528       if (mips_pic == SVR4_PIC)
11529         {
11530           if (g_switch_seen && g_switch_value != 0)
11531             as_warn (_("-G may not be used with SVR4 PIC code"));
11532           g_switch_value = 0;
11533           bfd_set_gp_size (stdoutput, 0);
11534         }
11535     }
11536   else
11537     as_warn (_("Unrecognized option \"%s\""), opt);
11538
11539   *input_line_pointer = c;
11540   demand_empty_rest_of_line ();
11541 }
11542
11543 /* This structure is used to hold a stack of .set values.  */
11544
11545 struct mips_option_stack
11546 {
11547   struct mips_option_stack *next;
11548   struct mips_set_options options;
11549 };
11550
11551 static struct mips_option_stack *mips_opts_stack;
11552
11553 /* Handle the .set pseudo-op.  */
11554
11555 static void
11556 s_mipsset (int x ATTRIBUTE_UNUSED)
11557 {
11558   char *name = input_line_pointer, ch;
11559
11560   while (!is_end_of_line[(unsigned char) *input_line_pointer])
11561     ++input_line_pointer;
11562   ch = *input_line_pointer;
11563   *input_line_pointer = '\0';
11564
11565   if (strcmp (name, "reorder") == 0)
11566     {
11567       if (mips_opts.noreorder && prev_nop_frag != NULL)
11568         {
11569           /* If we still have pending nops, we can discard them.  The
11570              usual nop handling will insert any that are still
11571              needed.  */
11572           prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11573                                     * (mips_opts.mips16 ? 2 : 4));
11574           prev_nop_frag = NULL;
11575         }
11576       mips_opts.noreorder = 0;
11577     }
11578   else if (strcmp (name, "noreorder") == 0)
11579     {
11580       mips_emit_delays (TRUE);
11581       mips_opts.noreorder = 1;
11582       mips_any_noreorder = 1;
11583     }
11584   else if (strcmp (name, "at") == 0)
11585     {
11586       mips_opts.noat = 0;
11587     }
11588   else if (strcmp (name, "noat") == 0)
11589     {
11590       mips_opts.noat = 1;
11591     }
11592   else if (strcmp (name, "macro") == 0)
11593     {
11594       mips_opts.warn_about_macros = 0;
11595     }
11596   else if (strcmp (name, "nomacro") == 0)
11597     {
11598       if (mips_opts.noreorder == 0)
11599         as_bad (_("`noreorder' must be set before `nomacro'"));
11600       mips_opts.warn_about_macros = 1;
11601     }
11602   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
11603     {
11604       mips_opts.nomove = 0;
11605     }
11606   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
11607     {
11608       mips_opts.nomove = 1;
11609     }
11610   else if (strcmp (name, "bopt") == 0)
11611     {
11612       mips_opts.nobopt = 0;
11613     }
11614   else if (strcmp (name, "nobopt") == 0)
11615     {
11616       mips_opts.nobopt = 1;
11617     }
11618   else if (strcmp (name, "mips16") == 0
11619            || strcmp (name, "MIPS-16") == 0)
11620     mips_opts.mips16 = 1;
11621   else if (strcmp (name, "nomips16") == 0
11622            || strcmp (name, "noMIPS-16") == 0)
11623     mips_opts.mips16 = 0;
11624   else if (strcmp (name, "mips3d") == 0)
11625     mips_opts.ase_mips3d = 1;
11626   else if (strcmp (name, "nomips3d") == 0)
11627     mips_opts.ase_mips3d = 0;
11628   else if (strcmp (name, "mdmx") == 0)
11629     mips_opts.ase_mdmx = 1;
11630   else if (strcmp (name, "nomdmx") == 0)
11631     mips_opts.ase_mdmx = 0;
11632   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
11633     {
11634       int reset = 0;
11635
11636       /* Permit the user to change the ISA and architecture on the fly.
11637          Needless to say, misuse can cause serious problems.  */
11638       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
11639         {
11640           reset = 1;
11641           mips_opts.isa = file_mips_isa;
11642           mips_opts.arch = file_mips_arch;
11643         }
11644       else if (strncmp (name, "arch=", 5) == 0)
11645         {
11646           const struct mips_cpu_info *p;
11647
11648           p = mips_parse_cpu("internal use", name + 5);
11649           if (!p)
11650             as_bad (_("unknown architecture %s"), name + 5);
11651           else
11652             {
11653               mips_opts.arch = p->cpu;
11654               mips_opts.isa = p->isa;
11655             }
11656         }
11657       else if (strncmp (name, "mips", 4) == 0)
11658         {
11659           const struct mips_cpu_info *p;
11660
11661           p = mips_parse_cpu("internal use", name);
11662           if (!p)
11663             as_bad (_("unknown ISA level %s"), name + 4);
11664           else
11665             {
11666               mips_opts.arch = p->cpu;
11667               mips_opts.isa = p->isa;
11668             }
11669         }
11670       else
11671         as_bad (_("unknown ISA or architecture %s"), name);
11672
11673       switch (mips_opts.isa)
11674         {
11675         case  0:
11676           break;
11677         case ISA_MIPS1:
11678         case ISA_MIPS2:
11679         case ISA_MIPS32:
11680         case ISA_MIPS32R2:
11681           mips_opts.gp32 = 1;
11682           mips_opts.fp32 = 1;
11683           break;
11684         case ISA_MIPS3:
11685         case ISA_MIPS4:
11686         case ISA_MIPS5:
11687         case ISA_MIPS64:
11688         case ISA_MIPS64R2:
11689           mips_opts.gp32 = 0;
11690           mips_opts.fp32 = 0;
11691           break;
11692         default:
11693           as_bad (_("unknown ISA level %s"), name + 4);
11694           break;
11695         }
11696       if (reset)
11697         {
11698           mips_opts.gp32 = file_mips_gp32;
11699           mips_opts.fp32 = file_mips_fp32;
11700         }
11701     }
11702   else if (strcmp (name, "autoextend") == 0)
11703     mips_opts.noautoextend = 0;
11704   else if (strcmp (name, "noautoextend") == 0)
11705     mips_opts.noautoextend = 1;
11706   else if (strcmp (name, "push") == 0)
11707     {
11708       struct mips_option_stack *s;
11709
11710       s = (struct mips_option_stack *) xmalloc (sizeof *s);
11711       s->next = mips_opts_stack;
11712       s->options = mips_opts;
11713       mips_opts_stack = s;
11714     }
11715   else if (strcmp (name, "pop") == 0)
11716     {
11717       struct mips_option_stack *s;
11718
11719       s = mips_opts_stack;
11720       if (s == NULL)
11721         as_bad (_(".set pop with no .set push"));
11722       else
11723         {
11724           /* If we're changing the reorder mode we need to handle
11725              delay slots correctly.  */
11726           if (s->options.noreorder && ! mips_opts.noreorder)
11727             mips_emit_delays (TRUE);
11728           else if (! s->options.noreorder && mips_opts.noreorder)
11729             {
11730               if (prev_nop_frag != NULL)
11731                 {
11732                   prev_nop_frag->fr_fix -= (prev_nop_frag_holds
11733                                             * (mips_opts.mips16 ? 2 : 4));
11734                   prev_nop_frag = NULL;
11735                 }
11736             }
11737
11738           mips_opts = s->options;
11739           mips_opts_stack = s->next;
11740           free (s);
11741         }
11742     }
11743   else
11744     {
11745       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
11746     }
11747   *input_line_pointer = ch;
11748   demand_empty_rest_of_line ();
11749 }
11750
11751 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
11752    .option pic2.  It means to generate SVR4 PIC calls.  */
11753
11754 static void
11755 s_abicalls (int ignore ATTRIBUTE_UNUSED)
11756 {
11757   mips_pic = SVR4_PIC;
11758   mips_abicalls = TRUE;
11759
11760   if (g_switch_seen && g_switch_value != 0)
11761     as_warn (_("-G may not be used with SVR4 PIC code"));
11762   g_switch_value = 0;
11763
11764   bfd_set_gp_size (stdoutput, 0);
11765   demand_empty_rest_of_line ();
11766 }
11767
11768 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
11769    PIC code.  It sets the $gp register for the function based on the
11770    function address, which is in the register named in the argument.
11771    This uses a relocation against _gp_disp, which is handled specially
11772    by the linker.  The result is:
11773         lui     $gp,%hi(_gp_disp)
11774         addiu   $gp,$gp,%lo(_gp_disp)
11775         addu    $gp,$gp,.cpload argument
11776    The .cpload argument is normally $25 == $t9.  */
11777
11778 static void
11779 s_cpload (int ignore ATTRIBUTE_UNUSED)
11780 {
11781   expressionS ex;
11782
11783   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
11784      .cpload is ignored.  */
11785   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
11786     {
11787       s_ignore (0);
11788       return;
11789     }
11790
11791   /* .cpload should be in a .set noreorder section.  */
11792   if (mips_opts.noreorder == 0)
11793     as_warn (_(".cpload not in noreorder section"));
11794
11795   ex.X_op = O_symbol;
11796   ex.X_add_symbol = symbol_find_or_make ("_gp_disp");
11797   ex.X_op_symbol = NULL;
11798   ex.X_add_number = 0;
11799
11800   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
11801   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
11802
11803   macro_start ();
11804   macro_build_lui (&ex, mips_gp_register);
11805   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
11806                mips_gp_register, BFD_RELOC_LO16);
11807   macro_build (NULL, "addu", "d,v,t", mips_gp_register,
11808                mips_gp_register, tc_get_register (0));
11809   macro_end ();
11810
11811   demand_empty_rest_of_line ();
11812 }
11813
11814 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
11815      .cpsetup $reg1, offset|$reg2, label
11816
11817    If offset is given, this results in:
11818      sd         $gp, offset($sp)
11819      lui        $gp, %hi(%neg(%gp_rel(label)))
11820      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
11821      daddu      $gp, $gp, $reg1
11822
11823    If $reg2 is given, this results in:
11824      daddu      $reg2, $gp, $0
11825      lui        $gp, %hi(%neg(%gp_rel(label)))
11826      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
11827      daddu      $gp, $gp, $reg1
11828    $reg1 is normally $25 == $t9.  */
11829 static void
11830 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
11831 {
11832   expressionS ex_off;
11833   expressionS ex_sym;
11834   int reg1;
11835   char *f;
11836
11837   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
11838      We also need NewABI support.  */
11839   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
11840     {
11841       s_ignore (0);
11842       return;
11843     }
11844
11845   reg1 = tc_get_register (0);
11846   SKIP_WHITESPACE ();
11847   if (*input_line_pointer != ',')
11848     {
11849       as_bad (_("missing argument separator ',' for .cpsetup"));
11850       return;
11851     }
11852   else
11853     ++input_line_pointer;
11854   SKIP_WHITESPACE ();
11855   if (*input_line_pointer == '$')
11856     {
11857       mips_cpreturn_register = tc_get_register (0);
11858       mips_cpreturn_offset = -1;
11859     }
11860   else
11861     {
11862       mips_cpreturn_offset = get_absolute_expression ();
11863       mips_cpreturn_register = -1;
11864     }
11865   SKIP_WHITESPACE ();
11866   if (*input_line_pointer != ',')
11867     {
11868       as_bad (_("missing argument separator ',' for .cpsetup"));
11869       return;
11870     }
11871   else
11872     ++input_line_pointer;
11873   SKIP_WHITESPACE ();
11874   expression (&ex_sym);
11875
11876   macro_start ();
11877   if (mips_cpreturn_register == -1)
11878     {
11879       ex_off.X_op = O_constant;
11880       ex_off.X_add_symbol = NULL;
11881       ex_off.X_op_symbol = NULL;
11882       ex_off.X_add_number = mips_cpreturn_offset;
11883
11884       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
11885                    BFD_RELOC_LO16, SP);
11886     }
11887   else
11888     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
11889                  mips_gp_register, 0);
11890
11891   /* Ensure there's room for the next two instructions, so that `f'
11892      doesn't end up with an address in the wrong frag.  */
11893   frag_grow (8);
11894   f = frag_more (0);
11895   macro_build (&ex_sym, "lui", "t,u", mips_gp_register, BFD_RELOC_GPREL16);
11896   fix_new (frag_now, f - frag_now->fr_literal,
11897            8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
11898   fix_new (frag_now, f - frag_now->fr_literal,
11899            4, NULL, 0, 0, BFD_RELOC_HI16_S);
11900
11901   f = frag_more (0);
11902   macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
11903                mips_gp_register, BFD_RELOC_GPREL16);
11904   fix_new (frag_now, f - frag_now->fr_literal,
11905            8, NULL, 0, 0, BFD_RELOC_MIPS_SUB);
11906   fix_new (frag_now, f - frag_now->fr_literal,
11907            4, NULL, 0, 0, BFD_RELOC_LO16);
11908
11909   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
11910                mips_gp_register, reg1);
11911   macro_end ();
11912
11913   demand_empty_rest_of_line ();
11914 }
11915
11916 static void
11917 s_cplocal (int ignore ATTRIBUTE_UNUSED)
11918 {
11919   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
11920    .cplocal is ignored.  */
11921   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
11922     {
11923       s_ignore (0);
11924       return;
11925     }
11926
11927   mips_gp_register = tc_get_register (0);
11928   demand_empty_rest_of_line ();
11929 }
11930
11931 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
11932    offset from $sp.  The offset is remembered, and after making a PIC
11933    call $gp is restored from that location.  */
11934
11935 static void
11936 s_cprestore (int ignore ATTRIBUTE_UNUSED)
11937 {
11938   expressionS ex;
11939
11940   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
11941      .cprestore is ignored.  */
11942   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
11943     {
11944       s_ignore (0);
11945       return;
11946     }
11947
11948   mips_cprestore_offset = get_absolute_expression ();
11949   mips_cprestore_valid = 1;
11950
11951   ex.X_op = O_constant;
11952   ex.X_add_symbol = NULL;
11953   ex.X_op_symbol = NULL;
11954   ex.X_add_number = mips_cprestore_offset;
11955
11956   macro_start ();
11957   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
11958                                 SP, HAVE_64BIT_ADDRESSES);
11959   macro_end ();
11960
11961   demand_empty_rest_of_line ();
11962 }
11963
11964 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
11965    was given in the preceding .cpsetup, it results in:
11966      ld         $gp, offset($sp)
11967
11968    If a register $reg2 was given there, it results in:
11969      daddu      $gp, $reg2, $0
11970  */
11971 static void
11972 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
11973 {
11974   expressionS ex;
11975
11976   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
11977      We also need NewABI support.  */
11978   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
11979     {
11980       s_ignore (0);
11981       return;
11982     }
11983
11984   macro_start ();
11985   if (mips_cpreturn_register == -1)
11986     {
11987       ex.X_op = O_constant;
11988       ex.X_add_symbol = NULL;
11989       ex.X_op_symbol = NULL;
11990       ex.X_add_number = mips_cpreturn_offset;
11991
11992       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
11993     }
11994   else
11995     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
11996                  mips_cpreturn_register, 0);
11997   macro_end ();
11998
11999   demand_empty_rest_of_line ();
12000 }
12001
12002 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12003    code.  It sets the offset to use in gp_rel relocations.  */
12004
12005 static void
12006 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12007 {
12008   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12009      We also need NewABI support.  */
12010   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12011     {
12012       s_ignore (0);
12013       return;
12014     }
12015
12016   mips_gprel_offset = get_absolute_expression ();
12017
12018   demand_empty_rest_of_line ();
12019 }
12020
12021 /* Handle the .gpword pseudo-op.  This is used when generating PIC
12022    code.  It generates a 32 bit GP relative reloc.  */
12023
12024 static void
12025 s_gpword (int ignore ATTRIBUTE_UNUSED)
12026 {
12027   symbolS *label;
12028   expressionS ex;
12029   char *p;
12030
12031   /* When not generating PIC code, this is treated as .word.  */
12032   if (mips_pic != SVR4_PIC)
12033     {
12034       s_cons (2);
12035       return;
12036     }
12037
12038   label = insn_labels != NULL ? insn_labels->label : NULL;
12039   mips_emit_delays (TRUE);
12040   if (auto_align)
12041     mips_align (2, 0, label);
12042   mips_clear_insn_labels ();
12043
12044   expression (&ex);
12045
12046   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12047     {
12048       as_bad (_("Unsupported use of .gpword"));
12049       ignore_rest_of_line ();
12050     }
12051
12052   p = frag_more (4);
12053   md_number_to_chars (p, 0, 4);
12054   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12055                BFD_RELOC_GPREL32);
12056
12057   demand_empty_rest_of_line ();
12058 }
12059
12060 static void
12061 s_gpdword (int ignore ATTRIBUTE_UNUSED)
12062 {
12063   symbolS *label;
12064   expressionS ex;
12065   char *p;
12066
12067   /* When not generating PIC code, this is treated as .dword.  */
12068   if (mips_pic != SVR4_PIC)
12069     {
12070       s_cons (3);
12071       return;
12072     }
12073
12074   label = insn_labels != NULL ? insn_labels->label : NULL;
12075   mips_emit_delays (TRUE);
12076   if (auto_align)
12077     mips_align (3, 0, label);
12078   mips_clear_insn_labels ();
12079
12080   expression (&ex);
12081
12082   if (ex.X_op != O_symbol || ex.X_add_number != 0)
12083     {
12084       as_bad (_("Unsupported use of .gpdword"));
12085       ignore_rest_of_line ();
12086     }
12087
12088   p = frag_more (8);
12089   md_number_to_chars (p, 0, 8);
12090   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
12091                BFD_RELOC_GPREL32);
12092
12093   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
12094   ex.X_op = O_absent;
12095   ex.X_add_symbol = 0;
12096   ex.X_add_number = 0;
12097   fix_new_exp (frag_now, p - frag_now->fr_literal, 8, &ex, FALSE,
12098                BFD_RELOC_64);
12099
12100   demand_empty_rest_of_line ();
12101 }
12102
12103 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
12104    tables in SVR4 PIC code.  */
12105
12106 static void
12107 s_cpadd (int ignore ATTRIBUTE_UNUSED)
12108 {
12109   int reg;
12110
12111   /* This is ignored when not generating SVR4 PIC code.  */
12112   if (mips_pic != SVR4_PIC)
12113     {
12114       s_ignore (0);
12115       return;
12116     }
12117
12118   /* Add $gp to the register named as an argument.  */
12119   macro_start ();
12120   reg = tc_get_register (0);
12121   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
12122   macro_end ();
12123
12124   demand_empty_rest_of_line ();
12125 }
12126
12127 /* Handle the .insn pseudo-op.  This marks instruction labels in
12128    mips16 mode.  This permits the linker to handle them specially,
12129    such as generating jalx instructions when needed.  We also make
12130    them odd for the duration of the assembly, in order to generate the
12131    right sort of code.  We will make them even in the adjust_symtab
12132    routine, while leaving them marked.  This is convenient for the
12133    debugger and the disassembler.  The linker knows to make them odd
12134    again.  */
12135
12136 static void
12137 s_insn (int ignore ATTRIBUTE_UNUSED)
12138 {
12139   mips16_mark_labels ();
12140
12141   demand_empty_rest_of_line ();
12142 }
12143
12144 /* Handle a .stabn directive.  We need these in order to mark a label
12145    as being a mips16 text label correctly.  Sometimes the compiler
12146    will emit a label, followed by a .stabn, and then switch sections.
12147    If the label and .stabn are in mips16 mode, then the label is
12148    really a mips16 text label.  */
12149
12150 static void
12151 s_mips_stab (int type)
12152 {
12153   if (type == 'n')
12154     mips16_mark_labels ();
12155
12156   s_stab (type);
12157 }
12158
12159 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.
12160  */
12161
12162 static void
12163 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
12164 {
12165   char *name;
12166   int c;
12167   symbolS *symbolP;
12168   expressionS exp;
12169
12170   name = input_line_pointer;
12171   c = get_symbol_end ();
12172   symbolP = symbol_find_or_make (name);
12173   S_SET_WEAK (symbolP);
12174   *input_line_pointer = c;
12175
12176   SKIP_WHITESPACE ();
12177
12178   if (! is_end_of_line[(unsigned char) *input_line_pointer])
12179     {
12180       if (S_IS_DEFINED (symbolP))
12181         {
12182           as_bad ("ignoring attempt to redefine symbol %s",
12183                   S_GET_NAME (symbolP));
12184           ignore_rest_of_line ();
12185           return;
12186         }
12187
12188       if (*input_line_pointer == ',')
12189         {
12190           ++input_line_pointer;
12191           SKIP_WHITESPACE ();
12192         }
12193
12194       expression (&exp);
12195       if (exp.X_op != O_symbol)
12196         {
12197           as_bad ("bad .weakext directive");
12198           ignore_rest_of_line ();
12199           return;
12200         }
12201       symbol_set_value_expression (symbolP, &exp);
12202     }
12203
12204   demand_empty_rest_of_line ();
12205 }
12206
12207 /* Parse a register string into a number.  Called from the ECOFF code
12208    to parse .frame.  The argument is non-zero if this is the frame
12209    register, so that we can record it in mips_frame_reg.  */
12210
12211 int
12212 tc_get_register (int frame)
12213 {
12214   int reg;
12215
12216   SKIP_WHITESPACE ();
12217   if (*input_line_pointer++ != '$')
12218     {
12219       as_warn (_("expected `$'"));
12220       reg = ZERO;
12221     }
12222   else if (ISDIGIT (*input_line_pointer))
12223     {
12224       reg = get_absolute_expression ();
12225       if (reg < 0 || reg >= 32)
12226         {
12227           as_warn (_("Bad register number"));
12228           reg = ZERO;
12229         }
12230     }
12231   else
12232     {
12233       if (strncmp (input_line_pointer, "ra", 2) == 0)
12234         {
12235           reg = RA;
12236           input_line_pointer += 2;
12237         }
12238       else if (strncmp (input_line_pointer, "fp", 2) == 0)
12239         {
12240           reg = FP;
12241           input_line_pointer += 2;
12242         }
12243       else if (strncmp (input_line_pointer, "sp", 2) == 0)
12244         {
12245           reg = SP;
12246           input_line_pointer += 2;
12247         }
12248       else if (strncmp (input_line_pointer, "gp", 2) == 0)
12249         {
12250           reg = GP;
12251           input_line_pointer += 2;
12252         }
12253       else if (strncmp (input_line_pointer, "at", 2) == 0)
12254         {
12255           reg = AT;
12256           input_line_pointer += 2;
12257         }
12258       else if (strncmp (input_line_pointer, "kt0", 3) == 0)
12259         {
12260           reg = KT0;
12261           input_line_pointer += 3;
12262         }
12263       else if (strncmp (input_line_pointer, "kt1", 3) == 0)
12264         {
12265           reg = KT1;
12266           input_line_pointer += 3;
12267         }
12268       else if (strncmp (input_line_pointer, "zero", 4) == 0)
12269         {
12270           reg = ZERO;
12271           input_line_pointer += 4;
12272         }
12273       else
12274         {
12275           as_warn (_("Unrecognized register name"));
12276           reg = ZERO;
12277           while (ISALNUM(*input_line_pointer))
12278            input_line_pointer++;
12279         }
12280     }
12281   if (frame)
12282     {
12283       mips_frame_reg = reg != 0 ? reg : SP;
12284       mips_frame_reg_valid = 1;
12285       mips_cprestore_valid = 0;
12286     }
12287   return reg;
12288 }
12289
12290 valueT
12291 md_section_align (asection *seg, valueT addr)
12292 {
12293   int align = bfd_get_section_alignment (stdoutput, seg);
12294
12295 #ifdef OBJ_ELF
12296   /* We don't need to align ELF sections to the full alignment.
12297      However, Irix 5 may prefer that we align them at least to a 16
12298      byte boundary.  We don't bother to align the sections if we are
12299      targeted for an embedded system.  */
12300   if (strcmp (TARGET_OS, "elf") == 0)
12301     return addr;
12302   if (align > 4)
12303     align = 4;
12304 #endif
12305
12306   return ((addr + (1 << align) - 1) & (-1 << align));
12307 }
12308
12309 /* Utility routine, called from above as well.  If called while the
12310    input file is still being read, it's only an approximation.  (For
12311    example, a symbol may later become defined which appeared to be
12312    undefined earlier.)  */
12313
12314 static int
12315 nopic_need_relax (symbolS *sym, int before_relaxing)
12316 {
12317   if (sym == 0)
12318     return 0;
12319
12320   if (g_switch_value > 0)
12321     {
12322       const char *symname;
12323       int change;
12324
12325       /* Find out whether this symbol can be referenced off the $gp
12326          register.  It can be if it is smaller than the -G size or if
12327          it is in the .sdata or .sbss section.  Certain symbols can
12328          not be referenced off the $gp, although it appears as though
12329          they can.  */
12330       symname = S_GET_NAME (sym);
12331       if (symname != (const char *) NULL
12332           && (strcmp (symname, "eprol") == 0
12333               || strcmp (symname, "etext") == 0
12334               || strcmp (symname, "_gp") == 0
12335               || strcmp (symname, "edata") == 0
12336               || strcmp (symname, "_fbss") == 0
12337               || strcmp (symname, "_fdata") == 0
12338               || strcmp (symname, "_ftext") == 0
12339               || strcmp (symname, "end") == 0
12340               || strcmp (symname, "_gp_disp") == 0))
12341         change = 1;
12342       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
12343                && (0
12344 #ifndef NO_ECOFF_DEBUGGING
12345                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
12346                        && (symbol_get_obj (sym)->ecoff_extern_size
12347                            <= g_switch_value))
12348 #endif
12349                    /* We must defer this decision until after the whole
12350                       file has been read, since there might be a .extern
12351                       after the first use of this symbol.  */
12352                    || (before_relaxing
12353 #ifndef NO_ECOFF_DEBUGGING
12354                        && symbol_get_obj (sym)->ecoff_extern_size == 0
12355 #endif
12356                        && S_GET_VALUE (sym) == 0)
12357                    || (S_GET_VALUE (sym) != 0
12358                        && S_GET_VALUE (sym) <= g_switch_value)))
12359         change = 0;
12360       else
12361         {
12362           const char *segname;
12363
12364           segname = segment_name (S_GET_SEGMENT (sym));
12365           assert (strcmp (segname, ".lit8") != 0
12366                   && strcmp (segname, ".lit4") != 0);
12367           change = (strcmp (segname, ".sdata") != 0
12368                     && strcmp (segname, ".sbss") != 0
12369                     && strncmp (segname, ".sdata.", 7) != 0
12370                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
12371         }
12372       return change;
12373     }
12374   else
12375     /* We are not optimizing for the $gp register.  */
12376     return 1;
12377 }
12378
12379
12380 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
12381
12382 static bfd_boolean
12383 pic_need_relax (symbolS *sym, asection *segtype)
12384 {
12385   asection *symsec;
12386   bfd_boolean linkonce;
12387
12388   /* Handle the case of a symbol equated to another symbol.  */
12389   while (symbol_equated_reloc_p (sym))
12390     {
12391       symbolS *n;
12392
12393       /* It's possible to get a loop here in a badly written
12394          program.  */
12395       n = symbol_get_value_expression (sym)->X_add_symbol;
12396       if (n == sym)
12397         break;
12398       sym = n;
12399     }
12400
12401   symsec = S_GET_SEGMENT (sym);
12402
12403   /* duplicate the test for LINK_ONCE sections as in adjust_reloc_syms */
12404   linkonce = FALSE;
12405   if (symsec != segtype && ! S_IS_LOCAL (sym))
12406     {
12407       if ((bfd_get_section_flags (stdoutput, symsec) & SEC_LINK_ONCE)
12408           != 0)
12409         linkonce = TRUE;
12410
12411       /* The GNU toolchain uses an extension for ELF: a section
12412          beginning with the magic string .gnu.linkonce is a linkonce
12413          section.  */
12414       if (strncmp (segment_name (symsec), ".gnu.linkonce",
12415                    sizeof ".gnu.linkonce" - 1) == 0)
12416         linkonce = TRUE;
12417     }
12418
12419   /* This must duplicate the test in adjust_reloc_syms.  */
12420   return (symsec != &bfd_und_section
12421           && symsec != &bfd_abs_section
12422           && ! bfd_is_com_section (symsec)
12423           && !linkonce
12424 #ifdef OBJ_ELF
12425           /* A global or weak symbol is treated as external.  */
12426           && (OUTPUT_FLAVOR != bfd_target_elf_flavour
12427               || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
12428 #endif
12429           );
12430 }
12431
12432
12433 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
12434    extended opcode.  SEC is the section the frag is in.  */
12435
12436 static int
12437 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
12438 {
12439   int type;
12440   register const struct mips16_immed_operand *op;
12441   offsetT val;
12442   int mintiny, maxtiny;
12443   segT symsec;
12444   fragS *sym_frag;
12445
12446   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
12447     return 0;
12448   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
12449     return 1;
12450
12451   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
12452   op = mips16_immed_operands;
12453   while (op->type != type)
12454     {
12455       ++op;
12456       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
12457     }
12458
12459   if (op->unsp)
12460     {
12461       if (type == '<' || type == '>' || type == '[' || type == ']')
12462         {
12463           mintiny = 1;
12464           maxtiny = 1 << op->nbits;
12465         }
12466       else
12467         {
12468           mintiny = 0;
12469           maxtiny = (1 << op->nbits) - 1;
12470         }
12471     }
12472   else
12473     {
12474       mintiny = - (1 << (op->nbits - 1));
12475       maxtiny = (1 << (op->nbits - 1)) - 1;
12476     }
12477
12478   sym_frag = symbol_get_frag (fragp->fr_symbol);
12479   val = S_GET_VALUE (fragp->fr_symbol);
12480   symsec = S_GET_SEGMENT (fragp->fr_symbol);
12481
12482   if (op->pcrel)
12483     {
12484       addressT addr;
12485
12486       /* We won't have the section when we are called from
12487          mips_relax_frag.  However, we will always have been called
12488          from md_estimate_size_before_relax first.  If this is a
12489          branch to a different section, we mark it as such.  If SEC is
12490          NULL, and the frag is not marked, then it must be a branch to
12491          the same section.  */
12492       if (sec == NULL)
12493         {
12494           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
12495             return 1;
12496         }
12497       else
12498         {
12499           /* Must have been called from md_estimate_size_before_relax.  */
12500           if (symsec != sec)
12501             {
12502               fragp->fr_subtype =
12503                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12504
12505               /* FIXME: We should support this, and let the linker
12506                  catch branches and loads that are out of range.  */
12507               as_bad_where (fragp->fr_file, fragp->fr_line,
12508                             _("unsupported PC relative reference to different section"));
12509
12510               return 1;
12511             }
12512           if (fragp != sym_frag && sym_frag->fr_address == 0)
12513             /* Assume non-extended on the first relaxation pass.
12514                The address we have calculated will be bogus if this is
12515                a forward branch to another frag, as the forward frag
12516                will have fr_address == 0.  */
12517             return 0;
12518         }
12519
12520       /* In this case, we know for sure that the symbol fragment is in
12521          the same section.  If the relax_marker of the symbol fragment
12522          differs from the relax_marker of this fragment, we have not
12523          yet adjusted the symbol fragment fr_address.  We want to add
12524          in STRETCH in order to get a better estimate of the address.
12525          This particularly matters because of the shift bits.  */
12526       if (stretch != 0
12527           && sym_frag->relax_marker != fragp->relax_marker)
12528         {
12529           fragS *f;
12530
12531           /* Adjust stretch for any alignment frag.  Note that if have
12532              been expanding the earlier code, the symbol may be
12533              defined in what appears to be an earlier frag.  FIXME:
12534              This doesn't handle the fr_subtype field, which specifies
12535              a maximum number of bytes to skip when doing an
12536              alignment.  */
12537           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
12538             {
12539               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
12540                 {
12541                   if (stretch < 0)
12542                     stretch = - ((- stretch)
12543                                  & ~ ((1 << (int) f->fr_offset) - 1));
12544                   else
12545                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
12546                   if (stretch == 0)
12547                     break;
12548                 }
12549             }
12550           if (f != NULL)
12551             val += stretch;
12552         }
12553
12554       addr = fragp->fr_address + fragp->fr_fix;
12555
12556       /* The base address rules are complicated.  The base address of
12557          a branch is the following instruction.  The base address of a
12558          PC relative load or add is the instruction itself, but if it
12559          is in a delay slot (in which case it can not be extended) use
12560          the address of the instruction whose delay slot it is in.  */
12561       if (type == 'p' || type == 'q')
12562         {
12563           addr += 2;
12564
12565           /* If we are currently assuming that this frag should be
12566              extended, then, the current address is two bytes
12567              higher.  */
12568           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12569             addr += 2;
12570
12571           /* Ignore the low bit in the target, since it will be set
12572              for a text label.  */
12573           if ((val & 1) != 0)
12574             --val;
12575         }
12576       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
12577         addr -= 4;
12578       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
12579         addr -= 2;
12580
12581       val -= addr & ~ ((1 << op->shift) - 1);
12582
12583       /* Branch offsets have an implicit 0 in the lowest bit.  */
12584       if (type == 'p' || type == 'q')
12585         val /= 2;
12586
12587       /* If any of the shifted bits are set, we must use an extended
12588          opcode.  If the address depends on the size of this
12589          instruction, this can lead to a loop, so we arrange to always
12590          use an extended opcode.  We only check this when we are in
12591          the main relaxation loop, when SEC is NULL.  */
12592       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
12593         {
12594           fragp->fr_subtype =
12595             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12596           return 1;
12597         }
12598
12599       /* If we are about to mark a frag as extended because the value
12600          is precisely maxtiny + 1, then there is a chance of an
12601          infinite loop as in the following code:
12602              la $4,foo
12603              .skip      1020
12604              .align     2
12605            foo:
12606          In this case when the la is extended, foo is 0x3fc bytes
12607          away, so the la can be shrunk, but then foo is 0x400 away, so
12608          the la must be extended.  To avoid this loop, we mark the
12609          frag as extended if it was small, and is about to become
12610          extended with a value of maxtiny + 1.  */
12611       if (val == ((maxtiny + 1) << op->shift)
12612           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
12613           && sec == NULL)
12614         {
12615           fragp->fr_subtype =
12616             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
12617           return 1;
12618         }
12619     }
12620   else if (symsec != absolute_section && sec != NULL)
12621     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
12622
12623   if ((val & ((1 << op->shift) - 1)) != 0
12624       || val < (mintiny << op->shift)
12625       || val > (maxtiny << op->shift))
12626     return 1;
12627   else
12628     return 0;
12629 }
12630
12631 /* Compute the length of a branch sequence, and adjust the
12632    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
12633    worst-case length is computed, with UPDATE being used to indicate
12634    whether an unconditional (-1), branch-likely (+1) or regular (0)
12635    branch is to be computed.  */
12636 static int
12637 relaxed_branch_length (fragS *fragp, asection *sec, int update)
12638 {
12639   bfd_boolean toofar;
12640   int length;
12641
12642   if (fragp
12643       && S_IS_DEFINED (fragp->fr_symbol)
12644       && sec == S_GET_SEGMENT (fragp->fr_symbol))
12645     {
12646       addressT addr;
12647       offsetT val;
12648
12649       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
12650
12651       addr = fragp->fr_address + fragp->fr_fix + 4;
12652
12653       val -= addr;
12654
12655       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
12656     }
12657   else if (fragp)
12658     /* If the symbol is not defined or it's in a different segment,
12659        assume the user knows what's going on and emit a short
12660        branch.  */
12661     toofar = FALSE;
12662   else
12663     toofar = TRUE;
12664
12665   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
12666     fragp->fr_subtype
12667       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
12668                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
12669                              RELAX_BRANCH_LINK (fragp->fr_subtype),
12670                              toofar);
12671
12672   length = 4;
12673   if (toofar)
12674     {
12675       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
12676         length += 8;
12677
12678       if (mips_pic != NO_PIC)
12679         {
12680           /* Additional space for PIC loading of target address.  */
12681           length += 8;
12682           if (mips_opts.isa == ISA_MIPS1)
12683             /* Additional space for $at-stabilizing nop.  */
12684             length += 4;
12685         }
12686
12687       /* If branch is conditional.  */
12688       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
12689         length += 8;
12690     }
12691
12692   return length;
12693 }
12694
12695 /* Estimate the size of a frag before relaxing.  Unless this is the
12696    mips16, we are not really relaxing here, and the final size is
12697    encoded in the subtype information.  For the mips16, we have to
12698    decide whether we are using an extended opcode or not.  */
12699
12700 int
12701 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
12702 {
12703   int change;
12704
12705   if (RELAX_BRANCH_P (fragp->fr_subtype))
12706     {
12707
12708       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
12709
12710       return fragp->fr_var;
12711     }
12712
12713   if (RELAX_MIPS16_P (fragp->fr_subtype))
12714     /* We don't want to modify the EXTENDED bit here; it might get us
12715        into infinite loops.  We change it only in mips_relax_frag().  */
12716     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
12717
12718   if (mips_pic == NO_PIC)
12719     change = nopic_need_relax (fragp->fr_symbol, 0);
12720   else if (mips_pic == SVR4_PIC)
12721     change = pic_need_relax (fragp->fr_symbol, segtype);
12722   else
12723     abort ();
12724
12725   if (change)
12726     {
12727       fragp->fr_subtype |= RELAX_USE_SECOND;
12728       return -RELAX_FIRST (fragp->fr_subtype);
12729     }
12730   else
12731     return -RELAX_SECOND (fragp->fr_subtype);
12732 }
12733
12734 /* This is called to see whether a reloc against a defined symbol
12735    should be converted into a reloc against a section.  */
12736
12737 int
12738 mips_fix_adjustable (fixS *fixp)
12739 {
12740   /* Don't adjust MIPS16 jump relocations, so we don't have to worry
12741      about the format of the offset in the .o file. */
12742   if (fixp->fx_r_type == BFD_RELOC_MIPS16_JMP)
12743     return 0;
12744
12745   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12746       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
12747     return 0;
12748
12749   if (fixp->fx_addsy == NULL)
12750     return 1;
12751
12752   /* If symbol SYM is in a mergeable section, relocations of the form
12753      SYM + 0 can usually be made section-relative.  The mergeable data
12754      is then identified by the section offset rather than by the symbol.
12755
12756      However, if we're generating REL LO16 relocations, the offset is split
12757      between the LO16 and parterning high part relocation.  The linker will
12758      need to recalculate the complete offset in order to correctly identify
12759      the merge data.
12760
12761      The linker has traditionally not looked for the parterning high part
12762      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
12763      placed anywhere.  Rather than break backwards compatibility by changing
12764      this, it seems better not to force the issue, and instead keep the
12765      original symbol.  This will work with either linker behavior.  */
12766   if ((fixp->fx_r_type == BFD_RELOC_LO16 || reloc_needs_lo_p (fixp->fx_r_type))
12767       && HAVE_IN_PLACE_ADDENDS
12768       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
12769     return 0;
12770
12771 #ifdef OBJ_ELF
12772   /* Don't adjust relocations against mips16 symbols, so that the linker
12773      can find them if it needs to set up a stub.  */
12774   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
12775       && S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
12776       && fixp->fx_subsy == NULL)
12777     return 0;
12778 #endif
12779
12780   return 1;
12781 }
12782
12783 /* Translate internal representation of relocation info to BFD target
12784    format.  */
12785
12786 arelent **
12787 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
12788 {
12789   static arelent *retval[4];
12790   arelent *reloc;
12791   bfd_reloc_code_real_type code;
12792
12793   memset (retval, 0, sizeof(retval));
12794   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
12795   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
12796   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
12797   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
12798
12799   assert (! fixp->fx_pcrel);
12800   reloc->addend = fixp->fx_addnumber;
12801
12802   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
12803      entry to be used in the relocation's section offset.  */
12804   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
12805     {
12806       reloc->address = reloc->addend;
12807       reloc->addend = 0;
12808     }
12809
12810   code = fixp->fx_r_type;
12811
12812   /* To support a PC relative reloc, we used a Cygnus extension.
12813      We check for that here to make sure that we don't let such a
12814      reloc escape normally.  (FIXME: This was formerly used by
12815      embedded-PIC support, but is now used by branch handling in
12816      general.  That probably should be fixed.)  */
12817   if ((OUTPUT_FLAVOR == bfd_target_ecoff_flavour
12818        || OUTPUT_FLAVOR == bfd_target_elf_flavour)
12819       && code == BFD_RELOC_16_PCREL_S2)
12820     reloc->howto = NULL;
12821   else
12822     reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
12823
12824   if (reloc->howto == NULL)
12825     {
12826       as_bad_where (fixp->fx_file, fixp->fx_line,
12827                     _("Can not represent %s relocation in this object file format"),
12828                     bfd_get_reloc_code_name (code));
12829       retval[0] = NULL;
12830     }
12831
12832   return retval;
12833 }
12834
12835 /* Relax a machine dependent frag.  This returns the amount by which
12836    the current size of the frag should change.  */
12837
12838 int
12839 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
12840 {
12841   if (RELAX_BRANCH_P (fragp->fr_subtype))
12842     {
12843       offsetT old_var = fragp->fr_var;
12844
12845       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
12846
12847       return fragp->fr_var - old_var;
12848     }
12849
12850   if (! RELAX_MIPS16_P (fragp->fr_subtype))
12851     return 0;
12852
12853   if (mips16_extended_frag (fragp, NULL, stretch))
12854     {
12855       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12856         return 0;
12857       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
12858       return 2;
12859     }
12860   else
12861     {
12862       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
12863         return 0;
12864       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
12865       return -2;
12866     }
12867
12868   return 0;
12869 }
12870
12871 /* Convert a machine dependent frag.  */
12872
12873 void
12874 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
12875 {
12876   if (RELAX_BRANCH_P (fragp->fr_subtype))
12877     {
12878       bfd_byte *buf;
12879       unsigned long insn;
12880       expressionS exp;
12881       fixS *fixp;
12882
12883       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
12884
12885       if (target_big_endian)
12886         insn = bfd_getb32 (buf);
12887       else
12888         insn = bfd_getl32 (buf);
12889
12890       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
12891         {
12892           /* We generate a fixup instead of applying it right now
12893              because, if there are linker relaxations, we're going to
12894              need the relocations.  */
12895           exp.X_op = O_symbol;
12896           exp.X_add_symbol = fragp->fr_symbol;
12897           exp.X_add_number = fragp->fr_offset;
12898
12899           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
12900                               4, &exp, 1,
12901                               BFD_RELOC_16_PCREL_S2);
12902           fixp->fx_file = fragp->fr_file;
12903           fixp->fx_line = fragp->fr_line;
12904
12905           md_number_to_chars (buf, insn, 4);
12906           buf += 4;
12907         }
12908       else
12909         {
12910           int i;
12911
12912           as_warn_where (fragp->fr_file, fragp->fr_line,
12913                          _("relaxed out-of-range branch into a jump"));
12914
12915           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
12916             goto uncond;
12917
12918           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
12919             {
12920               /* Reverse the branch.  */
12921               switch ((insn >> 28) & 0xf)
12922                 {
12923                 case 4:
12924                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
12925                      have the condition reversed by tweaking a single
12926                      bit, and their opcodes all have 0x4???????.  */
12927                   assert ((insn & 0xf1000000) == 0x41000000);
12928                   insn ^= 0x00010000;
12929                   break;
12930
12931                 case 0:
12932                   /* bltz       0x04000000      bgez    0x04010000
12933                      bltzal     0x04100000      bgezal  0x04110000 */
12934                   assert ((insn & 0xfc0e0000) == 0x04000000);
12935                   insn ^= 0x00010000;
12936                   break;
12937
12938                 case 1:
12939                   /* beq        0x10000000      bne     0x14000000
12940                      blez       0x18000000      bgtz    0x1c000000 */
12941                   insn ^= 0x04000000;
12942                   break;
12943
12944                 default:
12945                   abort ();
12946                 }
12947             }
12948
12949           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
12950             {
12951               /* Clear the and-link bit.  */
12952               assert ((insn & 0xfc1c0000) == 0x04100000);
12953
12954               /* bltzal 0x04100000      bgezal  0x04110000
12955                 bltzall 0x04120000     bgezall  0x04130000 */
12956               insn &= ~0x00100000;
12957             }
12958
12959           /* Branch over the branch (if the branch was likely) or the
12960              full jump (not likely case).  Compute the offset from the
12961              current instruction to branch to.  */
12962           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
12963             i = 16;
12964           else
12965             {
12966               /* How many bytes in instructions we've already emitted?  */
12967               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
12968               /* How many bytes in instructions from here to the end?  */
12969               i = fragp->fr_var - i;
12970             }
12971           /* Convert to instruction count.  */
12972           i >>= 2;
12973           /* Branch counts from the next instruction.  */
12974           i--;
12975           insn |= i;
12976           /* Branch over the jump.  */
12977           md_number_to_chars (buf, insn, 4);
12978           buf += 4;
12979
12980           /* Nop */
12981           md_number_to_chars (buf, 0, 4);
12982           buf += 4;
12983
12984           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
12985             {
12986               /* beql $0, $0, 2f */
12987               insn = 0x50000000;
12988               /* Compute the PC offset from the current instruction to
12989                  the end of the variable frag.  */
12990               /* How many bytes in instructions we've already emitted?  */
12991               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
12992               /* How many bytes in instructions from here to the end?  */
12993               i = fragp->fr_var - i;
12994               /* Convert to instruction count.  */
12995               i >>= 2;
12996               /* Don't decrement i, because we want to branch over the
12997                  delay slot.  */
12998
12999               insn |= i;
13000               md_number_to_chars (buf, insn, 4);
13001               buf += 4;
13002
13003               md_number_to_chars (buf, 0, 4);
13004               buf += 4;
13005             }
13006
13007         uncond:
13008           if (mips_pic == NO_PIC)
13009             {
13010               /* j or jal.  */
13011               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13012                       ? 0x0c000000 : 0x08000000);
13013               exp.X_op = O_symbol;
13014               exp.X_add_symbol = fragp->fr_symbol;
13015               exp.X_add_number = fragp->fr_offset;
13016
13017               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13018                                   4, &exp, 0, BFD_RELOC_MIPS_JMP);
13019               fixp->fx_file = fragp->fr_file;
13020               fixp->fx_line = fragp->fr_line;
13021
13022               md_number_to_chars (buf, insn, 4);
13023               buf += 4;
13024             }
13025           else
13026             {
13027               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13028               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13029               exp.X_op = O_symbol;
13030               exp.X_add_symbol = fragp->fr_symbol;
13031               exp.X_add_number = fragp->fr_offset;
13032
13033               if (fragp->fr_offset)
13034                 {
13035                   exp.X_add_symbol = make_expr_symbol (&exp);
13036                   exp.X_add_number = 0;
13037                 }
13038
13039               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13040                                   4, &exp, 0, BFD_RELOC_MIPS_GOT16);
13041               fixp->fx_file = fragp->fr_file;
13042               fixp->fx_line = fragp->fr_line;
13043
13044               md_number_to_chars (buf, insn, 4);
13045               buf += 4;
13046
13047               if (mips_opts.isa == ISA_MIPS1)
13048                 {
13049                   /* nop */
13050                   md_number_to_chars (buf, 0, 4);
13051                   buf += 4;
13052                 }
13053
13054               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
13055               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
13056
13057               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13058                                   4, &exp, 0, BFD_RELOC_LO16);
13059               fixp->fx_file = fragp->fr_file;
13060               fixp->fx_line = fragp->fr_line;
13061
13062               md_number_to_chars (buf, insn, 4);
13063               buf += 4;
13064
13065               /* j(al)r $at.  */
13066               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13067                 insn = 0x0020f809;
13068               else
13069                 insn = 0x00200008;
13070
13071               md_number_to_chars (buf, insn, 4);
13072               buf += 4;
13073             }
13074         }
13075
13076       assert (buf == (bfd_byte *)fragp->fr_literal
13077               + fragp->fr_fix + fragp->fr_var);
13078
13079       fragp->fr_fix += fragp->fr_var;
13080
13081       return;
13082     }
13083
13084   if (RELAX_MIPS16_P (fragp->fr_subtype))
13085     {
13086       int type;
13087       register const struct mips16_immed_operand *op;
13088       bfd_boolean small, ext;
13089       offsetT val;
13090       bfd_byte *buf;
13091       unsigned long insn;
13092       bfd_boolean use_extend;
13093       unsigned short extend;
13094
13095       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13096       op = mips16_immed_operands;
13097       while (op->type != type)
13098         ++op;
13099
13100       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13101         {
13102           small = FALSE;
13103           ext = TRUE;
13104         }
13105       else
13106         {
13107           small = TRUE;
13108           ext = FALSE;
13109         }
13110
13111       resolve_symbol_value (fragp->fr_symbol);
13112       val = S_GET_VALUE (fragp->fr_symbol);
13113       if (op->pcrel)
13114         {
13115           addressT addr;
13116
13117           addr = fragp->fr_address + fragp->fr_fix;
13118
13119           /* The rules for the base address of a PC relative reloc are
13120              complicated; see mips16_extended_frag.  */
13121           if (type == 'p' || type == 'q')
13122             {
13123               addr += 2;
13124               if (ext)
13125                 addr += 2;
13126               /* Ignore the low bit in the target, since it will be
13127                  set for a text label.  */
13128               if ((val & 1) != 0)
13129                 --val;
13130             }
13131           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13132             addr -= 4;
13133           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13134             addr -= 2;
13135
13136           addr &= ~ (addressT) ((1 << op->shift) - 1);
13137           val -= addr;
13138
13139           /* Make sure the section winds up with the alignment we have
13140              assumed.  */
13141           if (op->shift > 0)
13142             record_alignment (asec, op->shift);
13143         }
13144
13145       if (ext
13146           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
13147               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
13148         as_warn_where (fragp->fr_file, fragp->fr_line,
13149                        _("extended instruction in delay slot"));
13150
13151       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
13152
13153       if (target_big_endian)
13154         insn = bfd_getb16 (buf);
13155       else
13156         insn = bfd_getl16 (buf);
13157
13158       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
13159                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
13160                     small, ext, &insn, &use_extend, &extend);
13161
13162       if (use_extend)
13163         {
13164           md_number_to_chars (buf, 0xf000 | extend, 2);
13165           fragp->fr_fix += 2;
13166           buf += 2;
13167         }
13168
13169       md_number_to_chars (buf, insn, 2);
13170       fragp->fr_fix += 2;
13171       buf += 2;
13172     }
13173   else
13174     {
13175       int first, second;
13176       fixS *fixp;
13177
13178       first = RELAX_FIRST (fragp->fr_subtype);
13179       second = RELAX_SECOND (fragp->fr_subtype);
13180       fixp = (fixS *) fragp->fr_opcode;
13181
13182       /* Possibly emit a warning if we've chosen the longer option.  */
13183       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
13184           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
13185         {
13186           const char *msg = macro_warning (fragp->fr_subtype);
13187           if (msg != 0)
13188             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
13189         }
13190
13191       /* Go through all the fixups for the first sequence.  Disable them
13192          (by marking them as done) if we're going to use the second
13193          sequence instead.  */
13194       while (fixp
13195              && fixp->fx_frag == fragp
13196              && fixp->fx_where < fragp->fr_fix - second)
13197         {
13198           if (fragp->fr_subtype & RELAX_USE_SECOND)
13199             fixp->fx_done = 1;
13200           fixp = fixp->fx_next;
13201         }
13202
13203       /* Go through the fixups for the second sequence.  Disable them if
13204          we're going to use the first sequence, otherwise adjust their
13205          addresses to account for the relaxation.  */
13206       while (fixp && fixp->fx_frag == fragp)
13207         {
13208           if (fragp->fr_subtype & RELAX_USE_SECOND)
13209             fixp->fx_where -= first;
13210           else
13211             fixp->fx_done = 1;
13212           fixp = fixp->fx_next;
13213         }
13214
13215       /* Now modify the frag contents.  */
13216       if (fragp->fr_subtype & RELAX_USE_SECOND)
13217         {
13218           char *start;
13219
13220           start = fragp->fr_literal + fragp->fr_fix - first - second;
13221           memmove (start, start + first, second);
13222           fragp->fr_fix -= first;
13223         }
13224       else
13225         fragp->fr_fix -= second;
13226     }
13227 }
13228
13229 #ifdef OBJ_ELF
13230
13231 /* This function is called after the relocs have been generated.
13232    We've been storing mips16 text labels as odd.  Here we convert them
13233    back to even for the convenience of the debugger.  */
13234
13235 void
13236 mips_frob_file_after_relocs (void)
13237 {
13238   asymbol **syms;
13239   unsigned int count, i;
13240
13241   if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
13242     return;
13243
13244   syms = bfd_get_outsymbols (stdoutput);
13245   count = bfd_get_symcount (stdoutput);
13246   for (i = 0; i < count; i++, syms++)
13247     {
13248       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
13249           && ((*syms)->value & 1) != 0)
13250         {
13251           (*syms)->value &= ~1;
13252           /* If the symbol has an odd size, it was probably computed
13253              incorrectly, so adjust that as well.  */
13254           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
13255             ++elf_symbol (*syms)->internal_elf_sym.st_size;
13256         }
13257     }
13258 }
13259
13260 #endif
13261
13262 /* This function is called whenever a label is defined.  It is used
13263    when handling branch delays; if a branch has a label, we assume we
13264    can not move it.  */
13265
13266 void
13267 mips_define_label (symbolS *sym)
13268 {
13269   struct insn_label_list *l;
13270
13271   if (free_insn_labels == NULL)
13272     l = (struct insn_label_list *) xmalloc (sizeof *l);
13273   else
13274     {
13275       l = free_insn_labels;
13276       free_insn_labels = l->next;
13277     }
13278
13279   l->label = sym;
13280   l->next = insn_labels;
13281   insn_labels = l;
13282 }
13283 \f
13284 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
13285
13286 /* Some special processing for a MIPS ELF file.  */
13287
13288 void
13289 mips_elf_final_processing (void)
13290 {
13291   /* Write out the register information.  */
13292   if (mips_abi != N64_ABI)
13293     {
13294       Elf32_RegInfo s;
13295
13296       s.ri_gprmask = mips_gprmask;
13297       s.ri_cprmask[0] = mips_cprmask[0];
13298       s.ri_cprmask[1] = mips_cprmask[1];
13299       s.ri_cprmask[2] = mips_cprmask[2];
13300       s.ri_cprmask[3] = mips_cprmask[3];
13301       /* The gp_value field is set by the MIPS ELF backend.  */
13302
13303       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
13304                                        ((Elf32_External_RegInfo *)
13305                                         mips_regmask_frag));
13306     }
13307   else
13308     {
13309       Elf64_Internal_RegInfo s;
13310
13311       s.ri_gprmask = mips_gprmask;
13312       s.ri_pad = 0;
13313       s.ri_cprmask[0] = mips_cprmask[0];
13314       s.ri_cprmask[1] = mips_cprmask[1];
13315       s.ri_cprmask[2] = mips_cprmask[2];
13316       s.ri_cprmask[3] = mips_cprmask[3];
13317       /* The gp_value field is set by the MIPS ELF backend.  */
13318
13319       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
13320                                        ((Elf64_External_RegInfo *)
13321                                         mips_regmask_frag));
13322     }
13323
13324   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
13325      sort of BFD interface for this.  */
13326   if (mips_any_noreorder)
13327     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
13328   if (mips_pic != NO_PIC)
13329     {
13330     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
13331       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13332     }
13333   if (mips_abicalls)
13334     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
13335
13336   /* Set MIPS ELF flags for ASEs.  */
13337   if (file_ase_mips16)
13338     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
13339 #if 0 /* XXX FIXME */
13340   if (file_ase_mips3d)
13341     elf_elfheader (stdoutput)->e_flags |= ???;
13342 #endif
13343   if (file_ase_mdmx)
13344     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
13345
13346   /* Set the MIPS ELF ABI flags.  */
13347   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
13348     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
13349   else if (mips_abi == O64_ABI)
13350     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
13351   else if (mips_abi == EABI_ABI)
13352     {
13353       if (!file_mips_gp32)
13354         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
13355       else
13356         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
13357     }
13358   else if (mips_abi == N32_ABI)
13359     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
13360
13361   /* Nothing to do for N64_ABI.  */
13362
13363   if (mips_32bitmode)
13364     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
13365 }
13366
13367 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
13368 \f
13369 typedef struct proc {
13370   symbolS *isym;
13371   unsigned long reg_mask;
13372   unsigned long reg_offset;
13373   unsigned long fpreg_mask;
13374   unsigned long fpreg_offset;
13375   unsigned long frame_offset;
13376   unsigned long frame_reg;
13377   unsigned long pc_reg;
13378 } procS;
13379
13380 static procS cur_proc;
13381 static procS *cur_proc_ptr;
13382 static int numprocs;
13383
13384 /* Fill in an rs_align_code fragment.  */
13385
13386 void
13387 mips_handle_align (fragS *fragp)
13388 {
13389   if (fragp->fr_type != rs_align_code)
13390     return;
13391
13392   if (mips_opts.mips16)
13393     {
13394       static const unsigned char be_nop[] = { 0x65, 0x00 };
13395       static const unsigned char le_nop[] = { 0x00, 0x65 };
13396
13397       int bytes;
13398       char *p;
13399
13400       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
13401       p = fragp->fr_literal + fragp->fr_fix;
13402
13403       if (bytes & 1)
13404         {
13405           *p++ = 0;
13406           fragp->fr_fix++;
13407         }
13408
13409       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
13410       fragp->fr_var = 2;
13411     }
13412
13413   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
13414 }
13415
13416 static void
13417 md_obj_begin (void)
13418 {
13419 }
13420
13421 static void
13422 md_obj_end (void)
13423 {
13424   /* check for premature end, nesting errors, etc */
13425   if (cur_proc_ptr)
13426     as_warn (_("missing .end at end of assembly"));
13427 }
13428
13429 static long
13430 get_number (void)
13431 {
13432   int negative = 0;
13433   long val = 0;
13434
13435   if (*input_line_pointer == '-')
13436     {
13437       ++input_line_pointer;
13438       negative = 1;
13439     }
13440   if (!ISDIGIT (*input_line_pointer))
13441     as_bad (_("expected simple number"));
13442   if (input_line_pointer[0] == '0')
13443     {
13444       if (input_line_pointer[1] == 'x')
13445         {
13446           input_line_pointer += 2;
13447           while (ISXDIGIT (*input_line_pointer))
13448             {
13449               val <<= 4;
13450               val |= hex_value (*input_line_pointer++);
13451             }
13452           return negative ? -val : val;
13453         }
13454       else
13455         {
13456           ++input_line_pointer;
13457           while (ISDIGIT (*input_line_pointer))
13458             {
13459               val <<= 3;
13460               val |= *input_line_pointer++ - '0';
13461             }
13462           return negative ? -val : val;
13463         }
13464     }
13465   if (!ISDIGIT (*input_line_pointer))
13466     {
13467       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
13468               *input_line_pointer, *input_line_pointer);
13469       as_warn (_("invalid number"));
13470       return -1;
13471     }
13472   while (ISDIGIT (*input_line_pointer))
13473     {
13474       val *= 10;
13475       val += *input_line_pointer++ - '0';
13476     }
13477   return negative ? -val : val;
13478 }
13479
13480 /* The .file directive; just like the usual .file directive, but there
13481    is an initial number which is the ECOFF file index.  In the non-ECOFF
13482    case .file implies DWARF-2.  */
13483
13484 static void
13485 s_mips_file (int x ATTRIBUTE_UNUSED)
13486 {
13487   static int first_file_directive = 0;
13488
13489   if (ECOFF_DEBUGGING)
13490     {
13491       get_number ();
13492       s_app_file (0);
13493     }
13494   else
13495     {
13496       char *filename;
13497
13498       filename = dwarf2_directive_file (0);
13499
13500       /* Versions of GCC up to 3.1 start files with a ".file"
13501          directive even for stabs output.  Make sure that this
13502          ".file" is handled.  Note that you need a version of GCC
13503          after 3.1 in order to support DWARF-2 on MIPS.  */
13504       if (filename != NULL && ! first_file_directive)
13505         {
13506           (void) new_logical_line (filename, -1);
13507           s_app_file_string (filename);
13508         }
13509       first_file_directive = 1;
13510     }
13511 }
13512
13513 /* The .loc directive, implying DWARF-2.  */
13514
13515 static void
13516 s_mips_loc (int x ATTRIBUTE_UNUSED)
13517 {
13518   if (!ECOFF_DEBUGGING)
13519     dwarf2_directive_loc (0);
13520 }
13521
13522 /* The .end directive.  */
13523
13524 static void
13525 s_mips_end (int x ATTRIBUTE_UNUSED)
13526 {
13527   symbolS *p;
13528
13529   /* Following functions need their own .frame and .cprestore directives.  */
13530   mips_frame_reg_valid = 0;
13531   mips_cprestore_valid = 0;
13532
13533   if (!is_end_of_line[(unsigned char) *input_line_pointer])
13534     {
13535       p = get_symbol ();
13536       demand_empty_rest_of_line ();
13537     }
13538   else
13539     p = NULL;
13540
13541   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
13542     as_warn (_(".end not in text section"));
13543
13544   if (!cur_proc_ptr)
13545     {
13546       as_warn (_(".end directive without a preceding .ent directive."));
13547       demand_empty_rest_of_line ();
13548       return;
13549     }
13550
13551   if (p != NULL)
13552     {
13553       assert (S_GET_NAME (p));
13554       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->isym)))
13555         as_warn (_(".end symbol does not match .ent symbol."));
13556
13557       if (debug_type == DEBUG_STABS)
13558         stabs_generate_asm_endfunc (S_GET_NAME (p),
13559                                     S_GET_NAME (p));
13560     }
13561   else
13562     as_warn (_(".end directive missing or unknown symbol"));
13563
13564 #ifdef OBJ_ELF
13565   /* Generate a .pdr section.  */
13566   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING
13567       && mips_flag_pdr)
13568     {
13569       segT saved_seg = now_seg;
13570       subsegT saved_subseg = now_subseg;
13571       valueT dot;
13572       expressionS exp;
13573       char *fragp;
13574
13575       dot = frag_now_fix ();
13576
13577 #ifdef md_flush_pending_output
13578       md_flush_pending_output ();
13579 #endif
13580
13581       assert (pdr_seg);
13582       subseg_set (pdr_seg, 0);
13583
13584       /* Write the symbol.  */
13585       exp.X_op = O_symbol;
13586       exp.X_add_symbol = p;
13587       exp.X_add_number = 0;
13588       emit_expr (&exp, 4);
13589
13590       fragp = frag_more (7 * 4);
13591
13592       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
13593       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
13594       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
13595       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
13596       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
13597       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
13598       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
13599
13600       subseg_set (saved_seg, saved_subseg);
13601     }
13602 #endif /* OBJ_ELF */
13603
13604   cur_proc_ptr = NULL;
13605 }
13606
13607 /* The .aent and .ent directives.  */
13608
13609 static void
13610 s_mips_ent (int aent)
13611 {
13612   symbolS *symbolP;
13613
13614   symbolP = get_symbol ();
13615   if (*input_line_pointer == ',')
13616     ++input_line_pointer;
13617   SKIP_WHITESPACE ();
13618   if (ISDIGIT (*input_line_pointer)
13619       || *input_line_pointer == '-')
13620     get_number ();
13621
13622   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
13623     as_warn (_(".ent or .aent not in text section."));
13624
13625   if (!aent && cur_proc_ptr)
13626     as_warn (_("missing .end"));
13627
13628   if (!aent)
13629     {
13630       /* This function needs its own .frame and .cprestore directives.  */
13631       mips_frame_reg_valid = 0;
13632       mips_cprestore_valid = 0;
13633
13634       cur_proc_ptr = &cur_proc;
13635       memset (cur_proc_ptr, '\0', sizeof (procS));
13636
13637       cur_proc_ptr->isym = symbolP;
13638
13639       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
13640
13641       ++numprocs;
13642
13643       if (debug_type == DEBUG_STABS)
13644         stabs_generate_asm_func (S_GET_NAME (symbolP),
13645                                  S_GET_NAME (symbolP));
13646     }
13647
13648   demand_empty_rest_of_line ();
13649 }
13650
13651 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
13652    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
13653    s_mips_frame is used so that we can set the PDR information correctly.
13654    We can't use the ecoff routines because they make reference to the ecoff
13655    symbol table (in the mdebug section).  */
13656
13657 static void
13658 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
13659 {
13660 #ifdef OBJ_ELF
13661   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
13662     {
13663       long val;
13664
13665       if (cur_proc_ptr == (procS *) NULL)
13666         {
13667           as_warn (_(".frame outside of .ent"));
13668           demand_empty_rest_of_line ();
13669           return;
13670         }
13671
13672       cur_proc_ptr->frame_reg = tc_get_register (1);
13673
13674       SKIP_WHITESPACE ();
13675       if (*input_line_pointer++ != ','
13676           || get_absolute_expression_and_terminator (&val) != ',')
13677         {
13678           as_warn (_("Bad .frame directive"));
13679           --input_line_pointer;
13680           demand_empty_rest_of_line ();
13681           return;
13682         }
13683
13684       cur_proc_ptr->frame_offset = val;
13685       cur_proc_ptr->pc_reg = tc_get_register (0);
13686
13687       demand_empty_rest_of_line ();
13688     }
13689   else
13690 #endif /* OBJ_ELF */
13691     s_ignore (ignore);
13692 }
13693
13694 /* The .fmask and .mask directives. If the mdebug section is present
13695    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
13696    embedded targets, s_mips_mask is used so that we can set the PDR
13697    information correctly. We can't use the ecoff routines because they
13698    make reference to the ecoff symbol table (in the mdebug section).  */
13699
13700 static void
13701 s_mips_mask (int reg_type)
13702 {
13703 #ifdef OBJ_ELF
13704   if (OUTPUT_FLAVOR == bfd_target_elf_flavour && ! ECOFF_DEBUGGING)
13705     {
13706       long mask, off;
13707
13708       if (cur_proc_ptr == (procS *) NULL)
13709         {
13710           as_warn (_(".mask/.fmask outside of .ent"));
13711           demand_empty_rest_of_line ();
13712           return;
13713         }
13714
13715       if (get_absolute_expression_and_terminator (&mask) != ',')
13716         {
13717           as_warn (_("Bad .mask/.fmask directive"));
13718           --input_line_pointer;
13719           demand_empty_rest_of_line ();
13720           return;
13721         }
13722
13723       off = get_absolute_expression ();
13724
13725       if (reg_type == 'F')
13726         {
13727           cur_proc_ptr->fpreg_mask = mask;
13728           cur_proc_ptr->fpreg_offset = off;
13729         }
13730       else
13731         {
13732           cur_proc_ptr->reg_mask = mask;
13733           cur_proc_ptr->reg_offset = off;
13734         }
13735
13736       demand_empty_rest_of_line ();
13737     }
13738   else
13739 #endif /* OBJ_ELF */
13740     s_ignore (reg_type);
13741 }
13742
13743 /* The .loc directive.  */
13744
13745 #if 0
13746 static void
13747 s_loc (int x)
13748 {
13749   symbolS *symbolP;
13750   int lineno;
13751   int addroff;
13752
13753   assert (now_seg == text_section);
13754
13755   lineno = get_number ();
13756   addroff = frag_now_fix ();
13757
13758   symbolP = symbol_new ("", N_SLINE, addroff, frag_now);
13759   S_SET_TYPE (symbolP, N_SLINE);
13760   S_SET_OTHER (symbolP, 0);
13761   S_SET_DESC (symbolP, lineno);
13762   symbolP->sy_segment = now_seg;
13763 }
13764 #endif
13765
13766 /* A table describing all the processors gas knows about.  Names are
13767    matched in the order listed.
13768
13769    To ease comparison, please keep this table in the same order as
13770    gcc's mips_cpu_info_table[].  */
13771 static const struct mips_cpu_info mips_cpu_info_table[] =
13772 {
13773   /* Entries for generic ISAs */
13774   { "mips1",          1,      ISA_MIPS1,      CPU_R3000 },
13775   { "mips2",          1,      ISA_MIPS2,      CPU_R6000 },
13776   { "mips3",          1,      ISA_MIPS3,      CPU_R4000 },
13777   { "mips4",          1,      ISA_MIPS4,      CPU_R8000 },
13778   { "mips5",          1,      ISA_MIPS5,      CPU_MIPS5 },
13779   { "mips32",         1,      ISA_MIPS32,     CPU_MIPS32 },
13780   { "mips32r2",       1,      ISA_MIPS32R2,   CPU_MIPS32R2 },
13781   { "mips64",         1,      ISA_MIPS64,     CPU_MIPS64 },
13782   { "mips64r2",       1,      ISA_MIPS64R2,   CPU_MIPS64R2 },
13783
13784   /* MIPS I */
13785   { "r3000",          0,      ISA_MIPS1,      CPU_R3000 },
13786   { "r2000",          0,      ISA_MIPS1,      CPU_R3000 },
13787   { "r3900",          0,      ISA_MIPS1,      CPU_R3900 },
13788
13789   /* MIPS II */
13790   { "r6000",          0,      ISA_MIPS2,      CPU_R6000 },
13791
13792   /* MIPS III */
13793   { "r4000",          0,      ISA_MIPS3,      CPU_R4000 },
13794   { "r4010",          0,      ISA_MIPS2,      CPU_R4010 },
13795   { "vr4100",         0,      ISA_MIPS3,      CPU_VR4100 },
13796   { "vr4111",         0,      ISA_MIPS3,      CPU_R4111 },
13797   { "vr4120",         0,      ISA_MIPS3,      CPU_VR4120 },
13798   { "vr4130",         0,      ISA_MIPS3,      CPU_VR4120 },
13799   { "vr4181",         0,      ISA_MIPS3,      CPU_R4111 },
13800   { "vr4300",         0,      ISA_MIPS3,      CPU_R4300 },
13801   { "r4400",          0,      ISA_MIPS3,      CPU_R4400 },
13802   { "r4600",          0,      ISA_MIPS3,      CPU_R4600 },
13803   { "orion",          0,      ISA_MIPS3,      CPU_R4600 },
13804   { "r4650",          0,      ISA_MIPS3,      CPU_R4650 },
13805
13806   /* MIPS IV */
13807   { "r8000",          0,      ISA_MIPS4,      CPU_R8000 },
13808   { "r10000",         0,      ISA_MIPS4,      CPU_R10000 },
13809   { "r12000",         0,      ISA_MIPS4,      CPU_R12000 },
13810   { "vr5000",         0,      ISA_MIPS4,      CPU_R5000 },
13811   { "vr5400",         0,      ISA_MIPS4,      CPU_VR5400 },
13812   { "vr5500",         0,      ISA_MIPS4,      CPU_VR5500 },
13813   { "rm5200",         0,      ISA_MIPS4,      CPU_R5000 },
13814   { "rm5230",         0,      ISA_MIPS4,      CPU_R5000 },
13815   { "rm5231",         0,      ISA_MIPS4,      CPU_R5000 },
13816   { "rm5261",         0,      ISA_MIPS4,      CPU_R5000 },
13817   { "rm5721",         0,      ISA_MIPS4,      CPU_R5000 },
13818   { "rm7000",         0,      ISA_MIPS4,      CPU_RM7000 },
13819   { "rm9000",         0,      ISA_MIPS4,      CPU_RM7000 },
13820
13821   /* MIPS 32 */
13822   { "4kc",            0,      ISA_MIPS32,     CPU_MIPS32 },
13823   { "4km",            0,      ISA_MIPS32,     CPU_MIPS32 },
13824   { "4kp",            0,      ISA_MIPS32,     CPU_MIPS32 },
13825
13826   /* MIPS 64 */
13827   { "5kc",            0,      ISA_MIPS64,     CPU_MIPS64 },
13828   { "20kc",           0,      ISA_MIPS64,     CPU_MIPS64 },
13829
13830   /* Broadcom SB-1 CPU core */
13831   { "sb1",            0,      ISA_MIPS64,     CPU_SB1 },
13832
13833   /* End marker */
13834   { NULL, 0, 0, 0 }
13835 };
13836
13837
13838 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
13839    with a final "000" replaced by "k".  Ignore case.
13840
13841    Note: this function is shared between GCC and GAS.  */
13842
13843 static bfd_boolean
13844 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
13845 {
13846   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
13847     given++, canonical++;
13848
13849   return ((*given == 0 && *canonical == 0)
13850           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
13851 }
13852
13853
13854 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
13855    CPU name.  We've traditionally allowed a lot of variation here.
13856
13857    Note: this function is shared between GCC and GAS.  */
13858
13859 static bfd_boolean
13860 mips_matching_cpu_name_p (const char *canonical, const char *given)
13861 {
13862   /* First see if the name matches exactly, or with a final "000"
13863      turned into "k".  */
13864   if (mips_strict_matching_cpu_name_p (canonical, given))
13865     return TRUE;
13866
13867   /* If not, try comparing based on numerical designation alone.
13868      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
13869   if (TOLOWER (*given) == 'r')
13870     given++;
13871   if (!ISDIGIT (*given))
13872     return FALSE;
13873
13874   /* Skip over some well-known prefixes in the canonical name,
13875      hoping to find a number there too.  */
13876   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
13877     canonical += 2;
13878   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
13879     canonical += 2;
13880   else if (TOLOWER (canonical[0]) == 'r')
13881     canonical += 1;
13882
13883   return mips_strict_matching_cpu_name_p (canonical, given);
13884 }
13885
13886
13887 /* Parse an option that takes the name of a processor as its argument.
13888    OPTION is the name of the option and CPU_STRING is the argument.
13889    Return the corresponding processor enumeration if the CPU_STRING is
13890    recognized, otherwise report an error and return null.
13891
13892    A similar function exists in GCC.  */
13893
13894 static const struct mips_cpu_info *
13895 mips_parse_cpu (const char *option, const char *cpu_string)
13896 {
13897   const struct mips_cpu_info *p;
13898
13899   /* 'from-abi' selects the most compatible architecture for the given
13900      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
13901      EABIs, we have to decide whether we're using the 32-bit or 64-bit
13902      version.  Look first at the -mgp options, if given, otherwise base
13903      the choice on MIPS_DEFAULT_64BIT.
13904
13905      Treat NO_ABI like the EABIs.  One reason to do this is that the
13906      plain 'mips' and 'mips64' configs have 'from-abi' as their default
13907      architecture.  This code picks MIPS I for 'mips' and MIPS III for
13908      'mips64', just as we did in the days before 'from-abi'.  */
13909   if (strcasecmp (cpu_string, "from-abi") == 0)
13910     {
13911       if (ABI_NEEDS_32BIT_REGS (mips_abi))
13912         return mips_cpu_info_from_isa (ISA_MIPS1);
13913
13914       if (ABI_NEEDS_64BIT_REGS (mips_abi))
13915         return mips_cpu_info_from_isa (ISA_MIPS3);
13916
13917       if (file_mips_gp32 >= 0)
13918         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
13919
13920       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
13921                                      ? ISA_MIPS3
13922                                      : ISA_MIPS1);
13923     }
13924
13925   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
13926   if (strcasecmp (cpu_string, "default") == 0)
13927     return 0;
13928
13929   for (p = mips_cpu_info_table; p->name != 0; p++)
13930     if (mips_matching_cpu_name_p (p->name, cpu_string))
13931       return p;
13932
13933   as_bad ("Bad value (%s) for %s", cpu_string, option);
13934   return 0;
13935 }
13936
13937 /* Return the canonical processor information for ISA (a member of the
13938    ISA_MIPS* enumeration).  */
13939
13940 static const struct mips_cpu_info *
13941 mips_cpu_info_from_isa (int isa)
13942 {
13943   int i;
13944
13945   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
13946     if (mips_cpu_info_table[i].is_isa
13947         && isa == mips_cpu_info_table[i].isa)
13948       return (&mips_cpu_info_table[i]);
13949
13950   return NULL;
13951 }
13952
13953 static const struct mips_cpu_info *
13954 mips_cpu_info_from_arch (int arch)
13955 {
13956   int i;
13957
13958   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
13959     if (arch == mips_cpu_info_table[i].cpu)
13960       return (&mips_cpu_info_table[i]);
13961
13962   return NULL;
13963 }
13964 \f
13965 static void
13966 show (FILE *stream, const char *string, int *col_p, int *first_p)
13967 {
13968   if (*first_p)
13969     {
13970       fprintf (stream, "%24s", "");
13971       *col_p = 24;
13972     }
13973   else
13974     {
13975       fprintf (stream, ", ");
13976       *col_p += 2;
13977     }
13978
13979   if (*col_p + strlen (string) > 72)
13980     {
13981       fprintf (stream, "\n%24s", "");
13982       *col_p = 24;
13983     }
13984
13985   fprintf (stream, "%s", string);
13986   *col_p += strlen (string);
13987
13988   *first_p = 0;
13989 }
13990
13991 void
13992 md_show_usage (FILE *stream)
13993 {
13994   int column, first;
13995   size_t i;
13996
13997   fprintf (stream, _("\
13998 MIPS options:\n\
13999 -EB                     generate big endian output\n\
14000 -EL                     generate little endian output\n\
14001 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
14002 -G NUM                  allow referencing objects up to NUM bytes\n\
14003                         implicitly with the gp register [default 8]\n"));
14004   fprintf (stream, _("\
14005 -mips1                  generate MIPS ISA I instructions\n\
14006 -mips2                  generate MIPS ISA II instructions\n\
14007 -mips3                  generate MIPS ISA III instructions\n\
14008 -mips4                  generate MIPS ISA IV instructions\n\
14009 -mips5                  generate MIPS ISA V instructions\n\
14010 -mips32                 generate MIPS32 ISA instructions\n\
14011 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
14012 -mips64                 generate MIPS64 ISA instructions\n\
14013 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
14014 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
14015
14016   first = 1;
14017
14018   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14019     show (stream, mips_cpu_info_table[i].name, &column, &first);
14020   show (stream, "from-abi", &column, &first);
14021   fputc ('\n', stream);
14022
14023   fprintf (stream, _("\
14024 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
14025 -no-mCPU                don't generate code specific to CPU.\n\
14026                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
14027
14028   first = 1;
14029
14030   show (stream, "3900", &column, &first);
14031   show (stream, "4010", &column, &first);
14032   show (stream, "4100", &column, &first);
14033   show (stream, "4650", &column, &first);
14034   fputc ('\n', stream);
14035
14036   fprintf (stream, _("\
14037 -mips16                 generate mips16 instructions\n\
14038 -no-mips16              do not generate mips16 instructions\n"));
14039   fprintf (stream, _("\
14040 -mfix-vr4120            work around certain VR4120 errata\n\
14041 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
14042 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
14043 -O0                     remove unneeded NOPs, do not swap branches\n\
14044 -O                      remove unneeded NOPs and swap branches\n\
14045 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
14046 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
14047 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
14048 #ifdef OBJ_ELF
14049   fprintf (stream, _("\
14050 -KPIC, -call_shared     generate SVR4 position independent code\n\
14051 -non_shared             do not generate position independent code\n\
14052 -xgot                   assume a 32 bit GOT\n\
14053 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
14054 -mabi=ABI               create ABI conformant object file for:\n"));
14055
14056   first = 1;
14057
14058   show (stream, "32", &column, &first);
14059   show (stream, "o64", &column, &first);
14060   show (stream, "n32", &column, &first);
14061   show (stream, "64", &column, &first);
14062   show (stream, "eabi", &column, &first);
14063
14064   fputc ('\n', stream);
14065
14066   fprintf (stream, _("\
14067 -32                     create o32 ABI object file (default)\n\
14068 -n32                    create n32 ABI object file\n\
14069 -64                     create 64 ABI object file\n"));
14070 #endif
14071 }
14072
14073 enum dwarf2_format
14074 mips_dwarf2_format (void)
14075 {
14076   if (mips_abi == N64_ABI)
14077     {
14078 #ifdef TE_IRIX
14079       return dwarf2_format_64bit_irix;
14080 #else
14081       return dwarf2_format_64bit;
14082 #endif
14083     }
14084   else
14085     return dwarf2_format_32bit;
14086 }
14087
14088 int
14089 mips_dwarf2_addr_size (void)
14090 {
14091   if (mips_abi == N64_ABI)
14092     return 8;
14093   else
14094     return 4;
14095 }