* gas/mips/jalr.s: New test.
[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, 2005, 2006, 2007, 2008 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 3, or (at your option)
14    any later version.
15
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25
26 #include "as.h"
27 #include "config.h"
28 #include "subsegs.h"
29 #include "safe-ctype.h"
30
31 #include "opcode/mips.h"
32 #include "itbl-ops.h"
33 #include "dwarf2dbg.h"
34 #include "dw2gencfi.h"
35
36 #ifdef DEBUG
37 #define DBG(x) printf x
38 #else
39 #define DBG(x)
40 #endif
41
42 #ifdef OBJ_MAYBE_ELF
43 /* Clean up namespace so we can include obj-elf.h too.  */
44 static int mips_output_flavor (void);
45 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
46 #undef OBJ_PROCESS_STAB
47 #undef OUTPUT_FLAVOR
48 #undef S_GET_ALIGN
49 #undef S_GET_SIZE
50 #undef S_SET_ALIGN
51 #undef S_SET_SIZE
52 #undef obj_frob_file
53 #undef obj_frob_file_after_relocs
54 #undef obj_frob_symbol
55 #undef obj_pop_insert
56 #undef obj_sec_sym_ok_for_reloc
57 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
58
59 #include "obj-elf.h"
60 /* Fix any of them that we actually care about.  */
61 #undef OUTPUT_FLAVOR
62 #define OUTPUT_FLAVOR mips_output_flavor()
63 #endif
64
65 #if defined (OBJ_ELF)
66 #include "elf/mips.h"
67 #endif
68
69 #ifndef ECOFF_DEBUGGING
70 #define NO_ECOFF_DEBUGGING
71 #define ECOFF_DEBUGGING 0
72 #endif
73
74 int mips_flag_mdebug = -1;
75
76 /* Control generation of .pdr sections.  Off by default on IRIX: the native
77    linker doesn't know about and discards them, but relocations against them
78    remain, leading to rld crashes.  */
79 #ifdef TE_IRIX
80 int mips_flag_pdr = FALSE;
81 #else
82 int mips_flag_pdr = TRUE;
83 #endif
84
85 #include "ecoff.h"
86
87 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
88 static char *mips_regmask_frag;
89 #endif
90
91 #define ZERO 0
92 #define ATREG 1
93 #define TREG 24
94 #define PIC_CALL_REG 25
95 #define KT0 26
96 #define KT1 27
97 #define GP  28
98 #define SP  29
99 #define FP  30
100 #define RA  31
101
102 #define ILLEGAL_REG (32)
103
104 #define AT  mips_opts.at
105
106 /* Allow override of standard little-endian ECOFF format.  */
107
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
111
112 extern int target_big_endian;
113
114 /* The name of the readonly data section.  */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116                             ? ".rdata" \
117                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118                             ? ".rdata" \
119                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120                             ? ".rodata" \
121                             : (abort (), ""))
122
123 /* Information about an instruction, including its format, operands
124    and fixups.  */
125 struct mips_cl_insn
126 {
127   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
128   const struct mips_opcode *insn_mo;
129
130   /* True if this is a mips16 instruction and if we want the extended
131      form of INSN_MO.  */
132   bfd_boolean use_extend;
133
134   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
135   unsigned short extend;
136
137   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
138      a copy of INSN_MO->match with the operands filled in.  */
139   unsigned long insn_opcode;
140
141   /* The frag that contains the instruction.  */
142   struct frag *frag;
143
144   /* The offset into FRAG of the first instruction byte.  */
145   long where;
146
147   /* The relocs associated with the instruction, if any.  */
148   fixS *fixp[3];
149
150   /* True if this entry cannot be moved from its current position.  */
151   unsigned int fixed_p : 1;
152
153   /* True if this instruction occurred in a .set noreorder block.  */
154   unsigned int noreorder_p : 1;
155
156   /* True for mips16 instructions that jump to an absolute address.  */
157   unsigned int mips16_absolute_jump_p : 1;
158 };
159
160 /* The ABI to use.  */
161 enum mips_abi_level
162 {
163   NO_ABI = 0,
164   O32_ABI,
165   O64_ABI,
166   N32_ABI,
167   N64_ABI,
168   EABI_ABI
169 };
170
171 /* MIPS ABI we are using for this output file.  */
172 static enum mips_abi_level mips_abi = NO_ABI;
173
174 /* Whether or not we have code that can call pic code.  */
175 int mips_abicalls = FALSE;
176
177 /* Whether or not we have code which can be put into a shared
178    library.  */
179 static bfd_boolean mips_in_shared = TRUE;
180
181 /* This is the set of options which may be modified by the .set
182    pseudo-op.  We use a struct so that .set push and .set pop are more
183    reliable.  */
184
185 struct mips_set_options
186 {
187   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
188      if it has not been initialized.  Changed by `.set mipsN', and the
189      -mipsN command line option, and the default CPU.  */
190   int isa;
191   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
192      if they have not been initialized.  Changed by `.set <asename>', by
193      command line options, and based on the default architecture.  */
194   int ase_mips3d;
195   int ase_mdmx;
196   int ase_smartmips;
197   int ase_dsp;
198   int ase_dspr2;
199   int ase_mt;
200   /* Whether we are assembling for the mips16 processor.  0 if we are
201      not, 1 if we are, and -1 if the value has not been initialized.
202      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
203      -nomips16 command line options, and the default CPU.  */
204   int mips16;
205   /* Non-zero if we should not reorder instructions.  Changed by `.set
206      reorder' and `.set noreorder'.  */
207   int noreorder;
208   /* Non-zero if we should not permit the register designated "assembler
209      temporary" to be used in instructions.  The value is the register
210      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
211      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
212   unsigned int at;
213   /* Non-zero if we should warn when a macro instruction expands into
214      more than one machine instruction.  Changed by `.set nomacro' and
215      `.set macro'.  */
216   int warn_about_macros;
217   /* Non-zero if we should not move instructions.  Changed by `.set
218      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
219   int nomove;
220   /* Non-zero if we should not optimize branches by moving the target
221      of the branch into the delay slot.  Actually, we don't perform
222      this optimization anyhow.  Changed by `.set bopt' and `.set
223      nobopt'.  */
224   int nobopt;
225   /* Non-zero if we should not autoextend mips16 instructions.
226      Changed by `.set autoextend' and `.set noautoextend'.  */
227   int noautoextend;
228   /* Restrict general purpose registers and floating point registers
229      to 32 bit.  This is initially determined when -mgp32 or -mfp32
230      is passed but can changed if the assembler code uses .set mipsN.  */
231   int gp32;
232   int fp32;
233   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
234      command line option, and the default CPU.  */
235   int arch;
236   /* True if ".set sym32" is in effect.  */
237   bfd_boolean sym32;
238 };
239
240 /* True if -mgp32 was passed.  */
241 static int file_mips_gp32 = -1;
242
243 /* True if -mfp32 was passed.  */
244 static int file_mips_fp32 = -1;
245
246 /* This is the struct we use to hold the current set of options.  Note
247    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
248    -1 to indicate that they have not been initialized.  */
249
250 static struct mips_set_options mips_opts =
251 {
252   ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, -1, 0, ATREG, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
253 };
254
255 /* These variables are filled in with the masks of registers used.
256    The object format code reads them and puts them in the appropriate
257    place.  */
258 unsigned long mips_gprmask;
259 unsigned long mips_cprmask[4];
260
261 /* MIPS ISA we are using for this output file.  */
262 static int file_mips_isa = ISA_UNKNOWN;
263
264 /* True if -mips16 was passed or implied by arguments passed on the
265    command line (e.g., by -march).  */
266 static int file_ase_mips16;
267
268 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
269                               || mips_opts.isa == ISA_MIPS32R2          \
270                               || mips_opts.isa == ISA_MIPS64            \
271                               || mips_opts.isa == ISA_MIPS64R2)
272
273 /* True if -mips3d was passed or implied by arguments passed on the
274    command line (e.g., by -march).  */
275 static int file_ase_mips3d;
276
277 /* True if -mdmx was passed or implied by arguments passed on the
278    command line (e.g., by -march).  */
279 static int file_ase_mdmx;
280
281 /* True if -msmartmips was passed or implied by arguments passed on the
282    command line (e.g., by -march).  */
283 static int file_ase_smartmips;
284
285 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
286                                 || mips_opts.isa == ISA_MIPS32R2)
287
288 /* True if -mdsp was passed or implied by arguments passed on the
289    command line (e.g., by -march).  */
290 static int file_ase_dsp;
291
292 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
293                               || mips_opts.isa == ISA_MIPS64R2)
294
295 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
296
297 /* True if -mdspr2 was passed or implied by arguments passed on the
298    command line (e.g., by -march).  */
299 static int file_ase_dspr2;
300
301 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
302                                 || mips_opts.isa == ISA_MIPS64R2)
303
304 /* True if -mmt was passed or implied by arguments passed on the
305    command line (e.g., by -march).  */
306 static int file_ase_mt;
307
308 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
309                              || mips_opts.isa == ISA_MIPS64R2)
310
311 /* The argument of the -march= flag.  The architecture we are assembling.  */
312 static int file_mips_arch = CPU_UNKNOWN;
313 static const char *mips_arch_string;
314
315 /* The argument of the -mtune= flag.  The architecture for which we
316    are optimizing.  */
317 static int mips_tune = CPU_UNKNOWN;
318 static const char *mips_tune_string;
319
320 /* True when generating 32-bit code for a 64-bit processor.  */
321 static int mips_32bitmode = 0;
322
323 /* True if the given ABI requires 32-bit registers.  */
324 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
325
326 /* Likewise 64-bit registers.  */
327 #define ABI_NEEDS_64BIT_REGS(ABI)       \
328   ((ABI) == N32_ABI                     \
329    || (ABI) == N64_ABI                  \
330    || (ABI) == O64_ABI)
331
332 /*  Return true if ISA supports 64 bit wide gp registers.  */
333 #define ISA_HAS_64BIT_REGS(ISA)         \
334   ((ISA) == ISA_MIPS3                   \
335    || (ISA) == ISA_MIPS4                \
336    || (ISA) == ISA_MIPS5                \
337    || (ISA) == ISA_MIPS64               \
338    || (ISA) == ISA_MIPS64R2)
339
340 /*  Return true if ISA supports 64 bit wide float registers.  */
341 #define ISA_HAS_64BIT_FPRS(ISA)         \
342   ((ISA) == ISA_MIPS3                   \
343    || (ISA) == ISA_MIPS4                \
344    || (ISA) == ISA_MIPS5                \
345    || (ISA) == ISA_MIPS32R2             \
346    || (ISA) == ISA_MIPS64               \
347    || (ISA) == ISA_MIPS64R2)
348
349 /* Return true if ISA supports 64-bit right rotate (dror et al.)
350    instructions.  */
351 #define ISA_HAS_DROR(ISA)               \
352   ((ISA) == ISA_MIPS64R2)
353
354 /* Return true if ISA supports 32-bit right rotate (ror et al.)
355    instructions.  */
356 #define ISA_HAS_ROR(ISA)                \
357   ((ISA) == ISA_MIPS32R2                \
358    || (ISA) == ISA_MIPS64R2             \
359    || mips_opts.ase_smartmips)
360
361 /* Return true if ISA supports single-precision floats in odd registers.  */
362 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
363   ((ISA) == ISA_MIPS32                  \
364    || (ISA) == ISA_MIPS32R2             \
365    || (ISA) == ISA_MIPS64               \
366    || (ISA) == ISA_MIPS64R2)
367
368 /* Return true if ISA supports move to/from high part of a 64-bit
369    floating-point register. */
370 #define ISA_HAS_MXHC1(ISA)              \
371   ((ISA) == ISA_MIPS32R2                \
372    || (ISA) == ISA_MIPS64R2)
373
374 #define HAVE_32BIT_GPRS                            \
375     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
376
377 #define HAVE_32BIT_FPRS                            \
378     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
379
380 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
381 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
382
383 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
384
385 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
386
387 /* True if relocations are stored in-place.  */
388 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
389
390 /* The ABI-derived address size.  */
391 #define HAVE_64BIT_ADDRESSES \
392   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
393 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
394
395 /* The size of symbolic constants (i.e., expressions of the form
396    "SYMBOL" or "SYMBOL + OFFSET").  */
397 #define HAVE_32BIT_SYMBOLS \
398   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
399 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
400
401 /* Addresses are loaded in different ways, depending on the address size
402    in use.  The n32 ABI Documentation also mandates the use of additions
403    with overflow checking, but existing implementations don't follow it.  */
404 #define ADDRESS_ADD_INSN                                                \
405    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
406
407 #define ADDRESS_ADDI_INSN                                               \
408    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
409
410 #define ADDRESS_LOAD_INSN                                               \
411    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
412
413 #define ADDRESS_STORE_INSN                                              \
414    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
415
416 /* Return true if the given CPU supports the MIPS16 ASE.  */
417 #define CPU_HAS_MIPS16(cpu)                                             \
418    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
419     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
420
421 /* True if CPU has a dror instruction.  */
422 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
423
424 /* True if CPU has a ror instruction.  */
425 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
426
427 /* True if mflo and mfhi can be immediately followed by instructions
428    which write to the HI and LO registers.
429
430    According to MIPS specifications, MIPS ISAs I, II, and III need
431    (at least) two instructions between the reads of HI/LO and
432    instructions which write them, and later ISAs do not.  Contradicting
433    the MIPS specifications, some MIPS IV processor user manuals (e.g.
434    the UM for the NEC Vr5000) document needing the instructions between
435    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
436    MIPS64 and later ISAs to have the interlocks, plus any specific
437    earlier-ISA CPUs for which CPU documentation declares that the
438    instructions are really interlocked.  */
439 #define hilo_interlocks \
440   (mips_opts.isa == ISA_MIPS32                        \
441    || mips_opts.isa == ISA_MIPS32R2                   \
442    || mips_opts.isa == ISA_MIPS64                     \
443    || mips_opts.isa == ISA_MIPS64R2                   \
444    || mips_opts.arch == CPU_R4010                     \
445    || mips_opts.arch == CPU_R10000                    \
446    || mips_opts.arch == CPU_R12000                    \
447    || mips_opts.arch == CPU_RM7000                    \
448    || mips_opts.arch == CPU_VR5500                    \
449    )
450
451 /* Whether the processor uses hardware interlocks to protect reads
452    from the GPRs after they are loaded from memory, and thus does not
453    require nops to be inserted.  This applies to instructions marked
454    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
455    level I.  */
456 #define gpr_interlocks \
457   (mips_opts.isa != ISA_MIPS1  \
458    || mips_opts.arch == CPU_R3900)
459
460 /* Whether the processor uses hardware interlocks to avoid delays
461    required by coprocessor instructions, and thus does not require
462    nops to be inserted.  This applies to instructions marked
463    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
464    between instructions marked INSN_WRITE_COND_CODE and ones marked
465    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
466    levels I, II, and III.  */
467 /* Itbl support may require additional care here.  */
468 #define cop_interlocks                                \
469   ((mips_opts.isa != ISA_MIPS1                        \
470     && mips_opts.isa != ISA_MIPS2                     \
471     && mips_opts.isa != ISA_MIPS3)                    \
472    || mips_opts.arch == CPU_R4300                     \
473    )
474
475 /* Whether the processor uses hardware interlocks to protect reads
476    from coprocessor registers after they are loaded from memory, and
477    thus does not require nops to be inserted.  This applies to
478    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
479    requires at MIPS ISA level I.  */
480 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
481
482 /* Is this a mfhi or mflo instruction?  */
483 #define MF_HILO_INSN(PINFO) \
484           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
485
486 /* MIPS PIC level.  */
487
488 enum mips_pic_level mips_pic;
489
490 /* 1 if we should generate 32 bit offsets from the $gp register in
491    SVR4_PIC mode.  Currently has no meaning in other modes.  */
492 static int mips_big_got = 0;
493
494 /* 1 if trap instructions should used for overflow rather than break
495    instructions.  */
496 static int mips_trap = 0;
497
498 /* 1 if double width floating point constants should not be constructed
499    by assembling two single width halves into two single width floating
500    point registers which just happen to alias the double width destination
501    register.  On some architectures this aliasing can be disabled by a bit
502    in the status register, and the setting of this bit cannot be determined
503    automatically at assemble time.  */
504 static int mips_disable_float_construction;
505
506 /* Non-zero if any .set noreorder directives were used.  */
507
508 static int mips_any_noreorder;
509
510 /* Non-zero if nops should be inserted when the register referenced in
511    an mfhi/mflo instruction is read in the next two instructions.  */
512 static int mips_7000_hilo_fix;
513
514 /* The size of objects in the small data section.  */
515 static unsigned int g_switch_value = 8;
516 /* Whether the -G option was used.  */
517 static int g_switch_seen = 0;
518
519 #define N_RMASK 0xc4
520 #define N_VFP   0xd4
521
522 /* If we can determine in advance that GP optimization won't be
523    possible, we can skip the relaxation stuff that tries to produce
524    GP-relative references.  This makes delay slot optimization work
525    better.
526
527    This function can only provide a guess, but it seems to work for
528    gcc output.  It needs to guess right for gcc, otherwise gcc
529    will put what it thinks is a GP-relative instruction in a branch
530    delay slot.
531
532    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
533    fixed it for the non-PIC mode.  KR 95/04/07  */
534 static int nopic_need_relax (symbolS *, int);
535
536 /* handle of the OPCODE hash table */
537 static struct hash_control *op_hash = NULL;
538
539 /* The opcode hash table we use for the mips16.  */
540 static struct hash_control *mips16_op_hash = NULL;
541
542 /* This array holds the chars that always start a comment.  If the
543     pre-processor is disabled, these aren't very useful */
544 const char comment_chars[] = "#";
545
546 /* This array holds the chars that only start a comment at the beginning of
547    a line.  If the line seems to have the form '# 123 filename'
548    .line and .file directives will appear in the pre-processed output */
549 /* Note that input_file.c hand checks for '#' at the beginning of the
550    first line of the input file.  This is because the compiler outputs
551    #NO_APP at the beginning of its output.  */
552 /* Also note that C style comments are always supported.  */
553 const char line_comment_chars[] = "#";
554
555 /* This array holds machine specific line separator characters.  */
556 const char line_separator_chars[] = ";";
557
558 /* Chars that can be used to separate mant from exp in floating point nums */
559 const char EXP_CHARS[] = "eE";
560
561 /* Chars that mean this number is a floating point constant */
562 /* As in 0f12.456 */
563 /* or    0d1.2345e12 */
564 const char FLT_CHARS[] = "rRsSfFdDxXpP";
565
566 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
567    changed in read.c .  Ideally it shouldn't have to know about it at all,
568    but nothing is ideal around here.
569  */
570
571 static char *insn_error;
572
573 static int auto_align = 1;
574
575 /* When outputting SVR4 PIC code, the assembler needs to know the
576    offset in the stack frame from which to restore the $gp register.
577    This is set by the .cprestore pseudo-op, and saved in this
578    variable.  */
579 static offsetT mips_cprestore_offset = -1;
580
581 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
582    more optimizations, it can use a register value instead of a memory-saved
583    offset and even an other register than $gp as global pointer.  */
584 static offsetT mips_cpreturn_offset = -1;
585 static int mips_cpreturn_register = -1;
586 static int mips_gp_register = GP;
587 static int mips_gprel_offset = 0;
588
589 /* Whether mips_cprestore_offset has been set in the current function
590    (or whether it has already been warned about, if not).  */
591 static int mips_cprestore_valid = 0;
592
593 /* This is the register which holds the stack frame, as set by the
594    .frame pseudo-op.  This is needed to implement .cprestore.  */
595 static int mips_frame_reg = SP;
596
597 /* Whether mips_frame_reg has been set in the current function
598    (or whether it has already been warned about, if not).  */
599 static int mips_frame_reg_valid = 0;
600
601 /* To output NOP instructions correctly, we need to keep information
602    about the previous two instructions.  */
603
604 /* Whether we are optimizing.  The default value of 2 means to remove
605    unneeded NOPs and swap branch instructions when possible.  A value
606    of 1 means to not swap branches.  A value of 0 means to always
607    insert NOPs.  */
608 static int mips_optimize = 2;
609
610 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
611    equivalent to seeing no -g option at all.  */
612 static int mips_debug = 0;
613
614 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
615 #define MAX_VR4130_NOPS 4
616
617 /* The maximum number of NOPs needed to fill delay slots.  */
618 #define MAX_DELAY_NOPS 2
619
620 /* The maximum number of NOPs needed for any purpose.  */
621 #define MAX_NOPS 4
622
623 /* A list of previous instructions, with index 0 being the most recent.
624    We need to look back MAX_NOPS instructions when filling delay slots
625    or working around processor errata.  We need to look back one
626    instruction further if we're thinking about using history[0] to
627    fill a branch delay slot.  */
628 static struct mips_cl_insn history[1 + MAX_NOPS];
629
630 /* Nop instructions used by emit_nop.  */
631 static struct mips_cl_insn nop_insn, mips16_nop_insn;
632
633 /* The appropriate nop for the current mode.  */
634 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
635
636 /* If this is set, it points to a frag holding nop instructions which
637    were inserted before the start of a noreorder section.  If those
638    nops turn out to be unnecessary, the size of the frag can be
639    decreased.  */
640 static fragS *prev_nop_frag;
641
642 /* The number of nop instructions we created in prev_nop_frag.  */
643 static int prev_nop_frag_holds;
644
645 /* The number of nop instructions that we know we need in
646    prev_nop_frag.  */
647 static int prev_nop_frag_required;
648
649 /* The number of instructions we've seen since prev_nop_frag.  */
650 static int prev_nop_frag_since;
651
652 /* For ECOFF and ELF, relocations against symbols are done in two
653    parts, with a HI relocation and a LO relocation.  Each relocation
654    has only 16 bits of space to store an addend.  This means that in
655    order for the linker to handle carries correctly, it must be able
656    to locate both the HI and the LO relocation.  This means that the
657    relocations must appear in order in the relocation table.
658
659    In order to implement this, we keep track of each unmatched HI
660    relocation.  We then sort them so that they immediately precede the
661    corresponding LO relocation.  */
662
663 struct mips_hi_fixup
664 {
665   /* Next HI fixup.  */
666   struct mips_hi_fixup *next;
667   /* This fixup.  */
668   fixS *fixp;
669   /* The section this fixup is in.  */
670   segT seg;
671 };
672
673 /* The list of unmatched HI relocs.  */
674
675 static struct mips_hi_fixup *mips_hi_fixup_list;
676
677 /* The frag containing the last explicit relocation operator.
678    Null if explicit relocations have not been used.  */
679
680 static fragS *prev_reloc_op_frag;
681
682 /* Map normal MIPS register numbers to mips16 register numbers.  */
683
684 #define X ILLEGAL_REG
685 static const int mips32_to_16_reg_map[] =
686 {
687   X, X, 2, 3, 4, 5, 6, 7,
688   X, X, X, X, X, X, X, X,
689   0, 1, X, X, X, X, X, X,
690   X, X, X, X, X, X, X, X
691 };
692 #undef X
693
694 /* Map mips16 register numbers to normal MIPS register numbers.  */
695
696 static const unsigned int mips16_to_32_reg_map[] =
697 {
698   16, 17, 2, 3, 4, 5, 6, 7
699 };
700
701 /* Classifies the kind of instructions we're interested in when
702    implementing -mfix-vr4120.  */
703 enum fix_vr4120_class {
704   FIX_VR4120_MACC,
705   FIX_VR4120_DMACC,
706   FIX_VR4120_MULT,
707   FIX_VR4120_DMULT,
708   FIX_VR4120_DIV,
709   FIX_VR4120_MTHILO,
710   NUM_FIX_VR4120_CLASSES
711 };
712
713 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
714    there must be at least one other instruction between an instruction
715    of type X and an instruction of type Y.  */
716 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
717
718 /* True if -mfix-vr4120 is in force.  */
719 static int mips_fix_vr4120;
720
721 /* ...likewise -mfix-vr4130.  */
722 static int mips_fix_vr4130;
723
724 /* We don't relax branches by default, since this causes us to expand
725    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
726    fail to compute the offset before expanding the macro to the most
727    efficient expansion.  */
728
729 static int mips_relax_branch;
730 \f
731 /* The expansion of many macros depends on the type of symbol that
732    they refer to.  For example, when generating position-dependent code,
733    a macro that refers to a symbol may have two different expansions,
734    one which uses GP-relative addresses and one which uses absolute
735    addresses.  When generating SVR4-style PIC, a macro may have
736    different expansions for local and global symbols.
737
738    We handle these situations by generating both sequences and putting
739    them in variant frags.  In position-dependent code, the first sequence
740    will be the GP-relative one and the second sequence will be the
741    absolute one.  In SVR4 PIC, the first sequence will be for global
742    symbols and the second will be for local symbols.
743
744    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
745    SECOND are the lengths of the two sequences in bytes.  These fields
746    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
747    the subtype has the following flags:
748
749    RELAX_USE_SECOND
750         Set if it has been decided that we should use the second
751         sequence instead of the first.
752
753    RELAX_SECOND_LONGER
754         Set in the first variant frag if the macro's second implementation
755         is longer than its first.  This refers to the macro as a whole,
756         not an individual relaxation.
757
758    RELAX_NOMACRO
759         Set in the first variant frag if the macro appeared in a .set nomacro
760         block and if one alternative requires a warning but the other does not.
761
762    RELAX_DELAY_SLOT
763         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
764         delay slot.
765
766    The frag's "opcode" points to the first fixup for relaxable code.
767
768    Relaxable macros are generated using a sequence such as:
769
770       relax_start (SYMBOL);
771       ... generate first expansion ...
772       relax_switch ();
773       ... generate second expansion ...
774       relax_end ();
775
776    The code and fixups for the unwanted alternative are discarded
777    by md_convert_frag.  */
778 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
779
780 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
781 #define RELAX_SECOND(X) ((X) & 0xff)
782 #define RELAX_USE_SECOND 0x10000
783 #define RELAX_SECOND_LONGER 0x20000
784 #define RELAX_NOMACRO 0x40000
785 #define RELAX_DELAY_SLOT 0x80000
786
787 /* Branch without likely bit.  If label is out of range, we turn:
788
789         beq reg1, reg2, label
790         delay slot
791
792    into
793
794         bne reg1, reg2, 0f
795         nop
796         j label
797      0: delay slot
798
799    with the following opcode replacements:
800
801         beq <-> bne
802         blez <-> bgtz
803         bltz <-> bgez
804         bc1f <-> bc1t
805
806         bltzal <-> bgezal  (with jal label instead of j label)
807
808    Even though keeping the delay slot instruction in the delay slot of
809    the branch would be more efficient, it would be very tricky to do
810    correctly, because we'd have to introduce a variable frag *after*
811    the delay slot instruction, and expand that instead.  Let's do it
812    the easy way for now, even if the branch-not-taken case now costs
813    one additional instruction.  Out-of-range branches are not supposed
814    to be common, anyway.
815
816    Branch likely.  If label is out of range, we turn:
817
818         beql reg1, reg2, label
819         delay slot (annulled if branch not taken)
820
821    into
822
823         beql reg1, reg2, 1f
824         nop
825         beql $0, $0, 2f
826         nop
827      1: j[al] label
828         delay slot (executed only if branch taken)
829      2:
830
831    It would be possible to generate a shorter sequence by losing the
832    likely bit, generating something like:
833
834         bne reg1, reg2, 0f
835         nop
836         j[al] label
837         delay slot (executed only if branch taken)
838      0:
839
840         beql -> bne
841         bnel -> beq
842         blezl -> bgtz
843         bgtzl -> blez
844         bltzl -> bgez
845         bgezl -> bltz
846         bc1fl -> bc1t
847         bc1tl -> bc1f
848
849         bltzall -> bgezal  (with jal label instead of j label)
850         bgezall -> bltzal  (ditto)
851
852
853    but it's not clear that it would actually improve performance.  */
854 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
855   ((relax_substateT) \
856    (0xc0000000 \
857     | ((toofar) ? 1 : 0) \
858     | ((link) ? 2 : 0) \
859     | ((likely) ? 4 : 0) \
860     | ((uncond) ? 8 : 0)))
861 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
862 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
863 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
864 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
865 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
866
867 /* For mips16 code, we use an entirely different form of relaxation.
868    mips16 supports two versions of most instructions which take
869    immediate values: a small one which takes some small value, and a
870    larger one which takes a 16 bit value.  Since branches also follow
871    this pattern, relaxing these values is required.
872
873    We can assemble both mips16 and normal MIPS code in a single
874    object.  Therefore, we need to support this type of relaxation at
875    the same time that we support the relaxation described above.  We
876    use the high bit of the subtype field to distinguish these cases.
877
878    The information we store for this type of relaxation is the
879    argument code found in the opcode file for this relocation, whether
880    the user explicitly requested a small or extended form, and whether
881    the relocation is in a jump or jal delay slot.  That tells us the
882    size of the value, and how it should be stored.  We also store
883    whether the fragment is considered to be extended or not.  We also
884    store whether this is known to be a branch to a different section,
885    whether we have tried to relax this frag yet, and whether we have
886    ever extended a PC relative fragment because of a shift count.  */
887 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
888   (0x80000000                                                   \
889    | ((type) & 0xff)                                            \
890    | ((small) ? 0x100 : 0)                                      \
891    | ((ext) ? 0x200 : 0)                                        \
892    | ((dslot) ? 0x400 : 0)                                      \
893    | ((jal_dslot) ? 0x800 : 0))
894 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
895 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
896 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
897 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
898 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
899 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
900 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
901 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
902 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
903 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
904 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
905 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
906
907 /* Is the given value a sign-extended 32-bit value?  */
908 #define IS_SEXT_32BIT_NUM(x)                                            \
909   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
910    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
911
912 /* Is the given value a sign-extended 16-bit value?  */
913 #define IS_SEXT_16BIT_NUM(x)                                            \
914   (((x) &~ (offsetT) 0x7fff) == 0                                       \
915    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
916
917 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
918 #define IS_ZEXT_32BIT_NUM(x)                                            \
919   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
920    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
921
922 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
923    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
924 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
925   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
926               | (((VALUE) & (MASK)) << (SHIFT)))
927
928 /* Extract bits MASK << SHIFT from STRUCT and shift them right
929    SHIFT places.  */
930 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
931   (((STRUCT) >> (SHIFT)) & (MASK))
932
933 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
934    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
935
936    include/opcode/mips.h specifies operand fields using the macros
937    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
938    with "MIPS16OP" instead of "OP".  */
939 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
940   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
941 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
942   INSERT_BITS ((INSN).insn_opcode, VALUE, \
943                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
944
945 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
946 #define EXTRACT_OPERAND(FIELD, INSN) \
947   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
948 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
949   EXTRACT_BITS ((INSN).insn_opcode, \
950                 MIPS16OP_MASK_##FIELD, \
951                 MIPS16OP_SH_##FIELD)
952 \f
953 /* Global variables used when generating relaxable macros.  See the
954    comment above RELAX_ENCODE for more details about how relaxation
955    is used.  */
956 static struct {
957   /* 0 if we're not emitting a relaxable macro.
958      1 if we're emitting the first of the two relaxation alternatives.
959      2 if we're emitting the second alternative.  */
960   int sequence;
961
962   /* The first relaxable fixup in the current frag.  (In other words,
963      the first fixup that refers to relaxable code.)  */
964   fixS *first_fixup;
965
966   /* sizes[0] says how many bytes of the first alternative are stored in
967      the current frag.  Likewise sizes[1] for the second alternative.  */
968   unsigned int sizes[2];
969
970   /* The symbol on which the choice of sequence depends.  */
971   symbolS *symbol;
972 } mips_relax;
973 \f
974 /* Global variables used to decide whether a macro needs a warning.  */
975 static struct {
976   /* True if the macro is in a branch delay slot.  */
977   bfd_boolean delay_slot_p;
978
979   /* For relaxable macros, sizes[0] is the length of the first alternative
980      in bytes and sizes[1] is the length of the second alternative.
981      For non-relaxable macros, both elements give the length of the
982      macro in bytes.  */
983   unsigned int sizes[2];
984
985   /* The first variant frag for this macro.  */
986   fragS *first_frag;
987 } mips_macro_warning;
988 \f
989 /* Prototypes for static functions.  */
990
991 #define internalError()                                                 \
992     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
993
994 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
995
996 static void append_insn
997   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
998 static void mips_no_prev_insn (void);
999 static void mips16_macro_build
1000   (expressionS *, const char *, const char *, va_list);
1001 static void load_register (int, expressionS *, int);
1002 static void macro_start (void);
1003 static void macro_end (void);
1004 static void macro (struct mips_cl_insn * ip);
1005 static void mips16_macro (struct mips_cl_insn * ip);
1006 #ifdef LOSING_COMPILER
1007 static void macro2 (struct mips_cl_insn * ip);
1008 #endif
1009 static void mips_ip (char *str, struct mips_cl_insn * ip);
1010 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1011 static void mips16_immed
1012   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1013    unsigned long *, bfd_boolean *, unsigned short *);
1014 static size_t my_getSmallExpression
1015   (expressionS *, bfd_reloc_code_real_type *, char *);
1016 static void my_getExpression (expressionS *, char *);
1017 static void s_align (int);
1018 static void s_change_sec (int);
1019 static void s_change_section (int);
1020 static void s_cons (int);
1021 static void s_float_cons (int);
1022 static void s_mips_globl (int);
1023 static void s_option (int);
1024 static void s_mipsset (int);
1025 static void s_abicalls (int);
1026 static void s_cpload (int);
1027 static void s_cpsetup (int);
1028 static void s_cplocal (int);
1029 static void s_cprestore (int);
1030 static void s_cpreturn (int);
1031 static void s_dtprelword (int);
1032 static void s_dtpreldword (int);
1033 static void s_gpvalue (int);
1034 static void s_gpword (int);
1035 static void s_gpdword (int);
1036 static void s_cpadd (int);
1037 static void s_insn (int);
1038 static void md_obj_begin (void);
1039 static void md_obj_end (void);
1040 static void s_mips_ent (int);
1041 static void s_mips_end (int);
1042 static void s_mips_frame (int);
1043 static void s_mips_mask (int reg_type);
1044 static void s_mips_stab (int);
1045 static void s_mips_weakext (int);
1046 static void s_mips_file (int);
1047 static void s_mips_loc (int);
1048 static bfd_boolean pic_need_relax (symbolS *, asection *);
1049 static int relaxed_branch_length (fragS *, asection *, int);
1050 static int validate_mips_insn (const struct mips_opcode *);
1051
1052 /* Table and functions used to map between CPU/ISA names, and
1053    ISA levels, and CPU numbers.  */
1054
1055 struct mips_cpu_info
1056 {
1057   const char *name;           /* CPU or ISA name.  */
1058   int flags;                  /* ASEs available, or ISA flag.  */
1059   int isa;                    /* ISA level.  */
1060   int cpu;                    /* CPU number (default CPU if ISA).  */
1061 };
1062
1063 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1064 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1065 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1066 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1067 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1068 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1069 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1070
1071 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1072 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1073 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1074 \f
1075 /* Pseudo-op table.
1076
1077    The following pseudo-ops from the Kane and Heinrich MIPS book
1078    should be defined here, but are currently unsupported: .alias,
1079    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1080
1081    The following pseudo-ops from the Kane and Heinrich MIPS book are
1082    specific to the type of debugging information being generated, and
1083    should be defined by the object format: .aent, .begin, .bend,
1084    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1085    .vreg.
1086
1087    The following pseudo-ops from the Kane and Heinrich MIPS book are
1088    not MIPS CPU specific, but are also not specific to the object file
1089    format.  This file is probably the best place to define them, but
1090    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1091
1092 static const pseudo_typeS mips_pseudo_table[] =
1093 {
1094   /* MIPS specific pseudo-ops.  */
1095   {"option", s_option, 0},
1096   {"set", s_mipsset, 0},
1097   {"rdata", s_change_sec, 'r'},
1098   {"sdata", s_change_sec, 's'},
1099   {"livereg", s_ignore, 0},
1100   {"abicalls", s_abicalls, 0},
1101   {"cpload", s_cpload, 0},
1102   {"cpsetup", s_cpsetup, 0},
1103   {"cplocal", s_cplocal, 0},
1104   {"cprestore", s_cprestore, 0},
1105   {"cpreturn", s_cpreturn, 0},
1106   {"dtprelword", s_dtprelword, 0},
1107   {"dtpreldword", s_dtpreldword, 0},
1108   {"gpvalue", s_gpvalue, 0},
1109   {"gpword", s_gpword, 0},
1110   {"gpdword", s_gpdword, 0},
1111   {"cpadd", s_cpadd, 0},
1112   {"insn", s_insn, 0},
1113
1114   /* Relatively generic pseudo-ops that happen to be used on MIPS
1115      chips.  */
1116   {"asciiz", stringer, 8 + 1},
1117   {"bss", s_change_sec, 'b'},
1118   {"err", s_err, 0},
1119   {"half", s_cons, 1},
1120   {"dword", s_cons, 3},
1121   {"weakext", s_mips_weakext, 0},
1122   {"origin", s_org, 0},
1123   {"repeat", s_rept, 0},
1124
1125   /* These pseudo-ops are defined in read.c, but must be overridden
1126      here for one reason or another.  */
1127   {"align", s_align, 0},
1128   {"byte", s_cons, 0},
1129   {"data", s_change_sec, 'd'},
1130   {"double", s_float_cons, 'd'},
1131   {"float", s_float_cons, 'f'},
1132   {"globl", s_mips_globl, 0},
1133   {"global", s_mips_globl, 0},
1134   {"hword", s_cons, 1},
1135   {"int", s_cons, 2},
1136   {"long", s_cons, 2},
1137   {"octa", s_cons, 4},
1138   {"quad", s_cons, 3},
1139   {"section", s_change_section, 0},
1140   {"short", s_cons, 1},
1141   {"single", s_float_cons, 'f'},
1142   {"stabn", s_mips_stab, 'n'},
1143   {"text", s_change_sec, 't'},
1144   {"word", s_cons, 2},
1145
1146   { "extern", ecoff_directive_extern, 0},
1147
1148   { NULL, NULL, 0 },
1149 };
1150
1151 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1152 {
1153   /* These pseudo-ops should be defined by the object file format.
1154      However, a.out doesn't support them, so we have versions here.  */
1155   {"aent", s_mips_ent, 1},
1156   {"bgnb", s_ignore, 0},
1157   {"end", s_mips_end, 0},
1158   {"endb", s_ignore, 0},
1159   {"ent", s_mips_ent, 0},
1160   {"file", s_mips_file, 0},
1161   {"fmask", s_mips_mask, 'F'},
1162   {"frame", s_mips_frame, 0},
1163   {"loc", s_mips_loc, 0},
1164   {"mask", s_mips_mask, 'R'},
1165   {"verstamp", s_ignore, 0},
1166   { NULL, NULL, 0 },
1167 };
1168
1169 extern void pop_insert (const pseudo_typeS *);
1170
1171 void
1172 mips_pop_insert (void)
1173 {
1174   pop_insert (mips_pseudo_table);
1175   if (! ECOFF_DEBUGGING)
1176     pop_insert (mips_nonecoff_pseudo_table);
1177 }
1178 \f
1179 /* Symbols labelling the current insn.  */
1180
1181 struct insn_label_list
1182 {
1183   struct insn_label_list *next;
1184   symbolS *label;
1185 };
1186
1187 static struct insn_label_list *free_insn_labels;
1188 #define label_list tc_segment_info_data.labels
1189
1190 static void mips_clear_insn_labels (void);
1191
1192 static inline void
1193 mips_clear_insn_labels (void)
1194 {
1195   register struct insn_label_list **pl;
1196   segment_info_type *si;
1197
1198   if (now_seg)
1199     {
1200       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1201         ;
1202       
1203       si = seg_info (now_seg);
1204       *pl = si->label_list;
1205       si->label_list = NULL;
1206     }
1207 }
1208
1209 \f
1210 static char *expr_end;
1211
1212 /* Expressions which appear in instructions.  These are set by
1213    mips_ip.  */
1214
1215 static expressionS imm_expr;
1216 static expressionS imm2_expr;
1217 static expressionS offset_expr;
1218
1219 /* Relocs associated with imm_expr and offset_expr.  */
1220
1221 static bfd_reloc_code_real_type imm_reloc[3]
1222   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1223 static bfd_reloc_code_real_type offset_reloc[3]
1224   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1225
1226 /* These are set by mips16_ip if an explicit extension is used.  */
1227
1228 static bfd_boolean mips16_small, mips16_ext;
1229
1230 #ifdef OBJ_ELF
1231 /* The pdr segment for per procedure frame/regmask info.  Not used for
1232    ECOFF debugging.  */
1233
1234 static segT pdr_seg;
1235 #endif
1236
1237 /* The default target format to use.  */
1238
1239 const char *
1240 mips_target_format (void)
1241 {
1242   switch (OUTPUT_FLAVOR)
1243     {
1244     case bfd_target_ecoff_flavour:
1245       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1246     case bfd_target_coff_flavour:
1247       return "pe-mips";
1248     case bfd_target_elf_flavour:
1249 #ifdef TE_VXWORKS
1250       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1251         return (target_big_endian
1252                 ? "elf32-bigmips-vxworks"
1253                 : "elf32-littlemips-vxworks");
1254 #endif
1255 #ifdef TE_TMIPS
1256       /* This is traditional mips.  */
1257       return (target_big_endian
1258               ? (HAVE_64BIT_OBJECTS
1259                  ? "elf64-tradbigmips"
1260                  : (HAVE_NEWABI
1261                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1262               : (HAVE_64BIT_OBJECTS
1263                  ? "elf64-tradlittlemips"
1264                  : (HAVE_NEWABI
1265                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1266 #else
1267       return (target_big_endian
1268               ? (HAVE_64BIT_OBJECTS
1269                  ? "elf64-bigmips"
1270                  : (HAVE_NEWABI
1271                     ? "elf32-nbigmips" : "elf32-bigmips"))
1272               : (HAVE_64BIT_OBJECTS
1273                  ? "elf64-littlemips"
1274                  : (HAVE_NEWABI
1275                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1276 #endif
1277     default:
1278       abort ();
1279       return NULL;
1280     }
1281 }
1282
1283 /* Return the length of instruction INSN.  */
1284
1285 static inline unsigned int
1286 insn_length (const struct mips_cl_insn *insn)
1287 {
1288   if (!mips_opts.mips16)
1289     return 4;
1290   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1291 }
1292
1293 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1294
1295 static void
1296 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1297 {
1298   size_t i;
1299
1300   insn->insn_mo = mo;
1301   insn->use_extend = FALSE;
1302   insn->extend = 0;
1303   insn->insn_opcode = mo->match;
1304   insn->frag = NULL;
1305   insn->where = 0;
1306   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1307     insn->fixp[i] = NULL;
1308   insn->fixed_p = (mips_opts.noreorder > 0);
1309   insn->noreorder_p = (mips_opts.noreorder > 0);
1310   insn->mips16_absolute_jump_p = 0;
1311 }
1312
1313 /* Record the current MIPS16 mode in now_seg.  */
1314
1315 static void
1316 mips_record_mips16_mode (void)
1317 {
1318   segment_info_type *si;
1319
1320   si = seg_info (now_seg);
1321   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1322     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1323 }
1324
1325 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1326
1327 static void
1328 install_insn (const struct mips_cl_insn *insn)
1329 {
1330   char *f = insn->frag->fr_literal + insn->where;
1331   if (!mips_opts.mips16)
1332     md_number_to_chars (f, insn->insn_opcode, 4);
1333   else if (insn->mips16_absolute_jump_p)
1334     {
1335       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1336       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1337     }
1338   else
1339     {
1340       if (insn->use_extend)
1341         {
1342           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1343           f += 2;
1344         }
1345       md_number_to_chars (f, insn->insn_opcode, 2);
1346     }
1347   mips_record_mips16_mode ();
1348 }
1349
1350 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1351    and install the opcode in the new location.  */
1352
1353 static void
1354 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1355 {
1356   size_t i;
1357
1358   insn->frag = frag;
1359   insn->where = where;
1360   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1361     if (insn->fixp[i] != NULL)
1362       {
1363         insn->fixp[i]->fx_frag = frag;
1364         insn->fixp[i]->fx_where = where;
1365       }
1366   install_insn (insn);
1367 }
1368
1369 /* Add INSN to the end of the output.  */
1370
1371 static void
1372 add_fixed_insn (struct mips_cl_insn *insn)
1373 {
1374   char *f = frag_more (insn_length (insn));
1375   move_insn (insn, frag_now, f - frag_now->fr_literal);
1376 }
1377
1378 /* Start a variant frag and move INSN to the start of the variant part,
1379    marking it as fixed.  The other arguments are as for frag_var.  */
1380
1381 static void
1382 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1383                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1384 {
1385   frag_grow (max_chars);
1386   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1387   insn->fixed_p = 1;
1388   frag_var (rs_machine_dependent, max_chars, var,
1389             subtype, symbol, offset, NULL);
1390 }
1391
1392 /* Insert N copies of INSN into the history buffer, starting at
1393    position FIRST.  Neither FIRST nor N need to be clipped.  */
1394
1395 static void
1396 insert_into_history (unsigned int first, unsigned int n,
1397                      const struct mips_cl_insn *insn)
1398 {
1399   if (mips_relax.sequence != 2)
1400     {
1401       unsigned int i;
1402
1403       for (i = ARRAY_SIZE (history); i-- > first;)
1404         if (i >= first + n)
1405           history[i] = history[i - n];
1406         else
1407           history[i] = *insn;
1408     }
1409 }
1410
1411 /* Emit a nop instruction, recording it in the history buffer.  */
1412
1413 static void
1414 emit_nop (void)
1415 {
1416   add_fixed_insn (NOP_INSN);
1417   insert_into_history (0, 1, NOP_INSN);
1418 }
1419
1420 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1421    the idea is to make it obvious at a glance that each errata is
1422    included.  */
1423
1424 static void
1425 init_vr4120_conflicts (void)
1426 {
1427 #define CONFLICT(FIRST, SECOND) \
1428     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1429
1430   /* Errata 21 - [D]DIV[U] after [D]MACC */
1431   CONFLICT (MACC, DIV);
1432   CONFLICT (DMACC, DIV);
1433
1434   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1435   CONFLICT (DMULT, DMULT);
1436   CONFLICT (DMULT, DMACC);
1437   CONFLICT (DMACC, DMULT);
1438   CONFLICT (DMACC, DMACC);
1439
1440   /* Errata 24 - MT{LO,HI} after [D]MACC */
1441   CONFLICT (MACC, MTHILO);
1442   CONFLICT (DMACC, MTHILO);
1443
1444   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1445      instruction is executed immediately after a MACC or DMACC
1446      instruction, the result of [either instruction] is incorrect."  */
1447   CONFLICT (MACC, MULT);
1448   CONFLICT (MACC, DMULT);
1449   CONFLICT (DMACC, MULT);
1450   CONFLICT (DMACC, DMULT);
1451
1452   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1453      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1454      DDIV or DDIVU instruction, the result of the MACC or
1455      DMACC instruction is incorrect.".  */
1456   CONFLICT (DMULT, MACC);
1457   CONFLICT (DMULT, DMACC);
1458   CONFLICT (DIV, MACC);
1459   CONFLICT (DIV, DMACC);
1460
1461 #undef CONFLICT
1462 }
1463
1464 struct regname {
1465   const char *name;
1466   unsigned int num;
1467 };
1468
1469 #define RTYPE_MASK      0x1ff00
1470 #define RTYPE_NUM       0x00100
1471 #define RTYPE_FPU       0x00200
1472 #define RTYPE_FCC       0x00400
1473 #define RTYPE_VEC       0x00800
1474 #define RTYPE_GP        0x01000
1475 #define RTYPE_CP0       0x02000
1476 #define RTYPE_PC        0x04000
1477 #define RTYPE_ACC       0x08000
1478 #define RTYPE_CCC       0x10000
1479 #define RNUM_MASK       0x000ff
1480 #define RWARN           0x80000
1481
1482 #define GENERIC_REGISTER_NUMBERS \
1483     {"$0",      RTYPE_NUM | 0},  \
1484     {"$1",      RTYPE_NUM | 1},  \
1485     {"$2",      RTYPE_NUM | 2},  \
1486     {"$3",      RTYPE_NUM | 3},  \
1487     {"$4",      RTYPE_NUM | 4},  \
1488     {"$5",      RTYPE_NUM | 5},  \
1489     {"$6",      RTYPE_NUM | 6},  \
1490     {"$7",      RTYPE_NUM | 7},  \
1491     {"$8",      RTYPE_NUM | 8},  \
1492     {"$9",      RTYPE_NUM | 9},  \
1493     {"$10",     RTYPE_NUM | 10}, \
1494     {"$11",     RTYPE_NUM | 11}, \
1495     {"$12",     RTYPE_NUM | 12}, \
1496     {"$13",     RTYPE_NUM | 13}, \
1497     {"$14",     RTYPE_NUM | 14}, \
1498     {"$15",     RTYPE_NUM | 15}, \
1499     {"$16",     RTYPE_NUM | 16}, \
1500     {"$17",     RTYPE_NUM | 17}, \
1501     {"$18",     RTYPE_NUM | 18}, \
1502     {"$19",     RTYPE_NUM | 19}, \
1503     {"$20",     RTYPE_NUM | 20}, \
1504     {"$21",     RTYPE_NUM | 21}, \
1505     {"$22",     RTYPE_NUM | 22}, \
1506     {"$23",     RTYPE_NUM | 23}, \
1507     {"$24",     RTYPE_NUM | 24}, \
1508     {"$25",     RTYPE_NUM | 25}, \
1509     {"$26",     RTYPE_NUM | 26}, \
1510     {"$27",     RTYPE_NUM | 27}, \
1511     {"$28",     RTYPE_NUM | 28}, \
1512     {"$29",     RTYPE_NUM | 29}, \
1513     {"$30",     RTYPE_NUM | 30}, \
1514     {"$31",     RTYPE_NUM | 31} 
1515
1516 #define FPU_REGISTER_NAMES       \
1517     {"$f0",     RTYPE_FPU | 0},  \
1518     {"$f1",     RTYPE_FPU | 1},  \
1519     {"$f2",     RTYPE_FPU | 2},  \
1520     {"$f3",     RTYPE_FPU | 3},  \
1521     {"$f4",     RTYPE_FPU | 4},  \
1522     {"$f5",     RTYPE_FPU | 5},  \
1523     {"$f6",     RTYPE_FPU | 6},  \
1524     {"$f7",     RTYPE_FPU | 7},  \
1525     {"$f8",     RTYPE_FPU | 8},  \
1526     {"$f9",     RTYPE_FPU | 9},  \
1527     {"$f10",    RTYPE_FPU | 10}, \
1528     {"$f11",    RTYPE_FPU | 11}, \
1529     {"$f12",    RTYPE_FPU | 12}, \
1530     {"$f13",    RTYPE_FPU | 13}, \
1531     {"$f14",    RTYPE_FPU | 14}, \
1532     {"$f15",    RTYPE_FPU | 15}, \
1533     {"$f16",    RTYPE_FPU | 16}, \
1534     {"$f17",    RTYPE_FPU | 17}, \
1535     {"$f18",    RTYPE_FPU | 18}, \
1536     {"$f19",    RTYPE_FPU | 19}, \
1537     {"$f20",    RTYPE_FPU | 20}, \
1538     {"$f21",    RTYPE_FPU | 21}, \
1539     {"$f22",    RTYPE_FPU | 22}, \
1540     {"$f23",    RTYPE_FPU | 23}, \
1541     {"$f24",    RTYPE_FPU | 24}, \
1542     {"$f25",    RTYPE_FPU | 25}, \
1543     {"$f26",    RTYPE_FPU | 26}, \
1544     {"$f27",    RTYPE_FPU | 27}, \
1545     {"$f28",    RTYPE_FPU | 28}, \
1546     {"$f29",    RTYPE_FPU | 29}, \
1547     {"$f30",    RTYPE_FPU | 30}, \
1548     {"$f31",    RTYPE_FPU | 31}
1549
1550 #define FPU_CONDITION_CODE_NAMES \
1551     {"$fcc0",   RTYPE_FCC | 0},  \
1552     {"$fcc1",   RTYPE_FCC | 1},  \
1553     {"$fcc2",   RTYPE_FCC | 2},  \
1554     {"$fcc3",   RTYPE_FCC | 3},  \
1555     {"$fcc4",   RTYPE_FCC | 4},  \
1556     {"$fcc5",   RTYPE_FCC | 5},  \
1557     {"$fcc6",   RTYPE_FCC | 6},  \
1558     {"$fcc7",   RTYPE_FCC | 7}
1559
1560 #define COPROC_CONDITION_CODE_NAMES         \
1561     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1562     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1563     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1564     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1565     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1566     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1567     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1568     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1569
1570 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1571     {"$a4",     RTYPE_GP | 8},  \
1572     {"$a5",     RTYPE_GP | 9},  \
1573     {"$a6",     RTYPE_GP | 10}, \
1574     {"$a7",     RTYPE_GP | 11}, \
1575     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1576     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1577     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1578     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1579     {"$t0",     RTYPE_GP | 12}, \
1580     {"$t1",     RTYPE_GP | 13}, \
1581     {"$t2",     RTYPE_GP | 14}, \
1582     {"$t3",     RTYPE_GP | 15}
1583
1584 #define O32_SYMBOLIC_REGISTER_NAMES \
1585     {"$t0",     RTYPE_GP | 8},  \
1586     {"$t1",     RTYPE_GP | 9},  \
1587     {"$t2",     RTYPE_GP | 10}, \
1588     {"$t3",     RTYPE_GP | 11}, \
1589     {"$t4",     RTYPE_GP | 12}, \
1590     {"$t5",     RTYPE_GP | 13}, \
1591     {"$t6",     RTYPE_GP | 14}, \
1592     {"$t7",     RTYPE_GP | 15}, \
1593     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1594     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1595     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1596     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1597
1598 /* Remaining symbolic register names */
1599 #define SYMBOLIC_REGISTER_NAMES \
1600     {"$zero",   RTYPE_GP | 0},  \
1601     {"$at",     RTYPE_GP | 1},  \
1602     {"$AT",     RTYPE_GP | 1},  \
1603     {"$v0",     RTYPE_GP | 2},  \
1604     {"$v1",     RTYPE_GP | 3},  \
1605     {"$a0",     RTYPE_GP | 4},  \
1606     {"$a1",     RTYPE_GP | 5},  \
1607     {"$a2",     RTYPE_GP | 6},  \
1608     {"$a3",     RTYPE_GP | 7},  \
1609     {"$s0",     RTYPE_GP | 16}, \
1610     {"$s1",     RTYPE_GP | 17}, \
1611     {"$s2",     RTYPE_GP | 18}, \
1612     {"$s3",     RTYPE_GP | 19}, \
1613     {"$s4",     RTYPE_GP | 20}, \
1614     {"$s5",     RTYPE_GP | 21}, \
1615     {"$s6",     RTYPE_GP | 22}, \
1616     {"$s7",     RTYPE_GP | 23}, \
1617     {"$t8",     RTYPE_GP | 24}, \
1618     {"$t9",     RTYPE_GP | 25}, \
1619     {"$k0",     RTYPE_GP | 26}, \
1620     {"$kt0",    RTYPE_GP | 26}, \
1621     {"$k1",     RTYPE_GP | 27}, \
1622     {"$kt1",    RTYPE_GP | 27}, \
1623     {"$gp",     RTYPE_GP | 28}, \
1624     {"$sp",     RTYPE_GP | 29}, \
1625     {"$s8",     RTYPE_GP | 30}, \
1626     {"$fp",     RTYPE_GP | 30}, \
1627     {"$ra",     RTYPE_GP | 31}
1628
1629 #define MIPS16_SPECIAL_REGISTER_NAMES \
1630     {"$pc",     RTYPE_PC | 0}
1631
1632 #define MDMX_VECTOR_REGISTER_NAMES \
1633     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1634     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1635     {"$v2",     RTYPE_VEC | 2},  \
1636     {"$v3",     RTYPE_VEC | 3},  \
1637     {"$v4",     RTYPE_VEC | 4},  \
1638     {"$v5",     RTYPE_VEC | 5},  \
1639     {"$v6",     RTYPE_VEC | 6},  \
1640     {"$v7",     RTYPE_VEC | 7},  \
1641     {"$v8",     RTYPE_VEC | 8},  \
1642     {"$v9",     RTYPE_VEC | 9},  \
1643     {"$v10",    RTYPE_VEC | 10}, \
1644     {"$v11",    RTYPE_VEC | 11}, \
1645     {"$v12",    RTYPE_VEC | 12}, \
1646     {"$v13",    RTYPE_VEC | 13}, \
1647     {"$v14",    RTYPE_VEC | 14}, \
1648     {"$v15",    RTYPE_VEC | 15}, \
1649     {"$v16",    RTYPE_VEC | 16}, \
1650     {"$v17",    RTYPE_VEC | 17}, \
1651     {"$v18",    RTYPE_VEC | 18}, \
1652     {"$v19",    RTYPE_VEC | 19}, \
1653     {"$v20",    RTYPE_VEC | 20}, \
1654     {"$v21",    RTYPE_VEC | 21}, \
1655     {"$v22",    RTYPE_VEC | 22}, \
1656     {"$v23",    RTYPE_VEC | 23}, \
1657     {"$v24",    RTYPE_VEC | 24}, \
1658     {"$v25",    RTYPE_VEC | 25}, \
1659     {"$v26",    RTYPE_VEC | 26}, \
1660     {"$v27",    RTYPE_VEC | 27}, \
1661     {"$v28",    RTYPE_VEC | 28}, \
1662     {"$v29",    RTYPE_VEC | 29}, \
1663     {"$v30",    RTYPE_VEC | 30}, \
1664     {"$v31",    RTYPE_VEC | 31}
1665
1666 #define MIPS_DSP_ACCUMULATOR_NAMES \
1667     {"$ac0",    RTYPE_ACC | 0}, \
1668     {"$ac1",    RTYPE_ACC | 1}, \
1669     {"$ac2",    RTYPE_ACC | 2}, \
1670     {"$ac3",    RTYPE_ACC | 3}
1671
1672 static const struct regname reg_names[] = {
1673   GENERIC_REGISTER_NUMBERS,
1674   FPU_REGISTER_NAMES,
1675   FPU_CONDITION_CODE_NAMES,
1676   COPROC_CONDITION_CODE_NAMES,
1677
1678   /* The $txx registers depends on the abi,
1679      these will be added later into the symbol table from
1680      one of the tables below once mips_abi is set after 
1681      parsing of arguments from the command line. */
1682   SYMBOLIC_REGISTER_NAMES,
1683
1684   MIPS16_SPECIAL_REGISTER_NAMES,
1685   MDMX_VECTOR_REGISTER_NAMES,
1686   MIPS_DSP_ACCUMULATOR_NAMES,
1687   {0, 0}
1688 };
1689
1690 static const struct regname reg_names_o32[] = {
1691   O32_SYMBOLIC_REGISTER_NAMES,
1692   {0, 0}
1693 };
1694
1695 static const struct regname reg_names_n32n64[] = {
1696   N32N64_SYMBOLIC_REGISTER_NAMES,
1697   {0, 0}
1698 };
1699
1700 static int
1701 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1702 {
1703   symbolS *symbolP;
1704   char *e;
1705   char save_c;
1706   int reg = -1;
1707
1708   /* Find end of name.  */
1709   e = *s;
1710   if (is_name_beginner (*e))
1711     ++e;
1712   while (is_part_of_name (*e))
1713     ++e;
1714
1715   /* Terminate name.  */
1716   save_c = *e;
1717   *e = '\0';
1718
1719   /* Look for a register symbol.  */
1720   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1721     {
1722       int r = S_GET_VALUE (symbolP);
1723       if (r & types)
1724         reg = r & RNUM_MASK;
1725       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1726         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1727         reg = (r & RNUM_MASK) - 2;
1728     }
1729   /* Else see if this is a register defined in an itbl entry.  */
1730   else if ((types & RTYPE_GP) && itbl_have_entries)
1731     {
1732       char *n = *s;
1733       unsigned long r;
1734
1735       if (*n == '$')
1736         ++n;
1737       if (itbl_get_reg_val (n, &r))
1738         reg = r & RNUM_MASK;
1739     }
1740
1741   /* Advance to next token if a register was recognised.  */
1742   if (reg >= 0)
1743     *s = e;
1744   else if (types & RWARN)
1745     as_warn ("Unrecognized register name `%s'", *s);
1746
1747   *e = save_c;
1748   if (regnop)
1749     *regnop = reg;
1750   return reg >= 0;
1751 }
1752
1753 /* This function is called once, at assembler startup time.  It should set up
1754    all the tables, etc. that the MD part of the assembler will need.  */
1755
1756 void
1757 md_begin (void)
1758 {
1759   const char *retval = NULL;
1760   int i = 0;
1761   int broken = 0;
1762
1763   if (mips_pic != NO_PIC)
1764     {
1765       if (g_switch_seen && g_switch_value != 0)
1766         as_bad (_("-G may not be used in position-independent code"));
1767       g_switch_value = 0;
1768     }
1769
1770   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1771     as_warn (_("Could not set architecture and machine"));
1772
1773   op_hash = hash_new ();
1774
1775   for (i = 0; i < NUMOPCODES;)
1776     {
1777       const char *name = mips_opcodes[i].name;
1778
1779       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1780       if (retval != NULL)
1781         {
1782           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1783                    mips_opcodes[i].name, retval);
1784           /* Probably a memory allocation problem?  Give up now.  */
1785           as_fatal (_("Broken assembler.  No assembly attempted."));
1786         }
1787       do
1788         {
1789           if (mips_opcodes[i].pinfo != INSN_MACRO)
1790             {
1791               if (!validate_mips_insn (&mips_opcodes[i]))
1792                 broken = 1;
1793               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1794                 {
1795                   create_insn (&nop_insn, mips_opcodes + i);
1796                   nop_insn.fixed_p = 1;
1797                 }
1798             }
1799           ++i;
1800         }
1801       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1802     }
1803
1804   mips16_op_hash = hash_new ();
1805
1806   i = 0;
1807   while (i < bfd_mips16_num_opcodes)
1808     {
1809       const char *name = mips16_opcodes[i].name;
1810
1811       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1812       if (retval != NULL)
1813         as_fatal (_("internal: can't hash `%s': %s"),
1814                   mips16_opcodes[i].name, retval);
1815       do
1816         {
1817           if (mips16_opcodes[i].pinfo != INSN_MACRO
1818               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1819                   != mips16_opcodes[i].match))
1820             {
1821               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1822                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1823               broken = 1;
1824             }
1825           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1826             {
1827               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1828               mips16_nop_insn.fixed_p = 1;
1829             }
1830           ++i;
1831         }
1832       while (i < bfd_mips16_num_opcodes
1833              && strcmp (mips16_opcodes[i].name, name) == 0);
1834     }
1835
1836   if (broken)
1837     as_fatal (_("Broken assembler.  No assembly attempted."));
1838
1839   /* We add all the general register names to the symbol table.  This
1840      helps us detect invalid uses of them.  */
1841   for (i = 0; reg_names[i].name; i++) 
1842     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1843                                      reg_names[i].num, // & RNUM_MASK,
1844                                      &zero_address_frag));
1845   if (HAVE_NEWABI)
1846     for (i = 0; reg_names_n32n64[i].name; i++) 
1847       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1848                                        reg_names_n32n64[i].num, // & RNUM_MASK,
1849                                        &zero_address_frag));
1850   else
1851     for (i = 0; reg_names_o32[i].name; i++) 
1852       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1853                                        reg_names_o32[i].num, // & RNUM_MASK,
1854                                        &zero_address_frag));
1855
1856   mips_no_prev_insn ();
1857
1858   mips_gprmask = 0;
1859   mips_cprmask[0] = 0;
1860   mips_cprmask[1] = 0;
1861   mips_cprmask[2] = 0;
1862   mips_cprmask[3] = 0;
1863
1864   /* set the default alignment for the text section (2**2) */
1865   record_alignment (text_section, 2);
1866
1867   bfd_set_gp_size (stdoutput, g_switch_value);
1868
1869 #ifdef OBJ_ELF
1870   if (IS_ELF)
1871     {
1872       /* On a native system other than VxWorks, sections must be aligned
1873          to 16 byte boundaries.  When configured for an embedded ELF
1874          target, we don't bother.  */
1875       if (strcmp (TARGET_OS, "elf") != 0
1876           && strcmp (TARGET_OS, "vxworks") != 0)
1877         {
1878           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1879           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1880           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1881         }
1882
1883       /* Create a .reginfo section for register masks and a .mdebug
1884          section for debugging information.  */
1885       {
1886         segT seg;
1887         subsegT subseg;
1888         flagword flags;
1889         segT sec;
1890
1891         seg = now_seg;
1892         subseg = now_subseg;
1893
1894         /* The ABI says this section should be loaded so that the
1895            running program can access it.  However, we don't load it
1896            if we are configured for an embedded target */
1897         flags = SEC_READONLY | SEC_DATA;
1898         if (strcmp (TARGET_OS, "elf") != 0)
1899           flags |= SEC_ALLOC | SEC_LOAD;
1900
1901         if (mips_abi != N64_ABI)
1902           {
1903             sec = subseg_new (".reginfo", (subsegT) 0);
1904
1905             bfd_set_section_flags (stdoutput, sec, flags);
1906             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1907
1908             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1909           }
1910         else
1911           {
1912             /* The 64-bit ABI uses a .MIPS.options section rather than
1913                .reginfo section.  */
1914             sec = subseg_new (".MIPS.options", (subsegT) 0);
1915             bfd_set_section_flags (stdoutput, sec, flags);
1916             bfd_set_section_alignment (stdoutput, sec, 3);
1917
1918             /* Set up the option header.  */
1919             {
1920               Elf_Internal_Options opthdr;
1921               char *f;
1922
1923               opthdr.kind = ODK_REGINFO;
1924               opthdr.size = (sizeof (Elf_External_Options)
1925                              + sizeof (Elf64_External_RegInfo));
1926               opthdr.section = 0;
1927               opthdr.info = 0;
1928               f = frag_more (sizeof (Elf_External_Options));
1929               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1930                                              (Elf_External_Options *) f);
1931
1932               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1933             }
1934           }
1935
1936         if (ECOFF_DEBUGGING)
1937           {
1938             sec = subseg_new (".mdebug", (subsegT) 0);
1939             (void) bfd_set_section_flags (stdoutput, sec,
1940                                           SEC_HAS_CONTENTS | SEC_READONLY);
1941             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1942           }
1943         else if (mips_flag_pdr)
1944           {
1945             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1946             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1947                                           SEC_READONLY | SEC_RELOC
1948                                           | SEC_DEBUGGING);
1949             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1950           }
1951
1952         subseg_set (seg, subseg);
1953       }
1954     }
1955 #endif /* OBJ_ELF */
1956
1957   if (! ECOFF_DEBUGGING)
1958     md_obj_begin ();
1959
1960   if (mips_fix_vr4120)
1961     init_vr4120_conflicts ();
1962 }
1963
1964 void
1965 md_mips_end (void)
1966 {
1967   if (! ECOFF_DEBUGGING)
1968     md_obj_end ();
1969 }
1970
1971 void
1972 md_assemble (char *str)
1973 {
1974   struct mips_cl_insn insn;
1975   bfd_reloc_code_real_type unused_reloc[3]
1976     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1977
1978   imm_expr.X_op = O_absent;
1979   imm2_expr.X_op = O_absent;
1980   offset_expr.X_op = O_absent;
1981   imm_reloc[0] = BFD_RELOC_UNUSED;
1982   imm_reloc[1] = BFD_RELOC_UNUSED;
1983   imm_reloc[2] = BFD_RELOC_UNUSED;
1984   offset_reloc[0] = BFD_RELOC_UNUSED;
1985   offset_reloc[1] = BFD_RELOC_UNUSED;
1986   offset_reloc[2] = BFD_RELOC_UNUSED;
1987
1988   if (mips_opts.mips16)
1989     mips16_ip (str, &insn);
1990   else
1991     {
1992       mips_ip (str, &insn);
1993       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1994             str, insn.insn_opcode));
1995     }
1996
1997   if (insn_error)
1998     {
1999       as_bad ("%s `%s'", insn_error, str);
2000       return;
2001     }
2002
2003   if (insn.insn_mo->pinfo == INSN_MACRO)
2004     {
2005       macro_start ();
2006       if (mips_opts.mips16)
2007         mips16_macro (&insn);
2008       else
2009         macro (&insn);
2010       macro_end ();
2011     }
2012   else
2013     {
2014       if (imm_expr.X_op != O_absent)
2015         append_insn (&insn, &imm_expr, imm_reloc);
2016       else if (offset_expr.X_op != O_absent)
2017         append_insn (&insn, &offset_expr, offset_reloc);
2018       else
2019         append_insn (&insn, NULL, unused_reloc);
2020     }
2021 }
2022
2023 /* Return true if the given relocation might need a matching %lo().
2024    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2025    need a matching %lo() when applied to local symbols.  */
2026
2027 static inline bfd_boolean
2028 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2029 {
2030   return (HAVE_IN_PLACE_ADDENDS
2031           && (reloc == BFD_RELOC_HI16_S
2032               || reloc == BFD_RELOC_MIPS16_HI16_S
2033               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2034                  all GOT16 relocations evaluate to "G".  */
2035               || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
2036 }
2037
2038 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2039    relocation.  */
2040
2041 static inline bfd_boolean
2042 fixup_has_matching_lo_p (fixS *fixp)
2043 {
2044   return (fixp->fx_next != NULL
2045           && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
2046              || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
2047           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2048           && fixp->fx_offset == fixp->fx_next->fx_offset);
2049 }
2050
2051 /* See whether instruction IP reads register REG.  CLASS is the type
2052    of register.  */
2053
2054 static int
2055 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2056                enum mips_regclass class)
2057 {
2058   if (class == MIPS16_REG)
2059     {
2060       assert (mips_opts.mips16);
2061       reg = mips16_to_32_reg_map[reg];
2062       class = MIPS_GR_REG;
2063     }
2064
2065   /* Don't report on general register ZERO, since it never changes.  */
2066   if (class == MIPS_GR_REG && reg == ZERO)
2067     return 0;
2068
2069   if (class == MIPS_FP_REG)
2070     {
2071       assert (! mips_opts.mips16);
2072       /* If we are called with either $f0 or $f1, we must check $f0.
2073          This is not optimal, because it will introduce an unnecessary
2074          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2075          need to distinguish reading both $f0 and $f1 or just one of
2076          them.  Note that we don't have to check the other way,
2077          because there is no instruction that sets both $f0 and $f1
2078          and requires a delay.  */
2079       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2080           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2081               == (reg &~ (unsigned) 1)))
2082         return 1;
2083       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2084           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2085               == (reg &~ (unsigned) 1)))
2086         return 1;
2087     }
2088   else if (! mips_opts.mips16)
2089     {
2090       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2091           && EXTRACT_OPERAND (RS, *ip) == reg)
2092         return 1;
2093       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2094           && EXTRACT_OPERAND (RT, *ip) == reg)
2095         return 1;
2096     }
2097   else
2098     {
2099       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2100           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2101         return 1;
2102       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2103           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2104         return 1;
2105       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2106           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2107               == reg))
2108         return 1;
2109       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2110         return 1;
2111       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2112         return 1;
2113       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2114         return 1;
2115       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2116           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2117         return 1;
2118     }
2119
2120   return 0;
2121 }
2122
2123 /* This function returns true if modifying a register requires a
2124    delay.  */
2125
2126 static int
2127 reg_needs_delay (unsigned int reg)
2128 {
2129   unsigned long prev_pinfo;
2130
2131   prev_pinfo = history[0].insn_mo->pinfo;
2132   if (! mips_opts.noreorder
2133       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2134            && ! gpr_interlocks)
2135           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2136               && ! cop_interlocks)))
2137     {
2138       /* A load from a coprocessor or from memory.  All load delays
2139          delay the use of general register rt for one instruction.  */
2140       /* Itbl support may require additional care here.  */
2141       know (prev_pinfo & INSN_WRITE_GPR_T);
2142       if (reg == EXTRACT_OPERAND (RT, history[0]))
2143         return 1;
2144     }
2145
2146   return 0;
2147 }
2148
2149 /* Move all labels in insn_labels to the current insertion point.  */
2150
2151 static void
2152 mips_move_labels (void)
2153 {
2154   segment_info_type *si = seg_info (now_seg);
2155   struct insn_label_list *l;
2156   valueT val;
2157
2158   for (l = si->label_list; l != NULL; l = l->next)
2159     {
2160       assert (S_GET_SEGMENT (l->label) == now_seg);
2161       symbol_set_frag (l->label, frag_now);
2162       val = (valueT) frag_now_fix ();
2163       /* mips16 text labels are stored as odd.  */
2164       if (mips_opts.mips16)
2165         ++val;
2166       S_SET_VALUE (l->label, val);
2167     }
2168 }
2169
2170 static bfd_boolean
2171 s_is_linkonce (symbolS *sym, segT from_seg)
2172 {
2173   bfd_boolean linkonce = FALSE;
2174   segT symseg = S_GET_SEGMENT (sym);
2175
2176   if (symseg != from_seg && !S_IS_LOCAL (sym))
2177     {
2178       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2179         linkonce = TRUE;
2180 #ifdef OBJ_ELF
2181       /* The GNU toolchain uses an extension for ELF: a section
2182          beginning with the magic string .gnu.linkonce is a
2183          linkonce section.  */
2184       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2185                    sizeof ".gnu.linkonce" - 1) == 0)
2186         linkonce = TRUE;
2187 #endif
2188     }
2189   return linkonce;
2190 }
2191
2192 /* Mark instruction labels in mips16 mode.  This permits the linker to
2193    handle them specially, such as generating jalx instructions when
2194    needed.  We also make them odd for the duration of the assembly, in
2195    order to generate the right sort of code.  We will make them even
2196    in the adjust_symtab routine, while leaving them marked.  This is
2197    convenient for the debugger and the disassembler.  The linker knows
2198    to make them odd again.  */
2199
2200 static void
2201 mips16_mark_labels (void)
2202 {
2203   segment_info_type *si = seg_info (now_seg);
2204   struct insn_label_list *l;
2205
2206   if (!mips_opts.mips16)
2207     return;
2208
2209   for (l = si->label_list; l != NULL; l = l->next)
2210    {
2211       symbolS *label = l->label;
2212
2213 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2214       if (IS_ELF)
2215         S_SET_OTHER (label, STO_MIPS16);
2216 #endif
2217       if ((S_GET_VALUE (label) & 1) == 0
2218         /* Don't adjust the address if the label is global or weak, or
2219            in a link-once section, since we'll be emitting symbol reloc
2220            references to it which will be patched up by the linker, and
2221            the final value of the symbol may or may not be MIPS16.  */
2222           && ! S_IS_WEAK (label)
2223           && ! S_IS_EXTERNAL (label)
2224           && ! s_is_linkonce (label, now_seg))
2225         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2226     }
2227 }
2228
2229 /* End the current frag.  Make it a variant frag and record the
2230    relaxation info.  */
2231
2232 static void
2233 relax_close_frag (void)
2234 {
2235   mips_macro_warning.first_frag = frag_now;
2236   frag_var (rs_machine_dependent, 0, 0,
2237             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2238             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2239
2240   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2241   mips_relax.first_fixup = 0;
2242 }
2243
2244 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2245    See the comment above RELAX_ENCODE for more details.  */
2246
2247 static void
2248 relax_start (symbolS *symbol)
2249 {
2250   assert (mips_relax.sequence == 0);
2251   mips_relax.sequence = 1;
2252   mips_relax.symbol = symbol;
2253 }
2254
2255 /* Start generating the second version of a relaxable sequence.
2256    See the comment above RELAX_ENCODE for more details.  */
2257
2258 static void
2259 relax_switch (void)
2260 {
2261   assert (mips_relax.sequence == 1);
2262   mips_relax.sequence = 2;
2263 }
2264
2265 /* End the current relaxable sequence.  */
2266
2267 static void
2268 relax_end (void)
2269 {
2270   assert (mips_relax.sequence == 2);
2271   relax_close_frag ();
2272   mips_relax.sequence = 0;
2273 }
2274
2275 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2276    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2277    by VR4120 errata.  */
2278
2279 static unsigned int
2280 classify_vr4120_insn (const char *name)
2281 {
2282   if (strncmp (name, "macc", 4) == 0)
2283     return FIX_VR4120_MACC;
2284   if (strncmp (name, "dmacc", 5) == 0)
2285     return FIX_VR4120_DMACC;
2286   if (strncmp (name, "mult", 4) == 0)
2287     return FIX_VR4120_MULT;
2288   if (strncmp (name, "dmult", 5) == 0)
2289     return FIX_VR4120_DMULT;
2290   if (strstr (name, "div"))
2291     return FIX_VR4120_DIV;
2292   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2293     return FIX_VR4120_MTHILO;
2294   return NUM_FIX_VR4120_CLASSES;
2295 }
2296
2297 /* Return the number of instructions that must separate INSN1 and INSN2,
2298    where INSN1 is the earlier instruction.  Return the worst-case value
2299    for any INSN2 if INSN2 is null.  */
2300
2301 static unsigned int
2302 insns_between (const struct mips_cl_insn *insn1,
2303                const struct mips_cl_insn *insn2)
2304 {
2305   unsigned long pinfo1, pinfo2;
2306
2307   /* This function needs to know which pinfo flags are set for INSN2
2308      and which registers INSN2 uses.  The former is stored in PINFO2 and
2309      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2310      will have every flag set and INSN2_USES_REG will always return true.  */
2311   pinfo1 = insn1->insn_mo->pinfo;
2312   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2313
2314 #define INSN2_USES_REG(REG, CLASS) \
2315    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2316
2317   /* For most targets, write-after-read dependencies on the HI and LO
2318      registers must be separated by at least two instructions.  */
2319   if (!hilo_interlocks)
2320     {
2321       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2322         return 2;
2323       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2324         return 2;
2325     }
2326
2327   /* If we're working around r7000 errata, there must be two instructions
2328      between an mfhi or mflo and any instruction that uses the result.  */
2329   if (mips_7000_hilo_fix
2330       && MF_HILO_INSN (pinfo1)
2331       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2332     return 2;
2333
2334   /* If working around VR4120 errata, check for combinations that need
2335      a single intervening instruction.  */
2336   if (mips_fix_vr4120)
2337     {
2338       unsigned int class1, class2;
2339
2340       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2341       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2342         {
2343           if (insn2 == NULL)
2344             return 1;
2345           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2346           if (vr4120_conflicts[class1] & (1 << class2))
2347             return 1;
2348         }
2349     }
2350
2351   if (!mips_opts.mips16)
2352     {
2353       /* Check for GPR or coprocessor load delays.  All such delays
2354          are on the RT register.  */
2355       /* Itbl support may require additional care here.  */
2356       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2357           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2358         {
2359           know (pinfo1 & INSN_WRITE_GPR_T);
2360           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2361             return 1;
2362         }
2363
2364       /* Check for generic coprocessor hazards.
2365
2366          This case is not handled very well.  There is no special
2367          knowledge of CP0 handling, and the coprocessors other than
2368          the floating point unit are not distinguished at all.  */
2369       /* Itbl support may require additional care here. FIXME!
2370          Need to modify this to include knowledge about
2371          user specified delays!  */
2372       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2373                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2374         {
2375           /* Handle cases where INSN1 writes to a known general coprocessor
2376              register.  There must be a one instruction delay before INSN2
2377              if INSN2 reads that register, otherwise no delay is needed.  */
2378           if (pinfo1 & INSN_WRITE_FPR_T)
2379             {
2380               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2381                 return 1;
2382             }
2383           else if (pinfo1 & INSN_WRITE_FPR_S)
2384             {
2385               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2386                 return 1;
2387             }
2388           else
2389             {
2390               /* Read-after-write dependencies on the control registers
2391                  require a two-instruction gap.  */
2392               if ((pinfo1 & INSN_WRITE_COND_CODE)
2393                   && (pinfo2 & INSN_READ_COND_CODE))
2394                 return 2;
2395
2396               /* We don't know exactly what INSN1 does.  If INSN2 is
2397                  also a coprocessor instruction, assume there must be
2398                  a one instruction gap.  */
2399               if (pinfo2 & INSN_COP)
2400                 return 1;
2401             }
2402         }
2403
2404       /* Check for read-after-write dependencies on the coprocessor
2405          control registers in cases where INSN1 does not need a general
2406          coprocessor delay.  This means that INSN1 is a floating point
2407          comparison instruction.  */
2408       /* Itbl support may require additional care here.  */
2409       else if (!cop_interlocks
2410                && (pinfo1 & INSN_WRITE_COND_CODE)
2411                && (pinfo2 & INSN_READ_COND_CODE))
2412         return 1;
2413     }
2414
2415 #undef INSN2_USES_REG
2416
2417   return 0;
2418 }
2419
2420 /* Return the number of nops that would be needed to work around the
2421    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2422    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2423
2424 static int
2425 nops_for_vr4130 (const struct mips_cl_insn *history,
2426                  const struct mips_cl_insn *insn)
2427 {
2428   int i, j, reg;
2429
2430   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2431      are not affected by the errata.  */
2432   if (insn != 0
2433       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2434           || strcmp (insn->insn_mo->name, "mtlo") == 0
2435           || strcmp (insn->insn_mo->name, "mthi") == 0))
2436     return 0;
2437
2438   /* Search for the first MFLO or MFHI.  */
2439   for (i = 0; i < MAX_VR4130_NOPS; i++)
2440     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2441       {
2442         /* Extract the destination register.  */
2443         if (mips_opts.mips16)
2444           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2445         else
2446           reg = EXTRACT_OPERAND (RD, history[i]);
2447
2448         /* No nops are needed if INSN reads that register.  */
2449         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2450           return 0;
2451
2452         /* ...or if any of the intervening instructions do.  */
2453         for (j = 0; j < i; j++)
2454           if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2455             return 0;
2456
2457         return MAX_VR4130_NOPS - i;
2458       }
2459   return 0;
2460 }
2461
2462 /* Return the number of nops that would be needed if instruction INSN
2463    immediately followed the MAX_NOPS instructions given by HISTORY,
2464    where HISTORY[0] is the most recent instruction.  If INSN is null,
2465    return the worse-case number of nops for any instruction.  */
2466
2467 static int
2468 nops_for_insn (const struct mips_cl_insn *history,
2469                const struct mips_cl_insn *insn)
2470 {
2471   int i, nops, tmp_nops;
2472
2473   nops = 0;
2474   for (i = 0; i < MAX_DELAY_NOPS; i++)
2475     if (!history[i].noreorder_p)
2476       {
2477         tmp_nops = insns_between (history + i, insn) - i;
2478         if (tmp_nops > nops)
2479           nops = tmp_nops;
2480       }
2481
2482   if (mips_fix_vr4130)
2483     {
2484       tmp_nops = nops_for_vr4130 (history, insn);
2485       if (tmp_nops > nops)
2486         nops = tmp_nops;
2487     }
2488
2489   return nops;
2490 }
2491
2492 /* The variable arguments provide NUM_INSNS extra instructions that
2493    might be added to HISTORY.  Return the largest number of nops that
2494    would be needed after the extended sequence.  */
2495
2496 static int
2497 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2498 {
2499   va_list args;
2500   struct mips_cl_insn buffer[MAX_NOPS];
2501   struct mips_cl_insn *cursor;
2502   int nops;
2503
2504   va_start (args, history);
2505   cursor = buffer + num_insns;
2506   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2507   while (cursor > buffer)
2508     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2509
2510   nops = nops_for_insn (buffer, NULL);
2511   va_end (args);
2512   return nops;
2513 }
2514
2515 /* Like nops_for_insn, but if INSN is a branch, take into account the
2516    worst-case delay for the branch target.  */
2517
2518 static int
2519 nops_for_insn_or_target (const struct mips_cl_insn *history,
2520                          const struct mips_cl_insn *insn)
2521 {
2522   int nops, tmp_nops;
2523
2524   nops = nops_for_insn (history, insn);
2525   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2526                               | INSN_COND_BRANCH_DELAY
2527                               | INSN_COND_BRANCH_LIKELY))
2528     {
2529       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2530       if (tmp_nops > nops)
2531         nops = tmp_nops;
2532     }
2533   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2534     {
2535       tmp_nops = nops_for_sequence (1, history, insn);
2536       if (tmp_nops > nops)
2537         nops = tmp_nops;
2538     }
2539   return nops;
2540 }
2541
2542 /* Output an instruction.  IP is the instruction information.
2543    ADDRESS_EXPR is an operand of the instruction to be used with
2544    RELOC_TYPE.  */
2545
2546 static void
2547 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2548              bfd_reloc_code_real_type *reloc_type)
2549 {
2550   unsigned long prev_pinfo, pinfo;
2551   relax_stateT prev_insn_frag_type = 0;
2552   bfd_boolean relaxed_branch = FALSE;
2553   segment_info_type *si = seg_info (now_seg);
2554
2555   /* Mark instruction labels in mips16 mode.  */
2556   mips16_mark_labels ();
2557
2558   prev_pinfo = history[0].insn_mo->pinfo;
2559   pinfo = ip->insn_mo->pinfo;
2560
2561   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2562     {
2563       /* There are a lot of optimizations we could do that we don't.
2564          In particular, we do not, in general, reorder instructions.
2565          If you use gcc with optimization, it will reorder
2566          instructions and generally do much more optimization then we
2567          do here; repeating all that work in the assembler would only
2568          benefit hand written assembly code, and does not seem worth
2569          it.  */
2570       int nops = (mips_optimize == 0
2571                   ? nops_for_insn (history, NULL)
2572                   : nops_for_insn_or_target (history, ip));
2573       if (nops > 0)
2574         {
2575           fragS *old_frag;
2576           unsigned long old_frag_offset;
2577           int i;
2578
2579           old_frag = frag_now;
2580           old_frag_offset = frag_now_fix ();
2581
2582           for (i = 0; i < nops; i++)
2583             emit_nop ();
2584
2585           if (listing)
2586             {
2587               listing_prev_line ();
2588               /* We may be at the start of a variant frag.  In case we
2589                  are, make sure there is enough space for the frag
2590                  after the frags created by listing_prev_line.  The
2591                  argument to frag_grow here must be at least as large
2592                  as the argument to all other calls to frag_grow in
2593                  this file.  We don't have to worry about being in the
2594                  middle of a variant frag, because the variants insert
2595                  all needed nop instructions themselves.  */
2596               frag_grow (40);
2597             }
2598
2599           mips_move_labels ();
2600
2601 #ifndef NO_ECOFF_DEBUGGING
2602           if (ECOFF_DEBUGGING)
2603             ecoff_fix_loc (old_frag, old_frag_offset);
2604 #endif
2605         }
2606     }
2607   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2608     {
2609       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2610       int nops = nops_for_insn_or_target (history, ip);
2611       assert (nops <= prev_nop_frag_holds);
2612
2613       /* Enforce NOPS as a minimum.  */
2614       if (nops > prev_nop_frag_required)
2615         prev_nop_frag_required = nops;
2616
2617       if (prev_nop_frag_holds == prev_nop_frag_required)
2618         {
2619           /* Settle for the current number of nops.  Update the history
2620              accordingly (for the benefit of any future .set reorder code).  */
2621           prev_nop_frag = NULL;
2622           insert_into_history (prev_nop_frag_since,
2623                                prev_nop_frag_holds, NOP_INSN);
2624         }
2625       else
2626         {
2627           /* Allow this instruction to replace one of the nops that was
2628              tentatively added to prev_nop_frag.  */
2629           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2630           prev_nop_frag_holds--;
2631           prev_nop_frag_since++;
2632         }
2633     }
2634
2635 #ifdef OBJ_ELF
2636   /* The value passed to dwarf2_emit_insn is the distance between
2637      the beginning of the current instruction and the address that
2638      should be recorded in the debug tables.  For MIPS16 debug info
2639      we want to use ISA-encoded addresses, so we pass -1 for an
2640      address higher by one than the current.  */
2641   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2642 #endif
2643
2644   /* Record the frag type before frag_var.  */
2645   if (history[0].frag)
2646     prev_insn_frag_type = history[0].frag->fr_type;
2647
2648   if (address_expr
2649       && *reloc_type == BFD_RELOC_16_PCREL_S2
2650       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2651           || pinfo & INSN_COND_BRANCH_LIKELY)
2652       && mips_relax_branch
2653       /* Don't try branch relaxation within .set nomacro, or within
2654          .set noat if we use $at for PIC computations.  If it turns
2655          out that the branch was out-of-range, we'll get an error.  */
2656       && !mips_opts.warn_about_macros
2657       && (mips_opts.at || mips_pic == NO_PIC)
2658       && !mips_opts.mips16)
2659     {
2660       relaxed_branch = TRUE;
2661       add_relaxed_insn (ip, (relaxed_branch_length
2662                              (NULL, NULL,
2663                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2664                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2665                               : 0)), 4,
2666                         RELAX_BRANCH_ENCODE
2667                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2668                          pinfo & INSN_COND_BRANCH_LIKELY,
2669                          pinfo & INSN_WRITE_GPR_31,
2670                          0),
2671                         address_expr->X_add_symbol,
2672                         address_expr->X_add_number);
2673       *reloc_type = BFD_RELOC_UNUSED;
2674     }
2675   else if (*reloc_type > BFD_RELOC_UNUSED)
2676     {
2677       /* We need to set up a variant frag.  */
2678       assert (mips_opts.mips16 && address_expr != NULL);
2679       add_relaxed_insn (ip, 4, 0,
2680                         RELAX_MIPS16_ENCODE
2681                         (*reloc_type - BFD_RELOC_UNUSED,
2682                          mips16_small, mips16_ext,
2683                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2684                          history[0].mips16_absolute_jump_p),
2685                         make_expr_symbol (address_expr), 0);
2686     }
2687   else if (mips_opts.mips16
2688            && ! ip->use_extend
2689            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2690     {
2691       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2692         /* Make sure there is enough room to swap this instruction with
2693            a following jump instruction.  */
2694         frag_grow (6);
2695       add_fixed_insn (ip);
2696     }
2697   else
2698     {
2699       if (mips_opts.mips16
2700           && mips_opts.noreorder
2701           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2702         as_warn (_("extended instruction in delay slot"));
2703
2704       if (mips_relax.sequence)
2705         {
2706           /* If we've reached the end of this frag, turn it into a variant
2707              frag and record the information for the instructions we've
2708              written so far.  */
2709           if (frag_room () < 4)
2710             relax_close_frag ();
2711           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2712         }
2713
2714       if (mips_relax.sequence != 2)
2715         mips_macro_warning.sizes[0] += 4;
2716       if (mips_relax.sequence != 1)
2717         mips_macro_warning.sizes[1] += 4;
2718
2719       if (mips_opts.mips16)
2720         {
2721           ip->fixed_p = 1;
2722           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2723         }
2724       add_fixed_insn (ip);
2725     }
2726
2727   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2728     {
2729       if (address_expr->X_op == O_constant)
2730         {
2731           unsigned int tmp;
2732
2733           switch (*reloc_type)
2734             {
2735             case BFD_RELOC_32:
2736               ip->insn_opcode |= address_expr->X_add_number;
2737               break;
2738
2739             case BFD_RELOC_MIPS_HIGHEST:
2740               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2741               ip->insn_opcode |= tmp & 0xffff;
2742               break;
2743
2744             case BFD_RELOC_MIPS_HIGHER:
2745               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2746               ip->insn_opcode |= tmp & 0xffff;
2747               break;
2748
2749             case BFD_RELOC_HI16_S:
2750               tmp = (address_expr->X_add_number + 0x8000) >> 16;
2751               ip->insn_opcode |= tmp & 0xffff;
2752               break;
2753
2754             case BFD_RELOC_HI16:
2755               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2756               break;
2757
2758             case BFD_RELOC_UNUSED:
2759             case BFD_RELOC_LO16:
2760             case BFD_RELOC_MIPS_GOT_DISP:
2761               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2762               break;
2763
2764             case BFD_RELOC_MIPS_JMP:
2765               if ((address_expr->X_add_number & 3) != 0)
2766                 as_bad (_("jump to misaligned address (0x%lx)"),
2767                         (unsigned long) address_expr->X_add_number);
2768               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2769               break;
2770
2771             case BFD_RELOC_MIPS16_JMP:
2772               if ((address_expr->X_add_number & 3) != 0)
2773                 as_bad (_("jump to misaligned address (0x%lx)"),
2774                         (unsigned long) address_expr->X_add_number);
2775               ip->insn_opcode |=
2776                 (((address_expr->X_add_number & 0x7c0000) << 3)
2777                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2778                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2779               break;
2780
2781             case BFD_RELOC_16_PCREL_S2:
2782               if ((address_expr->X_add_number & 3) != 0)
2783                 as_bad (_("branch to misaligned address (0x%lx)"),
2784                         (unsigned long) address_expr->X_add_number);
2785               if (mips_relax_branch)
2786                 goto need_reloc;
2787               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2788                 as_bad (_("branch address range overflow (0x%lx)"),
2789                         (unsigned long) address_expr->X_add_number);
2790               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2791               break;
2792
2793             default:
2794               internalError ();
2795             }
2796         }
2797       else if (*reloc_type < BFD_RELOC_UNUSED)
2798         need_reloc:
2799         {
2800           reloc_howto_type *howto;
2801           int i;
2802
2803           /* In a compound relocation, it is the final (outermost)
2804              operator that determines the relocated field.  */
2805           for (i = 1; i < 3; i++)
2806             if (reloc_type[i] == BFD_RELOC_UNUSED)
2807               break;
2808
2809           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2810           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2811                                      bfd_get_reloc_size (howto),
2812                                      address_expr,
2813                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2814                                      reloc_type[0]);
2815
2816           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
2817           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2818               && ip->fixp[0]->fx_addsy)
2819             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2820
2821           /* These relocations can have an addend that won't fit in
2822              4 octets for 64bit assembly.  */
2823           if (HAVE_64BIT_GPRS
2824               && ! howto->partial_inplace
2825               && (reloc_type[0] == BFD_RELOC_16
2826                   || reloc_type[0] == BFD_RELOC_32
2827                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2828                   || reloc_type[0] == BFD_RELOC_HI16_S
2829                   || reloc_type[0] == BFD_RELOC_LO16
2830                   || reloc_type[0] == BFD_RELOC_GPREL16
2831                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2832                   || reloc_type[0] == BFD_RELOC_GPREL32
2833                   || reloc_type[0] == BFD_RELOC_64
2834                   || reloc_type[0] == BFD_RELOC_CTOR
2835                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2836                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2837                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2838                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2839                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2840                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2841                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2842                   || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2843                   || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2844             ip->fixp[0]->fx_no_overflow = 1;
2845
2846           if (mips_relax.sequence)
2847             {
2848               if (mips_relax.first_fixup == 0)
2849                 mips_relax.first_fixup = ip->fixp[0];
2850             }
2851           else if (reloc_needs_lo_p (*reloc_type))
2852             {
2853               struct mips_hi_fixup *hi_fixup;
2854
2855               /* Reuse the last entry if it already has a matching %lo.  */
2856               hi_fixup = mips_hi_fixup_list;
2857               if (hi_fixup == 0
2858                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2859                 {
2860                   hi_fixup = ((struct mips_hi_fixup *)
2861                               xmalloc (sizeof (struct mips_hi_fixup)));
2862                   hi_fixup->next = mips_hi_fixup_list;
2863                   mips_hi_fixup_list = hi_fixup;
2864                 }
2865               hi_fixup->fixp = ip->fixp[0];
2866               hi_fixup->seg = now_seg;
2867             }
2868
2869           /* Add fixups for the second and third relocations, if given.
2870              Note that the ABI allows the second relocation to be
2871              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2872              moment we only use RSS_UNDEF, but we could add support
2873              for the others if it ever becomes necessary.  */
2874           for (i = 1; i < 3; i++)
2875             if (reloc_type[i] != BFD_RELOC_UNUSED)
2876               {
2877                 ip->fixp[i] = fix_new (ip->frag, ip->where,
2878                                        ip->fixp[0]->fx_size, NULL, 0,
2879                                        FALSE, reloc_type[i]);
2880
2881                 /* Use fx_tcbit to mark compound relocs.  */
2882                 ip->fixp[0]->fx_tcbit = 1;
2883                 ip->fixp[i]->fx_tcbit = 1;
2884               }
2885         }
2886     }
2887   install_insn (ip);
2888
2889   /* Update the register mask information.  */
2890   if (! mips_opts.mips16)
2891     {
2892       if (pinfo & INSN_WRITE_GPR_D)
2893         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2894       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2895         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2896       if (pinfo & INSN_READ_GPR_S)
2897         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2898       if (pinfo & INSN_WRITE_GPR_31)
2899         mips_gprmask |= 1 << RA;
2900       if (pinfo & INSN_WRITE_FPR_D)
2901         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2902       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2903         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2904       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2905         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2906       if ((pinfo & INSN_READ_FPR_R) != 0)
2907         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2908       if (pinfo & INSN_COP)
2909         {
2910           /* We don't keep enough information to sort these cases out.
2911              The itbl support does keep this information however, although
2912              we currently don't support itbl fprmats as part of the cop
2913              instruction.  May want to add this support in the future.  */
2914         }
2915       /* Never set the bit for $0, which is always zero.  */
2916       mips_gprmask &= ~1 << 0;
2917     }
2918   else
2919     {
2920       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2921         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2922       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2923         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2924       if (pinfo & MIPS16_INSN_WRITE_Z)
2925         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2926       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2927         mips_gprmask |= 1 << TREG;
2928       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2929         mips_gprmask |= 1 << SP;
2930       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2931         mips_gprmask |= 1 << RA;
2932       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2933         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2934       if (pinfo & MIPS16_INSN_READ_Z)
2935         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2936       if (pinfo & MIPS16_INSN_READ_GPR_X)
2937         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2938     }
2939
2940   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2941     {
2942       /* Filling the branch delay slot is more complex.  We try to
2943          switch the branch with the previous instruction, which we can
2944          do if the previous instruction does not set up a condition
2945          that the branch tests and if the branch is not itself the
2946          target of any branch.  */
2947       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2948           || (pinfo & INSN_COND_BRANCH_DELAY))
2949         {
2950           if (mips_optimize < 2
2951               /* If we have seen .set volatile or .set nomove, don't
2952                  optimize.  */
2953               || mips_opts.nomove != 0
2954               /* We can't swap if the previous instruction's position
2955                  is fixed.  */
2956               || history[0].fixed_p
2957               /* If the previous previous insn was in a .set
2958                  noreorder, we can't swap.  Actually, the MIPS
2959                  assembler will swap in this situation.  However, gcc
2960                  configured -with-gnu-as will generate code like
2961                    .set noreorder
2962                    lw   $4,XXX
2963                    .set reorder
2964                    INSN
2965                    bne  $4,$0,foo
2966                  in which we can not swap the bne and INSN.  If gcc is
2967                  not configured -with-gnu-as, it does not output the
2968                  .set pseudo-ops.  */
2969               || history[1].noreorder_p
2970               /* If the branch is itself the target of a branch, we
2971                  can not swap.  We cheat on this; all we check for is
2972                  whether there is a label on this instruction.  If
2973                  there are any branches to anything other than a
2974                  label, users must use .set noreorder.  */
2975               || si->label_list != NULL
2976               /* If the previous instruction is in a variant frag
2977                  other than this branch's one, we cannot do the swap.
2978                  This does not apply to the mips16, which uses variant
2979                  frags for different purposes.  */
2980               || (! mips_opts.mips16
2981                   && prev_insn_frag_type == rs_machine_dependent)
2982               /* Check for conflicts between the branch and the instructions
2983                  before the candidate delay slot.  */
2984               || nops_for_insn (history + 1, ip) > 0
2985               /* Check for conflicts between the swapped sequence and the
2986                  target of the branch.  */
2987               || nops_for_sequence (2, history + 1, ip, history) > 0
2988               /* We do not swap with a trap instruction, since it
2989                  complicates trap handlers to have the trap
2990                  instruction be in a delay slot.  */
2991               || (prev_pinfo & INSN_TRAP)
2992               /* If the branch reads a register that the previous
2993                  instruction sets, we can not swap.  */
2994               || (! mips_opts.mips16
2995                   && (prev_pinfo & INSN_WRITE_GPR_T)
2996                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
2997                                     MIPS_GR_REG))
2998               || (! mips_opts.mips16
2999                   && (prev_pinfo & INSN_WRITE_GPR_D)
3000                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3001                                     MIPS_GR_REG))
3002               || (mips_opts.mips16
3003                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3004                        && (insn_uses_reg
3005                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3006                             MIPS16_REG)))
3007                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3008                           && (insn_uses_reg
3009                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3010                                MIPS16_REG)))
3011                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3012                           && (insn_uses_reg
3013                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3014                                MIPS16_REG)))
3015                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3016                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3017                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3018                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3019                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3020                           && insn_uses_reg (ip,
3021                                             MIPS16OP_EXTRACT_REG32R
3022                                               (history[0].insn_opcode),
3023                                             MIPS_GR_REG))))
3024               /* If the branch writes a register that the previous
3025                  instruction sets, we can not swap (we know that
3026                  branches write only to RD or to $31).  */
3027               || (! mips_opts.mips16
3028                   && (prev_pinfo & INSN_WRITE_GPR_T)
3029                   && (((pinfo & INSN_WRITE_GPR_D)
3030                        && (EXTRACT_OPERAND (RT, history[0])
3031                            == EXTRACT_OPERAND (RD, *ip)))
3032                       || ((pinfo & INSN_WRITE_GPR_31)
3033                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3034               || (! mips_opts.mips16
3035                   && (prev_pinfo & INSN_WRITE_GPR_D)
3036                   && (((pinfo & INSN_WRITE_GPR_D)
3037                        && (EXTRACT_OPERAND (RD, history[0])
3038                            == EXTRACT_OPERAND (RD, *ip)))
3039                       || ((pinfo & INSN_WRITE_GPR_31)
3040                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3041               || (mips_opts.mips16
3042                   && (pinfo & MIPS16_INSN_WRITE_31)
3043                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3044                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3045                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3046                               == RA))))
3047               /* If the branch writes a register that the previous
3048                  instruction reads, we can not swap (we know that
3049                  branches only write to RD or to $31).  */
3050               || (! mips_opts.mips16
3051                   && (pinfo & INSN_WRITE_GPR_D)
3052                   && insn_uses_reg (&history[0],
3053                                     EXTRACT_OPERAND (RD, *ip),
3054                                     MIPS_GR_REG))
3055               || (! mips_opts.mips16
3056                   && (pinfo & INSN_WRITE_GPR_31)
3057                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3058               || (mips_opts.mips16
3059                   && (pinfo & MIPS16_INSN_WRITE_31)
3060                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3061               /* If one instruction sets a condition code and the
3062                  other one uses a condition code, we can not swap.  */
3063               || ((pinfo & INSN_READ_COND_CODE)
3064                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3065               || ((pinfo & INSN_WRITE_COND_CODE)
3066                   && (prev_pinfo & INSN_READ_COND_CODE))
3067               /* If the previous instruction uses the PC, we can not
3068                  swap.  */
3069               || (mips_opts.mips16
3070                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3071               /* If the previous instruction had a fixup in mips16
3072                  mode, we can not swap.  This normally means that the
3073                  previous instruction was a 4 byte branch anyhow.  */
3074               || (mips_opts.mips16 && history[0].fixp[0])
3075               /* If the previous instruction is a sync, sync.l, or
3076                  sync.p, we can not swap.  */
3077               || (prev_pinfo & INSN_SYNC))
3078             {
3079               if (mips_opts.mips16
3080                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3081                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3082                   && ISA_SUPPORTS_MIPS16E)
3083                 {
3084                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3085                   ip->insn_opcode |= 0x0080;
3086                   install_insn (ip);
3087                   insert_into_history (0, 1, ip);
3088                 } 
3089               else
3090                 {
3091                   /* We could do even better for unconditional branches to
3092                      portions of this object file; we could pick up the
3093                      instruction at the destination, put it in the delay
3094                      slot, and bump the destination address.  */
3095                   insert_into_history (0, 1, ip);
3096                   emit_nop ();
3097                 }
3098                 
3099               if (mips_relax.sequence)
3100                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3101             }
3102           else
3103             {
3104               /* It looks like we can actually do the swap.  */
3105               struct mips_cl_insn delay = history[0];
3106               if (mips_opts.mips16)
3107                 {
3108                   know (delay.frag == ip->frag);
3109                   move_insn (ip, delay.frag, delay.where);
3110                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3111                 }
3112               else if (relaxed_branch)
3113                 {
3114                   /* Add the delay slot instruction to the end of the
3115                      current frag and shrink the fixed part of the
3116                      original frag.  If the branch occupies the tail of
3117                      the latter, move it backwards to cover the gap.  */
3118                   delay.frag->fr_fix -= 4;
3119                   if (delay.frag == ip->frag)
3120                     move_insn (ip, ip->frag, ip->where - 4);
3121                   add_fixed_insn (&delay);
3122                 }
3123               else
3124                 {
3125                   move_insn (&delay, ip->frag, ip->where);
3126                   move_insn (ip, history[0].frag, history[0].where);
3127                 }
3128               history[0] = *ip;
3129               delay.fixed_p = 1;
3130               insert_into_history (0, 1, &delay);
3131             }
3132
3133           /* If that was an unconditional branch, forget the previous
3134              insn information.  */
3135           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3136             mips_no_prev_insn ();
3137         }
3138       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3139         {
3140           /* We don't yet optimize a branch likely.  What we should do
3141              is look at the target, copy the instruction found there
3142              into the delay slot, and increment the branch to jump to
3143              the next instruction.  */
3144           insert_into_history (0, 1, ip);
3145           emit_nop ();
3146         }
3147       else
3148         insert_into_history (0, 1, ip);
3149     }
3150   else
3151     insert_into_history (0, 1, ip);
3152
3153   /* We just output an insn, so the next one doesn't have a label.  */
3154   mips_clear_insn_labels ();
3155 }
3156
3157 /* Forget that there was any previous instruction or label.  */
3158
3159 static void
3160 mips_no_prev_insn (void)
3161 {
3162   prev_nop_frag = NULL;
3163   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3164   mips_clear_insn_labels ();
3165 }
3166
3167 /* This function must be called before we emit something other than
3168    instructions.  It is like mips_no_prev_insn except that it inserts
3169    any NOPS that might be needed by previous instructions.  */
3170
3171 void
3172 mips_emit_delays (void)
3173 {
3174   if (! mips_opts.noreorder)
3175     {
3176       int nops = nops_for_insn (history, NULL);
3177       if (nops > 0)
3178         {
3179           while (nops-- > 0)
3180             add_fixed_insn (NOP_INSN);
3181           mips_move_labels ();
3182         }
3183     }
3184   mips_no_prev_insn ();
3185 }
3186
3187 /* Start a (possibly nested) noreorder block.  */
3188
3189 static void
3190 start_noreorder (void)
3191 {
3192   if (mips_opts.noreorder == 0)
3193     {
3194       unsigned int i;
3195       int nops;
3196
3197       /* None of the instructions before the .set noreorder can be moved.  */
3198       for (i = 0; i < ARRAY_SIZE (history); i++)
3199         history[i].fixed_p = 1;
3200
3201       /* Insert any nops that might be needed between the .set noreorder
3202          block and the previous instructions.  We will later remove any
3203          nops that turn out not to be needed.  */
3204       nops = nops_for_insn (history, NULL);
3205       if (nops > 0)
3206         {
3207           if (mips_optimize != 0)
3208             {
3209               /* Record the frag which holds the nop instructions, so
3210                  that we can remove them if we don't need them.  */
3211               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3212               prev_nop_frag = frag_now;
3213               prev_nop_frag_holds = nops;
3214               prev_nop_frag_required = 0;
3215               prev_nop_frag_since = 0;
3216             }
3217
3218           for (; nops > 0; --nops)
3219             add_fixed_insn (NOP_INSN);
3220
3221           /* Move on to a new frag, so that it is safe to simply
3222              decrease the size of prev_nop_frag.  */
3223           frag_wane (frag_now);
3224           frag_new (0);
3225           mips_move_labels ();
3226         }
3227       mips16_mark_labels ();
3228       mips_clear_insn_labels ();
3229     }
3230   mips_opts.noreorder++;
3231   mips_any_noreorder = 1;
3232 }
3233
3234 /* End a nested noreorder block.  */
3235
3236 static void
3237 end_noreorder (void)
3238 {
3239   mips_opts.noreorder--;
3240   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3241     {
3242       /* Commit to inserting prev_nop_frag_required nops and go back to
3243          handling nop insertion the .set reorder way.  */
3244       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3245                                 * (mips_opts.mips16 ? 2 : 4));
3246       insert_into_history (prev_nop_frag_since,
3247                            prev_nop_frag_required, NOP_INSN);
3248       prev_nop_frag = NULL;
3249     }
3250 }
3251
3252 /* Set up global variables for the start of a new macro.  */
3253
3254 static void
3255 macro_start (void)
3256 {
3257   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3258   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3259                                      && (history[0].insn_mo->pinfo
3260                                          & (INSN_UNCOND_BRANCH_DELAY
3261                                             | INSN_COND_BRANCH_DELAY
3262                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3263 }
3264
3265 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3266    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3267    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3268
3269 static const char *
3270 macro_warning (relax_substateT subtype)
3271 {
3272   if (subtype & RELAX_DELAY_SLOT)
3273     return _("Macro instruction expanded into multiple instructions"
3274              " in a branch delay slot");
3275   else if (subtype & RELAX_NOMACRO)
3276     return _("Macro instruction expanded into multiple instructions");
3277   else
3278     return 0;
3279 }
3280
3281 /* Finish up a macro.  Emit warnings as appropriate.  */
3282
3283 static void
3284 macro_end (void)
3285 {
3286   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3287     {
3288       relax_substateT subtype;
3289
3290       /* Set up the relaxation warning flags.  */
3291       subtype = 0;
3292       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3293         subtype |= RELAX_SECOND_LONGER;
3294       if (mips_opts.warn_about_macros)
3295         subtype |= RELAX_NOMACRO;
3296       if (mips_macro_warning.delay_slot_p)
3297         subtype |= RELAX_DELAY_SLOT;
3298
3299       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3300         {
3301           /* Either the macro has a single implementation or both
3302              implementations are longer than 4 bytes.  Emit the
3303              warning now.  */
3304           const char *msg = macro_warning (subtype);
3305           if (msg != 0)
3306             as_warn (msg);
3307         }
3308       else
3309         {
3310           /* One implementation might need a warning but the other
3311              definitely doesn't.  */
3312           mips_macro_warning.first_frag->fr_subtype |= subtype;
3313         }
3314     }
3315 }
3316
3317 /* Read a macro's relocation codes from *ARGS and store them in *R.
3318    The first argument in *ARGS will be either the code for a single
3319    relocation or -1 followed by the three codes that make up a
3320    composite relocation.  */
3321
3322 static void
3323 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3324 {
3325   int i, next;
3326
3327   next = va_arg (*args, int);
3328   if (next >= 0)
3329     r[0] = (bfd_reloc_code_real_type) next;
3330   else
3331     for (i = 0; i < 3; i++)
3332       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3333 }
3334
3335 /* Build an instruction created by a macro expansion.  This is passed
3336    a pointer to the count of instructions created so far, an
3337    expression, the name of the instruction to build, an operand format
3338    string, and corresponding arguments.  */
3339
3340 static void
3341 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3342 {
3343   const struct mips_opcode *mo;
3344   struct mips_cl_insn insn;
3345   bfd_reloc_code_real_type r[3];
3346   va_list args;
3347
3348   va_start (args, fmt);
3349
3350   if (mips_opts.mips16)
3351     {
3352       mips16_macro_build (ep, name, fmt, args);
3353       va_end (args);
3354       return;
3355     }
3356
3357   r[0] = BFD_RELOC_UNUSED;
3358   r[1] = BFD_RELOC_UNUSED;
3359   r[2] = BFD_RELOC_UNUSED;
3360   mo = (struct mips_opcode *) hash_find (op_hash, name);
3361   assert (mo);
3362   assert (strcmp (name, mo->name) == 0);
3363
3364   while (1)
3365     {
3366       /* Search until we get a match for NAME.  It is assumed here that
3367          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3368       if (strcmp (fmt, mo->args) == 0
3369           && mo->pinfo != INSN_MACRO
3370           && OPCODE_IS_MEMBER (mo,
3371                                (mips_opts.isa
3372                                 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3373                                 | (mips_opts.ase_dsp ? INSN_DSP : 0)
3374                                 | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
3375                                    ? INSN_DSP64 : 0)
3376                                 | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
3377                                 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3378                                mips_opts.arch)
3379           && (mips_opts.arch != CPU_R4650 || (mo->pinfo & FP_D) == 0))
3380         break;
3381
3382       ++mo;
3383       assert (mo->name);
3384       assert (strcmp (name, mo->name) == 0);
3385     }
3386
3387   create_insn (&insn, mo);
3388   for (;;)
3389     {
3390       switch (*fmt++)
3391         {
3392         case '\0':
3393           break;
3394
3395         case ',':
3396         case '(':
3397         case ')':
3398           continue;
3399
3400         case '+':
3401           switch (*fmt++)
3402             {
3403             case 'A':
3404             case 'E':
3405               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3406               continue;
3407
3408             case 'B':
3409             case 'F':
3410               /* Note that in the macro case, these arguments are already
3411                  in MSB form.  (When handling the instruction in the
3412                  non-macro case, these arguments are sizes from which
3413                  MSB values must be calculated.)  */
3414               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3415               continue;
3416
3417             case 'C':
3418             case 'G':
3419             case 'H':
3420               /* Note that in the macro case, these arguments are already
3421                  in MSBD form.  (When handling the instruction in the
3422                  non-macro case, these arguments are sizes from which
3423                  MSBD values must be calculated.)  */
3424               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3425               continue;
3426
3427             default:
3428               internalError ();
3429             }
3430           continue;
3431
3432         case '2':
3433           INSERT_OPERAND (BP, insn, va_arg (args, int));
3434           continue;
3435
3436         case 't':
3437         case 'w':
3438         case 'E':
3439           INSERT_OPERAND (RT, insn, va_arg (args, int));
3440           continue;
3441
3442         case 'c':
3443           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3444           continue;
3445
3446         case 'T':
3447         case 'W':
3448           INSERT_OPERAND (FT, insn, va_arg (args, int));
3449           continue;
3450
3451         case 'd':
3452         case 'G':
3453         case 'K':
3454           INSERT_OPERAND (RD, insn, va_arg (args, int));
3455           continue;
3456
3457         case 'U':
3458           {
3459             int tmp = va_arg (args, int);
3460
3461             INSERT_OPERAND (RT, insn, tmp);
3462             INSERT_OPERAND (RD, insn, tmp);
3463             continue;
3464           }
3465
3466         case 'V':
3467         case 'S':
3468           INSERT_OPERAND (FS, insn, va_arg (args, int));
3469           continue;
3470
3471         case 'z':
3472           continue;
3473
3474         case '<':
3475           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3476           continue;
3477
3478         case 'D':
3479           INSERT_OPERAND (FD, insn, va_arg (args, int));
3480           continue;
3481
3482         case 'B':
3483           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3484           continue;
3485
3486         case 'J':
3487           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3488           continue;
3489
3490         case 'q':
3491           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3492           continue;
3493
3494         case 'b':
3495         case 's':
3496         case 'r':
3497         case 'v':
3498           INSERT_OPERAND (RS, insn, va_arg (args, int));
3499           continue;
3500
3501         case 'i':
3502         case 'j':
3503         case 'o':
3504           macro_read_relocs (&args, r);
3505           assert (*r == BFD_RELOC_GPREL16
3506                   || *r == BFD_RELOC_MIPS_LITERAL
3507                   || *r == BFD_RELOC_MIPS_HIGHER
3508                   || *r == BFD_RELOC_HI16_S
3509                   || *r == BFD_RELOC_LO16
3510                   || *r == BFD_RELOC_MIPS_GOT16
3511                   || *r == BFD_RELOC_MIPS_CALL16
3512                   || *r == BFD_RELOC_MIPS_GOT_DISP
3513                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3514                   || *r == BFD_RELOC_MIPS_GOT_OFST
3515                   || *r == BFD_RELOC_MIPS_GOT_LO16
3516                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3517           continue;
3518
3519         case 'u':
3520           macro_read_relocs (&args, r);
3521           assert (ep != NULL
3522                   && (ep->X_op == O_constant
3523                       || (ep->X_op == O_symbol
3524                           && (*r == BFD_RELOC_MIPS_HIGHEST
3525                               || *r == BFD_RELOC_HI16_S
3526                               || *r == BFD_RELOC_HI16
3527                               || *r == BFD_RELOC_GPREL16
3528                               || *r == BFD_RELOC_MIPS_GOT_HI16
3529                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3530           continue;
3531
3532         case 'p':
3533           assert (ep != NULL);
3534
3535           /*
3536            * This allows macro() to pass an immediate expression for
3537            * creating short branches without creating a symbol.
3538            *
3539            * We don't allow branch relaxation for these branches, as
3540            * they should only appear in ".set nomacro" anyway.
3541            */
3542           if (ep->X_op == O_constant)
3543             {
3544               if ((ep->X_add_number & 3) != 0)
3545                 as_bad (_("branch to misaligned address (0x%lx)"),
3546                         (unsigned long) ep->X_add_number);
3547               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3548                 as_bad (_("branch address range overflow (0x%lx)"),
3549                         (unsigned long) ep->X_add_number);
3550               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3551               ep = NULL;
3552             }
3553           else
3554             *r = BFD_RELOC_16_PCREL_S2;
3555           continue;
3556
3557         case 'a':
3558           assert (ep != NULL);
3559           *r = BFD_RELOC_MIPS_JMP;
3560           continue;
3561
3562         case 'C':
3563           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3564           continue;
3565
3566         case 'k':
3567           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3568           continue;
3569
3570         default:
3571           internalError ();
3572         }
3573       break;
3574     }
3575   va_end (args);
3576   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3577
3578   append_insn (&insn, ep, r);
3579 }
3580
3581 static void
3582 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3583                     va_list args)
3584 {
3585   struct mips_opcode *mo;
3586   struct mips_cl_insn insn;
3587   bfd_reloc_code_real_type r[3]
3588     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3589
3590   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3591   assert (mo);
3592   assert (strcmp (name, mo->name) == 0);
3593
3594   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3595     {
3596       ++mo;
3597       assert (mo->name);
3598       assert (strcmp (name, mo->name) == 0);
3599     }
3600
3601   create_insn (&insn, mo);
3602   for (;;)
3603     {
3604       int c;
3605
3606       c = *fmt++;
3607       switch (c)
3608         {
3609         case '\0':
3610           break;
3611
3612         case ',':
3613         case '(':
3614         case ')':
3615           continue;
3616
3617         case 'y':
3618         case 'w':
3619           MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3620           continue;
3621
3622         case 'x':
3623         case 'v':
3624           MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3625           continue;
3626
3627         case 'z':
3628           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3629           continue;
3630
3631         case 'Z':
3632           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3633           continue;
3634
3635         case '0':
3636         case 'S':
3637         case 'P':
3638         case 'R':
3639           continue;
3640
3641         case 'X':
3642           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3643           continue;
3644
3645         case 'Y':
3646           {
3647             int regno;
3648
3649             regno = va_arg (args, int);
3650             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3651             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3652           }
3653           continue;
3654
3655         case '<':
3656         case '>':
3657         case '4':
3658         case '5':
3659         case 'H':
3660         case 'W':
3661         case 'D':
3662         case 'j':
3663         case '8':
3664         case 'V':
3665         case 'C':
3666         case 'U':
3667         case 'k':
3668         case 'K':
3669         case 'p':
3670         case 'q':
3671           {
3672             assert (ep != NULL);
3673
3674             if (ep->X_op != O_constant)
3675               *r = (int) BFD_RELOC_UNUSED + c;
3676             else
3677               {
3678                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3679                               FALSE, &insn.insn_opcode, &insn.use_extend,
3680                               &insn.extend);
3681                 ep = NULL;
3682                 *r = BFD_RELOC_UNUSED;
3683               }
3684           }
3685           continue;
3686
3687         case '6':
3688           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3689           continue;
3690         }
3691
3692       break;
3693     }
3694
3695   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3696
3697   append_insn (&insn, ep, r);
3698 }
3699
3700 /*
3701  * Sign-extend 32-bit mode constants that have bit 31 set and all
3702  * higher bits unset.
3703  */
3704 static void
3705 normalize_constant_expr (expressionS *ex)
3706 {
3707   if (ex->X_op == O_constant
3708       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3709     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3710                         - 0x80000000);
3711 }
3712
3713 /*
3714  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3715  * all higher bits unset.
3716  */
3717 static void
3718 normalize_address_expr (expressionS *ex)
3719 {
3720   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3721         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3722       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3723     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3724                         - 0x80000000);
3725 }
3726
3727 /*
3728  * Generate a "jalr" instruction with a relocation hint to the called
3729  * function.  This occurs in NewABI PIC code.
3730  */
3731 static void
3732 macro_build_jalr (expressionS *ep)
3733 {
3734   char *f = NULL;
3735
3736   if (HAVE_NEWABI)
3737     {
3738       frag_grow (8);
3739       f = frag_more (0);
3740     }
3741   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3742   if (HAVE_NEWABI)
3743     fix_new_exp (frag_now, f - frag_now->fr_literal,
3744                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3745 }
3746
3747 /*
3748  * Generate a "lui" instruction.
3749  */
3750 static void
3751 macro_build_lui (expressionS *ep, int regnum)
3752 {
3753   expressionS high_expr;
3754   const struct mips_opcode *mo;
3755   struct mips_cl_insn insn;
3756   bfd_reloc_code_real_type r[3]
3757     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3758   const char *name = "lui";
3759   const char *fmt = "t,u";
3760
3761   assert (! mips_opts.mips16);
3762
3763   high_expr = *ep;
3764
3765   if (high_expr.X_op == O_constant)
3766     {
3767       /* We can compute the instruction now without a relocation entry.  */
3768       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3769                                 >> 16) & 0xffff;
3770       *r = BFD_RELOC_UNUSED;
3771     }
3772   else
3773     {
3774       assert (ep->X_op == O_symbol);
3775       /* _gp_disp is a special case, used from s_cpload.
3776          __gnu_local_gp is used if mips_no_shared.  */
3777       assert (mips_pic == NO_PIC
3778               || (! HAVE_NEWABI
3779                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3780               || (! mips_in_shared
3781                   && strcmp (S_GET_NAME (ep->X_add_symbol),
3782                              "__gnu_local_gp") == 0));
3783       *r = BFD_RELOC_HI16_S;
3784     }
3785
3786   mo = hash_find (op_hash, name);
3787   assert (strcmp (name, mo->name) == 0);
3788   assert (strcmp (fmt, mo->args) == 0);
3789   create_insn (&insn, mo);
3790
3791   insn.insn_opcode = insn.insn_mo->match;
3792   INSERT_OPERAND (RT, insn, regnum);
3793   if (*r == BFD_RELOC_UNUSED)
3794     {
3795       insn.insn_opcode |= high_expr.X_add_number;
3796       append_insn (&insn, NULL, r);
3797     }
3798   else
3799     append_insn (&insn, &high_expr, r);
3800 }
3801
3802 /* Generate a sequence of instructions to do a load or store from a constant
3803    offset off of a base register (breg) into/from a target register (treg),
3804    using AT if necessary.  */
3805 static void
3806 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3807                               int treg, int breg, int dbl)
3808 {
3809   assert (ep->X_op == O_constant);
3810
3811   /* Sign-extending 32-bit constants makes their handling easier.  */
3812   if (!dbl)
3813     normalize_constant_expr (ep);
3814
3815   /* Right now, this routine can only handle signed 32-bit constants.  */
3816   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3817     as_warn (_("operand overflow"));
3818
3819   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3820     {
3821       /* Signed 16-bit offset will fit in the op.  Easy!  */
3822       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3823     }
3824   else
3825     {
3826       /* 32-bit offset, need multiple instructions and AT, like:
3827            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3828            addu     $tempreg,$tempreg,$breg
3829            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3830          to handle the complete offset.  */
3831       macro_build_lui (ep, AT);
3832       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3833       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3834
3835       if (!mips_opts.at)
3836         as_bad (_("Macro used $at after \".set noat\""));
3837     }
3838 }
3839
3840 /*                      set_at()
3841  * Generates code to set the $at register to true (one)
3842  * if reg is less than the immediate expression.
3843  */
3844 static void
3845 set_at (int reg, int unsignedp)
3846 {
3847   if (imm_expr.X_op == O_constant
3848       && imm_expr.X_add_number >= -0x8000
3849       && imm_expr.X_add_number < 0x8000)
3850     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3851                  AT, reg, BFD_RELOC_LO16);
3852   else
3853     {
3854       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3855       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3856     }
3857 }
3858
3859 /* Warn if an expression is not a constant.  */
3860
3861 static void
3862 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3863 {
3864   if (ex->X_op == O_big)
3865     as_bad (_("unsupported large constant"));
3866   else if (ex->X_op != O_constant)
3867     as_bad (_("Instruction %s requires absolute expression"),
3868             ip->insn_mo->name);
3869
3870   if (HAVE_32BIT_GPRS)
3871     normalize_constant_expr (ex);
3872 }
3873
3874 /* Count the leading zeroes by performing a binary chop. This is a
3875    bulky bit of source, but performance is a LOT better for the
3876    majority of values than a simple loop to count the bits:
3877        for (lcnt = 0; (lcnt < 32); lcnt++)
3878          if ((v) & (1 << (31 - lcnt)))
3879            break;
3880   However it is not code size friendly, and the gain will drop a bit
3881   on certain cached systems.
3882 */
3883 #define COUNT_TOP_ZEROES(v)             \
3884   (((v) & ~0xffff) == 0                 \
3885    ? ((v) & ~0xff) == 0                 \
3886      ? ((v) & ~0xf) == 0                \
3887        ? ((v) & ~0x3) == 0              \
3888          ? ((v) & ~0x1) == 0            \
3889            ? !(v)                       \
3890              ? 32                       \
3891              : 31                       \
3892            : 30                         \
3893          : ((v) & ~0x7) == 0            \
3894            ? 29                         \
3895            : 28                         \
3896        : ((v) & ~0x3f) == 0             \
3897          ? ((v) & ~0x1f) == 0           \
3898            ? 27                         \
3899            : 26                         \
3900          : ((v) & ~0x7f) == 0           \
3901            ? 25                         \
3902            : 24                         \
3903      : ((v) & ~0xfff) == 0              \
3904        ? ((v) & ~0x3ff) == 0            \
3905          ? ((v) & ~0x1ff) == 0          \
3906            ? 23                         \
3907            : 22                         \
3908          : ((v) & ~0x7ff) == 0          \
3909            ? 21                         \
3910            : 20                         \
3911        : ((v) & ~0x3fff) == 0           \
3912          ? ((v) & ~0x1fff) == 0         \
3913            ? 19                         \
3914            : 18                         \
3915          : ((v) & ~0x7fff) == 0         \
3916            ? 17                         \
3917            : 16                         \
3918    : ((v) & ~0xffffff) == 0             \
3919      ? ((v) & ~0xfffff) == 0            \
3920        ? ((v) & ~0x3ffff) == 0          \
3921          ? ((v) & ~0x1ffff) == 0        \
3922            ? 15                         \
3923            : 14                         \
3924          : ((v) & ~0x7ffff) == 0        \
3925            ? 13                         \
3926            : 12                         \
3927        : ((v) & ~0x3fffff) == 0         \
3928          ? ((v) & ~0x1fffff) == 0       \
3929            ? 11                         \
3930            : 10                         \
3931          : ((v) & ~0x7fffff) == 0       \
3932            ? 9                          \
3933            : 8                          \
3934      : ((v) & ~0xfffffff) == 0          \
3935        ? ((v) & ~0x3ffffff) == 0        \
3936          ? ((v) & ~0x1ffffff) == 0      \
3937            ? 7                          \
3938            : 6                          \
3939          : ((v) & ~0x7ffffff) == 0      \
3940            ? 5                          \
3941            : 4                          \
3942        : ((v) & ~0x3fffffff) == 0       \
3943          ? ((v) & ~0x1fffffff) == 0     \
3944            ? 3                          \
3945            : 2                          \
3946          : ((v) & ~0x7fffffff) == 0     \
3947            ? 1                          \
3948            : 0)
3949
3950 /*                      load_register()
3951  *  This routine generates the least number of instructions necessary to load
3952  *  an absolute expression value into a register.
3953  */
3954 static void
3955 load_register (int reg, expressionS *ep, int dbl)
3956 {
3957   int freg;
3958   expressionS hi32, lo32;
3959
3960   if (ep->X_op != O_big)
3961     {
3962       assert (ep->X_op == O_constant);
3963
3964       /* Sign-extending 32-bit constants makes their handling easier.  */
3965       if (!dbl)
3966         normalize_constant_expr (ep);
3967
3968       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3969         {
3970           /* We can handle 16 bit signed values with an addiu to
3971              $zero.  No need to ever use daddiu here, since $zero and
3972              the result are always correct in 32 bit mode.  */
3973           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3974           return;
3975         }
3976       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3977         {
3978           /* We can handle 16 bit unsigned values with an ori to
3979              $zero.  */
3980           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3981           return;
3982         }
3983       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3984         {
3985           /* 32 bit values require an lui.  */
3986           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3987           if ((ep->X_add_number & 0xffff) != 0)
3988             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3989           return;
3990         }
3991     }
3992
3993   /* The value is larger than 32 bits.  */
3994
3995   if (!dbl || HAVE_32BIT_GPRS)
3996     {
3997       char value[32];
3998
3999       sprintf_vma (value, ep->X_add_number);
4000       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4001       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4002       return;
4003     }
4004
4005   if (ep->X_op != O_big)
4006     {
4007       hi32 = *ep;
4008       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4009       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4010       hi32.X_add_number &= 0xffffffff;
4011       lo32 = *ep;
4012       lo32.X_add_number &= 0xffffffff;
4013     }
4014   else
4015     {
4016       assert (ep->X_add_number > 2);
4017       if (ep->X_add_number == 3)
4018         generic_bignum[3] = 0;
4019       else if (ep->X_add_number > 4)
4020         as_bad (_("Number larger than 64 bits"));
4021       lo32.X_op = O_constant;
4022       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4023       hi32.X_op = O_constant;
4024       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4025     }
4026
4027   if (hi32.X_add_number == 0)
4028     freg = 0;
4029   else
4030     {
4031       int shift, bit;
4032       unsigned long hi, lo;
4033
4034       if (hi32.X_add_number == (offsetT) 0xffffffff)
4035         {
4036           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4037             {
4038               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4039               return;
4040             }
4041           if (lo32.X_add_number & 0x80000000)
4042             {
4043               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4044               if (lo32.X_add_number & 0xffff)
4045                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4046               return;
4047             }
4048         }
4049
4050       /* Check for 16bit shifted constant.  We know that hi32 is
4051          non-zero, so start the mask on the first bit of the hi32
4052          value.  */
4053       shift = 17;
4054       do
4055         {
4056           unsigned long himask, lomask;
4057
4058           if (shift < 32)
4059             {
4060               himask = 0xffff >> (32 - shift);
4061               lomask = (0xffff << shift) & 0xffffffff;
4062             }
4063           else
4064             {
4065               himask = 0xffff << (shift - 32);
4066               lomask = 0;
4067             }
4068           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4069               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4070             {
4071               expressionS tmp;
4072
4073               tmp.X_op = O_constant;
4074               if (shift < 32)
4075                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4076                                     | (lo32.X_add_number >> shift));
4077               else
4078                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4079               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4080               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4081                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4082               return;
4083             }
4084           ++shift;
4085         }
4086       while (shift <= (64 - 16));
4087
4088       /* Find the bit number of the lowest one bit, and store the
4089          shifted value in hi/lo.  */
4090       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4091       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4092       if (lo != 0)
4093         {
4094           bit = 0;
4095           while ((lo & 1) == 0)
4096             {
4097               lo >>= 1;
4098               ++bit;
4099             }
4100           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4101           hi >>= bit;
4102         }
4103       else
4104         {
4105           bit = 32;
4106           while ((hi & 1) == 0)
4107             {
4108               hi >>= 1;
4109               ++bit;
4110             }
4111           lo = hi;
4112           hi = 0;
4113         }
4114
4115       /* Optimize if the shifted value is a (power of 2) - 1.  */
4116       if ((hi == 0 && ((lo + 1) & lo) == 0)
4117           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4118         {
4119           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4120           if (shift != 0)
4121             {
4122               expressionS tmp;
4123
4124               /* This instruction will set the register to be all
4125                  ones.  */
4126               tmp.X_op = O_constant;
4127               tmp.X_add_number = (offsetT) -1;
4128               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4129               if (bit != 0)
4130                 {
4131                   bit += shift;
4132                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4133                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4134                 }
4135               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4136                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4137               return;
4138             }
4139         }
4140
4141       /* Sign extend hi32 before calling load_register, because we can
4142          generally get better code when we load a sign extended value.  */
4143       if ((hi32.X_add_number & 0x80000000) != 0)
4144         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4145       load_register (reg, &hi32, 0);
4146       freg = reg;
4147     }
4148   if ((lo32.X_add_number & 0xffff0000) == 0)
4149     {
4150       if (freg != 0)
4151         {
4152           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4153           freg = reg;
4154         }
4155     }
4156   else
4157     {
4158       expressionS mid16;
4159
4160       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4161         {
4162           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4163           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4164           return;
4165         }
4166
4167       if (freg != 0)
4168         {
4169           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4170           freg = reg;
4171         }
4172       mid16 = lo32;
4173       mid16.X_add_number >>= 16;
4174       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4175       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4176       freg = reg;
4177     }
4178   if ((lo32.X_add_number & 0xffff) != 0)
4179     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4180 }
4181
4182 static inline void
4183 load_delay_nop (void)
4184 {
4185   if (!gpr_interlocks)
4186     macro_build (NULL, "nop", "");
4187 }
4188
4189 /* Load an address into a register.  */
4190
4191 static void
4192 load_address (int reg, expressionS *ep, int *used_at)
4193 {
4194   if (ep->X_op != O_constant
4195       && ep->X_op != O_symbol)
4196     {
4197       as_bad (_("expression too complex"));
4198       ep->X_op = O_constant;
4199     }
4200
4201   if (ep->X_op == O_constant)
4202     {
4203       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4204       return;
4205     }
4206
4207   if (mips_pic == NO_PIC)
4208     {
4209       /* If this is a reference to a GP relative symbol, we want
4210            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4211          Otherwise we want
4212            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4213            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4214          If we have an addend, we always use the latter form.
4215
4216          With 64bit address space and a usable $at we want
4217            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4218            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4219            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4220            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4221            dsll32       $reg,0
4222            daddu        $reg,$reg,$at
4223
4224          If $at is already in use, we use a path which is suboptimal
4225          on superscalar processors.
4226            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4227            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4228            dsll         $reg,16
4229            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4230            dsll         $reg,16
4231            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4232
4233          For GP relative symbols in 64bit address space we can use
4234          the same sequence as in 32bit address space.  */
4235       if (HAVE_64BIT_SYMBOLS)
4236         {
4237           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4238               && !nopic_need_relax (ep->X_add_symbol, 1))
4239             {
4240               relax_start (ep->X_add_symbol);
4241               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4242                            mips_gp_register, BFD_RELOC_GPREL16);
4243               relax_switch ();
4244             }
4245
4246           if (*used_at == 0 && mips_opts.at)
4247             {
4248               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4249               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4250               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4251                            BFD_RELOC_MIPS_HIGHER);
4252               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4253               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4254               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4255               *used_at = 1;
4256             }
4257           else
4258             {
4259               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4260               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4261                            BFD_RELOC_MIPS_HIGHER);
4262               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4263               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4264               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4265               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4266             }
4267
4268           if (mips_relax.sequence)
4269             relax_end ();
4270         }
4271       else
4272         {
4273           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4274               && !nopic_need_relax (ep->X_add_symbol, 1))
4275             {
4276               relax_start (ep->X_add_symbol);
4277               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4278                            mips_gp_register, BFD_RELOC_GPREL16);
4279               relax_switch ();
4280             }
4281           macro_build_lui (ep, reg);
4282           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4283                        reg, reg, BFD_RELOC_LO16);
4284           if (mips_relax.sequence)
4285             relax_end ();
4286         }
4287     }
4288   else if (!mips_big_got)
4289     {
4290       expressionS ex;
4291
4292       /* If this is a reference to an external symbol, we want
4293            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4294          Otherwise we want
4295            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4296            nop
4297            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4298          If there is a constant, it must be added in after.
4299
4300          If we have NewABI, we want
4301            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4302          unless we're referencing a global symbol with a non-zero
4303          offset, in which case cst must be added separately.  */
4304       if (HAVE_NEWABI)
4305         {
4306           if (ep->X_add_number)
4307             {
4308               ex.X_add_number = ep->X_add_number;
4309               ep->X_add_number = 0;
4310               relax_start (ep->X_add_symbol);
4311               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4312                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4313               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4314                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4315               ex.X_op = O_constant;
4316               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4317                            reg, reg, BFD_RELOC_LO16);
4318               ep->X_add_number = ex.X_add_number;
4319               relax_switch ();
4320             }
4321           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4322                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4323           if (mips_relax.sequence)
4324             relax_end ();
4325         }
4326       else
4327         {
4328           ex.X_add_number = ep->X_add_number;
4329           ep->X_add_number = 0;
4330           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4331                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4332           load_delay_nop ();
4333           relax_start (ep->X_add_symbol);
4334           relax_switch ();
4335           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4336                        BFD_RELOC_LO16);
4337           relax_end ();
4338
4339           if (ex.X_add_number != 0)
4340             {
4341               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4342                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4343               ex.X_op = O_constant;
4344               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4345                            reg, reg, BFD_RELOC_LO16);
4346             }
4347         }
4348     }
4349   else if (mips_big_got)
4350     {
4351       expressionS ex;
4352
4353       /* This is the large GOT case.  If this is a reference to an
4354          external symbol, we want
4355            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4356            addu         $reg,$reg,$gp
4357            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4358
4359          Otherwise, for a reference to a local symbol in old ABI, we want
4360            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4361            nop
4362            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4363          If there is a constant, it must be added in after.
4364
4365          In the NewABI, for local symbols, with or without offsets, we want:
4366            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4367            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4368       */
4369       if (HAVE_NEWABI)
4370         {
4371           ex.X_add_number = ep->X_add_number;
4372           ep->X_add_number = 0;
4373           relax_start (ep->X_add_symbol);
4374           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4375           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4376                        reg, reg, mips_gp_register);
4377           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4378                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4379           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4380             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4381           else if (ex.X_add_number)
4382             {
4383               ex.X_op = O_constant;
4384               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4385                            BFD_RELOC_LO16);
4386             }
4387
4388           ep->X_add_number = ex.X_add_number;
4389           relax_switch ();
4390           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4391                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4392           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4393                        BFD_RELOC_MIPS_GOT_OFST);
4394           relax_end ();
4395         }
4396       else
4397         {
4398           ex.X_add_number = ep->X_add_number;
4399           ep->X_add_number = 0;
4400           relax_start (ep->X_add_symbol);
4401           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4402           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4403                        reg, reg, mips_gp_register);
4404           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4405                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4406           relax_switch ();
4407           if (reg_needs_delay (mips_gp_register))
4408             {
4409               /* We need a nop before loading from $gp.  This special
4410                  check is required because the lui which starts the main
4411                  instruction stream does not refer to $gp, and so will not
4412                  insert the nop which may be required.  */
4413               macro_build (NULL, "nop", "");
4414             }
4415           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4416                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4417           load_delay_nop ();
4418           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4419                        BFD_RELOC_LO16);
4420           relax_end ();
4421
4422           if (ex.X_add_number != 0)
4423             {
4424               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4425                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4426               ex.X_op = O_constant;
4427               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4428                            BFD_RELOC_LO16);
4429             }
4430         }
4431     }
4432   else
4433     abort ();
4434
4435   if (!mips_opts.at && *used_at == 1)
4436     as_bad (_("Macro used $at after \".set noat\""));
4437 }
4438
4439 /* Move the contents of register SOURCE into register DEST.  */
4440
4441 static void
4442 move_register (int dest, int source)
4443 {
4444   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4445                dest, source, 0);
4446 }
4447
4448 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4449    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4450    The two alternatives are:
4451
4452    Global symbol                Local sybmol
4453    -------------                ------------
4454    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4455    ...                          ...
4456    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4457
4458    load_got_offset emits the first instruction and add_got_offset
4459    emits the second for a 16-bit offset or add_got_offset_hilo emits
4460    a sequence to add a 32-bit offset using a scratch register.  */
4461
4462 static void
4463 load_got_offset (int dest, expressionS *local)
4464 {
4465   expressionS global;
4466
4467   global = *local;
4468   global.X_add_number = 0;
4469
4470   relax_start (local->X_add_symbol);
4471   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4472                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4473   relax_switch ();
4474   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4475                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4476   relax_end ();
4477 }
4478
4479 static void
4480 add_got_offset (int dest, expressionS *local)
4481 {
4482   expressionS global;
4483
4484   global.X_op = O_constant;
4485   global.X_op_symbol = NULL;
4486   global.X_add_symbol = NULL;
4487   global.X_add_number = local->X_add_number;
4488
4489   relax_start (local->X_add_symbol);
4490   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4491                dest, dest, BFD_RELOC_LO16);
4492   relax_switch ();
4493   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4494   relax_end ();
4495 }
4496
4497 static void
4498 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4499 {
4500   expressionS global;
4501   int hold_mips_optimize;
4502
4503   global.X_op = O_constant;
4504   global.X_op_symbol = NULL;
4505   global.X_add_symbol = NULL;
4506   global.X_add_number = local->X_add_number;
4507
4508   relax_start (local->X_add_symbol);
4509   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4510   relax_switch ();
4511   /* Set mips_optimize around the lui instruction to avoid
4512      inserting an unnecessary nop after the lw.  */
4513   hold_mips_optimize = mips_optimize;
4514   mips_optimize = 2;
4515   macro_build_lui (&global, tmp);
4516   mips_optimize = hold_mips_optimize;
4517   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4518   relax_end ();
4519
4520   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4521 }
4522
4523 /*
4524  *                      Build macros
4525  *   This routine implements the seemingly endless macro or synthesized
4526  * instructions and addressing modes in the mips assembly language. Many
4527  * of these macros are simple and are similar to each other. These could
4528  * probably be handled by some kind of table or grammar approach instead of
4529  * this verbose method. Others are not simple macros but are more like
4530  * optimizing code generation.
4531  *   One interesting optimization is when several store macros appear
4532  * consecutively that would load AT with the upper half of the same address.
4533  * The ensuing load upper instructions are ommited. This implies some kind
4534  * of global optimization. We currently only optimize within a single macro.
4535  *   For many of the load and store macros if the address is specified as a
4536  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4537  * first load register 'at' with zero and use it as the base register. The
4538  * mips assembler simply uses register $zero. Just one tiny optimization
4539  * we're missing.
4540  */
4541 static void
4542 macro (struct mips_cl_insn *ip)
4543 {
4544   unsigned int treg, sreg, dreg, breg;
4545   unsigned int tempreg;
4546   int mask;
4547   int used_at = 0;
4548   expressionS expr1;
4549   const char *s;
4550   const char *s2;
4551   const char *fmt;
4552   int likely = 0;
4553   int dbl = 0;
4554   int coproc = 0;
4555   int lr = 0;
4556   int imm = 0;
4557   int call = 0;
4558   int off;
4559   offsetT maxnum;
4560   bfd_reloc_code_real_type r;
4561   int hold_mips_optimize;
4562
4563   assert (! mips_opts.mips16);
4564
4565   treg = (ip->insn_opcode >> 16) & 0x1f;
4566   dreg = (ip->insn_opcode >> 11) & 0x1f;
4567   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4568   mask = ip->insn_mo->mask;
4569
4570   expr1.X_op = O_constant;
4571   expr1.X_op_symbol = NULL;
4572   expr1.X_add_symbol = NULL;
4573   expr1.X_add_number = 1;
4574
4575   switch (mask)
4576     {
4577     case M_DABS:
4578       dbl = 1;
4579     case M_ABS:
4580       /* bgez $a0,.+12
4581          move v0,$a0
4582          sub v0,$zero,$a0
4583          */
4584
4585       start_noreorder ();
4586
4587       expr1.X_add_number = 8;
4588       macro_build (&expr1, "bgez", "s,p", sreg);
4589       if (dreg == sreg)
4590         macro_build (NULL, "nop", "", 0);
4591       else
4592         move_register (dreg, sreg);
4593       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4594
4595       end_noreorder ();
4596       break;
4597
4598     case M_ADD_I:
4599       s = "addi";
4600       s2 = "add";
4601       goto do_addi;
4602     case M_ADDU_I:
4603       s = "addiu";
4604       s2 = "addu";
4605       goto do_addi;
4606     case M_DADD_I:
4607       dbl = 1;
4608       s = "daddi";
4609       s2 = "dadd";
4610       goto do_addi;
4611     case M_DADDU_I:
4612       dbl = 1;
4613       s = "daddiu";
4614       s2 = "daddu";
4615     do_addi:
4616       if (imm_expr.X_op == O_constant
4617           && imm_expr.X_add_number >= -0x8000
4618           && imm_expr.X_add_number < 0x8000)
4619         {
4620           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4621           break;
4622         }
4623       used_at = 1;
4624       load_register (AT, &imm_expr, dbl);
4625       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4626       break;
4627
4628     case M_AND_I:
4629       s = "andi";
4630       s2 = "and";
4631       goto do_bit;
4632     case M_OR_I:
4633       s = "ori";
4634       s2 = "or";
4635       goto do_bit;
4636     case M_NOR_I:
4637       s = "";
4638       s2 = "nor";
4639       goto do_bit;
4640     case M_XOR_I:
4641       s = "xori";
4642       s2 = "xor";
4643     do_bit:
4644       if (imm_expr.X_op == O_constant
4645           && imm_expr.X_add_number >= 0
4646           && imm_expr.X_add_number < 0x10000)
4647         {
4648           if (mask != M_NOR_I)
4649             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4650           else
4651             {
4652               macro_build (&imm_expr, "ori", "t,r,i",
4653                            treg, sreg, BFD_RELOC_LO16);
4654               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4655             }
4656           break;
4657         }
4658
4659       used_at = 1;
4660       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4661       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4662       break;
4663
4664     case M_BALIGN:
4665       switch (imm_expr.X_add_number)
4666         {
4667         case 0:
4668           macro_build (NULL, "nop", "");
4669           break;
4670         case 2:
4671           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4672           break;
4673         default:
4674           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4675                        (int)imm_expr.X_add_number);
4676           break;
4677         }
4678       break;
4679
4680     case M_BEQ_I:
4681       s = "beq";
4682       goto beq_i;
4683     case M_BEQL_I:
4684       s = "beql";
4685       likely = 1;
4686       goto beq_i;
4687     case M_BNE_I:
4688       s = "bne";
4689       goto beq_i;
4690     case M_BNEL_I:
4691       s = "bnel";
4692       likely = 1;
4693     beq_i:
4694       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4695         {
4696           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4697           break;
4698         }
4699       used_at = 1;
4700       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4701       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4702       break;
4703
4704     case M_BGEL:
4705       likely = 1;
4706     case M_BGE:
4707       if (treg == 0)
4708         {
4709           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4710           break;
4711         }
4712       if (sreg == 0)
4713         {
4714           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4715           break;
4716         }
4717       used_at = 1;
4718       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4719       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4720       break;
4721
4722     case M_BGTL_I:
4723       likely = 1;
4724     case M_BGT_I:
4725       /* check for > max integer */
4726       maxnum = 0x7fffffff;
4727       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4728         {
4729           maxnum <<= 16;
4730           maxnum |= 0xffff;
4731           maxnum <<= 16;
4732           maxnum |= 0xffff;
4733         }
4734       if (imm_expr.X_op == O_constant
4735           && imm_expr.X_add_number >= maxnum
4736           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4737         {
4738         do_false:
4739           /* result is always false */
4740           if (! likely)
4741             macro_build (NULL, "nop", "", 0);
4742           else
4743             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4744           break;
4745         }
4746       if (imm_expr.X_op != O_constant)
4747         as_bad (_("Unsupported large constant"));
4748       ++imm_expr.X_add_number;
4749       /* FALLTHROUGH */
4750     case M_BGE_I:
4751     case M_BGEL_I:
4752       if (mask == M_BGEL_I)
4753         likely = 1;
4754       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4755         {
4756           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4757           break;
4758         }
4759       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4760         {
4761           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4762           break;
4763         }
4764       maxnum = 0x7fffffff;
4765       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4766         {
4767           maxnum <<= 16;
4768           maxnum |= 0xffff;
4769           maxnum <<= 16;
4770           maxnum |= 0xffff;
4771         }
4772       maxnum = - maxnum - 1;
4773       if (imm_expr.X_op == O_constant
4774           && imm_expr.X_add_number <= maxnum
4775           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4776         {
4777         do_true:
4778           /* result is always true */
4779           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4780           macro_build (&offset_expr, "b", "p");
4781           break;
4782         }
4783       used_at = 1;
4784       set_at (sreg, 0);
4785       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4786       break;
4787
4788     case M_BGEUL:
4789       likely = 1;
4790     case M_BGEU:
4791       if (treg == 0)
4792         goto do_true;
4793       if (sreg == 0)
4794         {
4795           macro_build (&offset_expr, likely ? "beql" : "beq",
4796                        "s,t,p", 0, treg);
4797           break;
4798         }
4799       used_at = 1;
4800       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4801       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4802       break;
4803
4804     case M_BGTUL_I:
4805       likely = 1;
4806     case M_BGTU_I:
4807       if (sreg == 0
4808           || (HAVE_32BIT_GPRS
4809               && imm_expr.X_op == O_constant
4810               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4811         goto do_false;
4812       if (imm_expr.X_op != O_constant)
4813         as_bad (_("Unsupported large constant"));
4814       ++imm_expr.X_add_number;
4815       /* FALLTHROUGH */
4816     case M_BGEU_I:
4817     case M_BGEUL_I:
4818       if (mask == M_BGEUL_I)
4819         likely = 1;
4820       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4821         goto do_true;
4822       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4823         {
4824           macro_build (&offset_expr, likely ? "bnel" : "bne",
4825                        "s,t,p", sreg, 0);
4826           break;
4827         }
4828       used_at = 1;
4829       set_at (sreg, 1);
4830       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4831       break;
4832
4833     case M_BGTL:
4834       likely = 1;
4835     case M_BGT:
4836       if (treg == 0)
4837         {
4838           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4839           break;
4840         }
4841       if (sreg == 0)
4842         {
4843           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4844           break;
4845         }
4846       used_at = 1;
4847       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4848       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4849       break;
4850
4851     case M_BGTUL:
4852       likely = 1;
4853     case M_BGTU:
4854       if (treg == 0)
4855         {
4856           macro_build (&offset_expr, likely ? "bnel" : "bne",
4857                        "s,t,p", sreg, 0);
4858           break;
4859         }
4860       if (sreg == 0)
4861         goto do_false;
4862       used_at = 1;
4863       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4864       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4865       break;
4866
4867     case M_BLEL:
4868       likely = 1;
4869     case M_BLE:
4870       if (treg == 0)
4871         {
4872           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4873           break;
4874         }
4875       if (sreg == 0)
4876         {
4877           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4878           break;
4879         }
4880       used_at = 1;
4881       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4882       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4883       break;
4884
4885     case M_BLEL_I:
4886       likely = 1;
4887     case M_BLE_I:
4888       maxnum = 0x7fffffff;
4889       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4890         {
4891           maxnum <<= 16;
4892           maxnum |= 0xffff;
4893           maxnum <<= 16;
4894           maxnum |= 0xffff;
4895         }
4896       if (imm_expr.X_op == O_constant
4897           && imm_expr.X_add_number >= maxnum
4898           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4899         goto do_true;
4900       if (imm_expr.X_op != O_constant)
4901         as_bad (_("Unsupported large constant"));
4902       ++imm_expr.X_add_number;
4903       /* FALLTHROUGH */
4904     case M_BLT_I:
4905     case M_BLTL_I:
4906       if (mask == M_BLTL_I)
4907         likely = 1;
4908       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4909         {
4910           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4911           break;
4912         }
4913       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4914         {
4915           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4916           break;
4917         }
4918       used_at = 1;
4919       set_at (sreg, 0);
4920       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4921       break;
4922
4923     case M_BLEUL:
4924       likely = 1;
4925     case M_BLEU:
4926       if (treg == 0)
4927         {
4928           macro_build (&offset_expr, likely ? "beql" : "beq",
4929                        "s,t,p", sreg, 0);
4930           break;
4931         }
4932       if (sreg == 0)
4933         goto do_true;
4934       used_at = 1;
4935       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4936       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4937       break;
4938
4939     case M_BLEUL_I:
4940       likely = 1;
4941     case M_BLEU_I:
4942       if (sreg == 0
4943           || (HAVE_32BIT_GPRS
4944               && imm_expr.X_op == O_constant
4945               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4946         goto do_true;
4947       if (imm_expr.X_op != O_constant)
4948         as_bad (_("Unsupported large constant"));
4949       ++imm_expr.X_add_number;
4950       /* FALLTHROUGH */
4951     case M_BLTU_I:
4952     case M_BLTUL_I:
4953       if (mask == M_BLTUL_I)
4954         likely = 1;
4955       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4956         goto do_false;
4957       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4958         {
4959           macro_build (&offset_expr, likely ? "beql" : "beq",
4960                        "s,t,p", sreg, 0);
4961           break;
4962         }
4963       used_at = 1;
4964       set_at (sreg, 1);
4965       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4966       break;
4967
4968     case M_BLTL:
4969       likely = 1;
4970     case M_BLT:
4971       if (treg == 0)
4972         {
4973           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4974           break;
4975         }
4976       if (sreg == 0)
4977         {
4978           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4979           break;
4980         }
4981       used_at = 1;
4982       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4983       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4984       break;
4985
4986     case M_BLTUL:
4987       likely = 1;
4988     case M_BLTU:
4989       if (treg == 0)
4990         goto do_false;
4991       if (sreg == 0)
4992         {
4993           macro_build (&offset_expr, likely ? "bnel" : "bne",
4994                        "s,t,p", 0, treg);
4995           break;
4996         }
4997       used_at = 1;
4998       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4999       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5000       break;
5001
5002     case M_DEXT:
5003       {
5004         unsigned long pos;
5005         unsigned long size;
5006
5007         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5008           {
5009             as_bad (_("Unsupported large constant"));
5010             pos = size = 1;
5011           }
5012         else
5013           {
5014             pos = (unsigned long) imm_expr.X_add_number;
5015             size = (unsigned long) imm2_expr.X_add_number;
5016           }
5017
5018         if (pos > 63)
5019           {
5020             as_bad (_("Improper position (%lu)"), pos);
5021             pos = 1;
5022           }
5023         if (size == 0 || size > 64
5024             || (pos + size - 1) > 63)
5025           {
5026             as_bad (_("Improper extract size (%lu, position %lu)"),
5027                     size, pos);
5028             size = 1;
5029           }
5030
5031         if (size <= 32 && pos < 32)
5032           {
5033             s = "dext";
5034             fmt = "t,r,+A,+C";
5035           }
5036         else if (size <= 32)
5037           {
5038             s = "dextu";
5039             fmt = "t,r,+E,+H";
5040           }
5041         else
5042           {
5043             s = "dextm";
5044             fmt = "t,r,+A,+G";
5045           }
5046         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5047       }
5048       break;
5049
5050     case M_DINS:
5051       {
5052         unsigned long pos;
5053         unsigned long size;
5054
5055         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5056           {
5057             as_bad (_("Unsupported large constant"));
5058             pos = size = 1;
5059           }
5060         else
5061           {
5062             pos = (unsigned long) imm_expr.X_add_number;
5063             size = (unsigned long) imm2_expr.X_add_number;
5064           }
5065
5066         if (pos > 63)
5067           {
5068             as_bad (_("Improper position (%lu)"), pos);
5069             pos = 1;
5070           }
5071         if (size == 0 || size > 64
5072             || (pos + size - 1) > 63)
5073           {
5074             as_bad (_("Improper insert size (%lu, position %lu)"),
5075                     size, pos);
5076             size = 1;
5077           }
5078
5079         if (pos < 32 && (pos + size - 1) < 32)
5080           {
5081             s = "dins";
5082             fmt = "t,r,+A,+B";
5083           }
5084         else if (pos >= 32)
5085           {
5086             s = "dinsu";
5087             fmt = "t,r,+E,+F";
5088           }
5089         else
5090           {
5091             s = "dinsm";
5092             fmt = "t,r,+A,+F";
5093           }
5094         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5095                      pos + size - 1);
5096       }
5097       break;
5098
5099     case M_DDIV_3:
5100       dbl = 1;
5101     case M_DIV_3:
5102       s = "mflo";
5103       goto do_div3;
5104     case M_DREM_3:
5105       dbl = 1;
5106     case M_REM_3:
5107       s = "mfhi";
5108     do_div3:
5109       if (treg == 0)
5110         {
5111           as_warn (_("Divide by zero."));
5112           if (mips_trap)
5113             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5114           else
5115             macro_build (NULL, "break", "c", 7);
5116           break;
5117         }
5118
5119       start_noreorder ();
5120       if (mips_trap)
5121         {
5122           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5123           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5124         }
5125       else
5126         {
5127           expr1.X_add_number = 8;
5128           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5129           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5130           macro_build (NULL, "break", "c", 7);
5131         }
5132       expr1.X_add_number = -1;
5133       used_at = 1;
5134       load_register (AT, &expr1, dbl);
5135       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5136       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5137       if (dbl)
5138         {
5139           expr1.X_add_number = 1;
5140           load_register (AT, &expr1, dbl);
5141           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5142         }
5143       else
5144         {
5145           expr1.X_add_number = 0x80000000;
5146           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5147         }
5148       if (mips_trap)
5149         {
5150           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5151           /* We want to close the noreorder block as soon as possible, so
5152              that later insns are available for delay slot filling.  */
5153           end_noreorder ();
5154         }
5155       else
5156         {
5157           expr1.X_add_number = 8;
5158           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5159           macro_build (NULL, "nop", "", 0);
5160
5161           /* We want to close the noreorder block as soon as possible, so
5162              that later insns are available for delay slot filling.  */
5163           end_noreorder ();
5164
5165           macro_build (NULL, "break", "c", 6);
5166         }
5167       macro_build (NULL, s, "d", dreg);
5168       break;
5169
5170     case M_DIV_3I:
5171       s = "div";
5172       s2 = "mflo";
5173       goto do_divi;
5174     case M_DIVU_3I:
5175       s = "divu";
5176       s2 = "mflo";
5177       goto do_divi;
5178     case M_REM_3I:
5179       s = "div";
5180       s2 = "mfhi";
5181       goto do_divi;
5182     case M_REMU_3I:
5183       s = "divu";
5184       s2 = "mfhi";
5185       goto do_divi;
5186     case M_DDIV_3I:
5187       dbl = 1;
5188       s = "ddiv";
5189       s2 = "mflo";
5190       goto do_divi;
5191     case M_DDIVU_3I:
5192       dbl = 1;
5193       s = "ddivu";
5194       s2 = "mflo";
5195       goto do_divi;
5196     case M_DREM_3I:
5197       dbl = 1;
5198       s = "ddiv";
5199       s2 = "mfhi";
5200       goto do_divi;
5201     case M_DREMU_3I:
5202       dbl = 1;
5203       s = "ddivu";
5204       s2 = "mfhi";
5205     do_divi:
5206       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5207         {
5208           as_warn (_("Divide by zero."));
5209           if (mips_trap)
5210             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5211           else
5212             macro_build (NULL, "break", "c", 7);
5213           break;
5214         }
5215       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5216         {
5217           if (strcmp (s2, "mflo") == 0)
5218             move_register (dreg, sreg);
5219           else
5220             move_register (dreg, 0);
5221           break;
5222         }
5223       if (imm_expr.X_op == O_constant
5224           && imm_expr.X_add_number == -1
5225           && s[strlen (s) - 1] != 'u')
5226         {
5227           if (strcmp (s2, "mflo") == 0)
5228             {
5229               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5230             }
5231           else
5232             move_register (dreg, 0);
5233           break;
5234         }
5235
5236       used_at = 1;
5237       load_register (AT, &imm_expr, dbl);
5238       macro_build (NULL, s, "z,s,t", sreg, AT);
5239       macro_build (NULL, s2, "d", dreg);
5240       break;
5241
5242     case M_DIVU_3:
5243       s = "divu";
5244       s2 = "mflo";
5245       goto do_divu3;
5246     case M_REMU_3:
5247       s = "divu";
5248       s2 = "mfhi";
5249       goto do_divu3;
5250     case M_DDIVU_3:
5251       s = "ddivu";
5252       s2 = "mflo";
5253       goto do_divu3;
5254     case M_DREMU_3:
5255       s = "ddivu";
5256       s2 = "mfhi";
5257     do_divu3:
5258       start_noreorder ();
5259       if (mips_trap)
5260         {
5261           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5262           macro_build (NULL, s, "z,s,t", sreg, treg);
5263           /* We want to close the noreorder block as soon as possible, so
5264              that later insns are available for delay slot filling.  */
5265           end_noreorder ();
5266         }
5267       else
5268         {
5269           expr1.X_add_number = 8;
5270           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5271           macro_build (NULL, s, "z,s,t", sreg, treg);
5272
5273           /* We want to close the noreorder block as soon as possible, so
5274              that later insns are available for delay slot filling.  */
5275           end_noreorder ();
5276           macro_build (NULL, "break", "c", 7);
5277         }
5278       macro_build (NULL, s2, "d", dreg);
5279       break;
5280
5281     case M_DLCA_AB:
5282       dbl = 1;
5283     case M_LCA_AB:
5284       call = 1;
5285       goto do_la;
5286     case M_DLA_AB:
5287       dbl = 1;
5288     case M_LA_AB:
5289     do_la:
5290       /* Load the address of a symbol into a register.  If breg is not
5291          zero, we then add a base register to it.  */
5292
5293       if (dbl && HAVE_32BIT_GPRS)
5294         as_warn (_("dla used to load 32-bit register"));
5295
5296       if (! dbl && HAVE_64BIT_OBJECTS)
5297         as_warn (_("la used to load 64-bit address"));
5298
5299       if (offset_expr.X_op == O_constant
5300           && offset_expr.X_add_number >= -0x8000
5301           && offset_expr.X_add_number < 0x8000)
5302         {
5303           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5304                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5305           break;
5306         }
5307
5308       if (mips_opts.at && (treg == breg))
5309         {
5310           tempreg = AT;
5311           used_at = 1;
5312         }
5313       else
5314         {
5315           tempreg = treg;
5316         }
5317
5318       if (offset_expr.X_op != O_symbol
5319           && offset_expr.X_op != O_constant)
5320         {
5321           as_bad (_("expression too complex"));
5322           offset_expr.X_op = O_constant;
5323         }
5324
5325       if (offset_expr.X_op == O_constant)
5326         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5327       else if (mips_pic == NO_PIC)
5328         {
5329           /* If this is a reference to a GP relative symbol, we want
5330                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5331              Otherwise we want
5332                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5333                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5334              If we have a constant, we need two instructions anyhow,
5335              so we may as well always use the latter form.
5336
5337              With 64bit address space and a usable $at we want
5338                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5339                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5340                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5341                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5342                dsll32   $tempreg,0
5343                daddu    $tempreg,$tempreg,$at
5344
5345              If $at is already in use, we use a path which is suboptimal
5346              on superscalar processors.
5347                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5348                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5349                dsll     $tempreg,16
5350                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5351                dsll     $tempreg,16
5352                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5353
5354              For GP relative symbols in 64bit address space we can use
5355              the same sequence as in 32bit address space.  */
5356           if (HAVE_64BIT_SYMBOLS)
5357             {
5358               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5359                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5360                 {
5361                   relax_start (offset_expr.X_add_symbol);
5362                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5363                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5364                   relax_switch ();
5365                 }
5366
5367               if (used_at == 0 && mips_opts.at)
5368                 {
5369                   macro_build (&offset_expr, "lui", "t,u",
5370                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5371                   macro_build (&offset_expr, "lui", "t,u",
5372                                AT, BFD_RELOC_HI16_S);
5373                   macro_build (&offset_expr, "daddiu", "t,r,j",
5374                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5375                   macro_build (&offset_expr, "daddiu", "t,r,j",
5376                                AT, AT, BFD_RELOC_LO16);
5377                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5378                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5379                   used_at = 1;
5380                 }
5381               else
5382                 {
5383                   macro_build (&offset_expr, "lui", "t,u",
5384                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5385                   macro_build (&offset_expr, "daddiu", "t,r,j",
5386                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5387                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5388                   macro_build (&offset_expr, "daddiu", "t,r,j",
5389                                tempreg, tempreg, BFD_RELOC_HI16_S);
5390                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5391                   macro_build (&offset_expr, "daddiu", "t,r,j",
5392                                tempreg, tempreg, BFD_RELOC_LO16);
5393                 }
5394
5395               if (mips_relax.sequence)
5396                 relax_end ();
5397             }
5398           else
5399             {
5400               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5401                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5402                 {
5403                   relax_start (offset_expr.X_add_symbol);
5404                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5405                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5406                   relax_switch ();
5407                 }
5408               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5409                 as_bad (_("offset too large"));
5410               macro_build_lui (&offset_expr, tempreg);
5411               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5412                            tempreg, tempreg, BFD_RELOC_LO16);
5413               if (mips_relax.sequence)
5414                 relax_end ();
5415             }
5416         }
5417       else if (!mips_big_got && !HAVE_NEWABI)
5418         {
5419           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5420
5421           /* If this is a reference to an external symbol, and there
5422              is no constant, we want
5423                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5424              or for lca or if tempreg is PIC_CALL_REG
5425                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5426              For a local symbol, we want
5427                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5428                nop
5429                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5430
5431              If we have a small constant, and this is a reference to
5432              an external symbol, we want
5433                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5434                nop
5435                addiu    $tempreg,$tempreg,<constant>
5436              For a local symbol, we want the same instruction
5437              sequence, but we output a BFD_RELOC_LO16 reloc on the
5438              addiu instruction.
5439
5440              If we have a large constant, and this is a reference to
5441              an external symbol, we want
5442                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5443                lui      $at,<hiconstant>
5444                addiu    $at,$at,<loconstant>
5445                addu     $tempreg,$tempreg,$at
5446              For a local symbol, we want the same instruction
5447              sequence, but we output a BFD_RELOC_LO16 reloc on the
5448              addiu instruction.
5449            */
5450
5451           if (offset_expr.X_add_number == 0)
5452             {
5453               if (mips_pic == SVR4_PIC
5454                   && breg == 0
5455                   && (call || tempreg == PIC_CALL_REG))
5456                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5457
5458               relax_start (offset_expr.X_add_symbol);
5459               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5460                            lw_reloc_type, mips_gp_register);
5461               if (breg != 0)
5462                 {
5463                   /* We're going to put in an addu instruction using
5464                      tempreg, so we may as well insert the nop right
5465                      now.  */
5466                   load_delay_nop ();
5467                 }
5468               relax_switch ();
5469               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5470                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5471               load_delay_nop ();
5472               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5473                            tempreg, tempreg, BFD_RELOC_LO16);
5474               relax_end ();
5475               /* FIXME: If breg == 0, and the next instruction uses
5476                  $tempreg, then if this variant case is used an extra
5477                  nop will be generated.  */
5478             }
5479           else if (offset_expr.X_add_number >= -0x8000
5480                    && offset_expr.X_add_number < 0x8000)
5481             {
5482               load_got_offset (tempreg, &offset_expr);
5483               load_delay_nop ();
5484               add_got_offset (tempreg, &offset_expr);
5485             }
5486           else
5487             {
5488               expr1.X_add_number = offset_expr.X_add_number;
5489               offset_expr.X_add_number =
5490                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5491               load_got_offset (tempreg, &offset_expr);
5492               offset_expr.X_add_number = expr1.X_add_number;
5493               /* If we are going to add in a base register, and the
5494                  target register and the base register are the same,
5495                  then we are using AT as a temporary register.  Since
5496                  we want to load the constant into AT, we add our
5497                  current AT (from the global offset table) and the
5498                  register into the register now, and pretend we were
5499                  not using a base register.  */
5500               if (breg == treg)
5501                 {
5502                   load_delay_nop ();
5503                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5504                                treg, AT, breg);
5505                   breg = 0;
5506                   tempreg = treg;
5507                 }
5508               add_got_offset_hilo (tempreg, &offset_expr, AT);
5509               used_at = 1;
5510             }
5511         }
5512       else if (!mips_big_got && HAVE_NEWABI)
5513         {
5514           int add_breg_early = 0;
5515
5516           /* If this is a reference to an external, and there is no
5517              constant, or local symbol (*), with or without a
5518              constant, we want
5519                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5520              or for lca or if tempreg is PIC_CALL_REG
5521                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5522
5523              If we have a small constant, and this is a reference to
5524              an external symbol, we want
5525                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5526                addiu    $tempreg,$tempreg,<constant>
5527
5528              If we have a large constant, and this is a reference to
5529              an external symbol, we want
5530                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5531                lui      $at,<hiconstant>
5532                addiu    $at,$at,<loconstant>
5533                addu     $tempreg,$tempreg,$at
5534
5535              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5536              local symbols, even though it introduces an additional
5537              instruction.  */
5538
5539           if (offset_expr.X_add_number)
5540             {
5541               expr1.X_add_number = offset_expr.X_add_number;
5542               offset_expr.X_add_number = 0;
5543
5544               relax_start (offset_expr.X_add_symbol);
5545               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5546                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5547
5548               if (expr1.X_add_number >= -0x8000
5549                   && expr1.X_add_number < 0x8000)
5550                 {
5551                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5552                                tempreg, tempreg, BFD_RELOC_LO16);
5553                 }
5554               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5555                 {
5556                   int dreg;
5557
5558                   /* If we are going to add in a base register, and the
5559                      target register and the base register are the same,
5560                      then we are using AT as a temporary register.  Since
5561                      we want to load the constant into AT, we add our
5562                      current AT (from the global offset table) and the
5563                      register into the register now, and pretend we were
5564                      not using a base register.  */
5565                   if (breg != treg)
5566                     dreg = tempreg;
5567                   else
5568                     {
5569                       assert (tempreg == AT);
5570                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5571                                    treg, AT, breg);
5572                       dreg = treg;
5573                       add_breg_early = 1;
5574                     }
5575
5576                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5577                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5578                                dreg, dreg, AT);
5579
5580                   used_at = 1;
5581                 }
5582               else
5583                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5584
5585               relax_switch ();
5586               offset_expr.X_add_number = expr1.X_add_number;
5587
5588               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5589                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5590               if (add_breg_early)
5591                 {
5592                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5593                                treg, tempreg, breg);
5594                   breg = 0;
5595                   tempreg = treg;
5596                 }
5597               relax_end ();
5598             }
5599           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5600             {
5601               relax_start (offset_expr.X_add_symbol);
5602               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5603                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5604               relax_switch ();
5605               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5606                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5607               relax_end ();
5608             }
5609           else
5610             {
5611               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5612                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5613             }
5614         }
5615       else if (mips_big_got && !HAVE_NEWABI)
5616         {
5617           int gpdelay;
5618           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5619           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5620           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5621
5622           /* This is the large GOT case.  If this is a reference to an
5623              external symbol, and there is no constant, we want
5624                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5625                addu     $tempreg,$tempreg,$gp
5626                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5627              or for lca or if tempreg is PIC_CALL_REG
5628                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5629                addu     $tempreg,$tempreg,$gp
5630                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5631              For a local symbol, we want
5632                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5633                nop
5634                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5635
5636              If we have a small constant, and this is a reference to
5637              an external symbol, we want
5638                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5639                addu     $tempreg,$tempreg,$gp
5640                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5641                nop
5642                addiu    $tempreg,$tempreg,<constant>
5643              For a local symbol, we want
5644                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5645                nop
5646                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5647
5648              If we have a large constant, and this is a reference to
5649              an external symbol, we want
5650                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5651                addu     $tempreg,$tempreg,$gp
5652                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5653                lui      $at,<hiconstant>
5654                addiu    $at,$at,<loconstant>
5655                addu     $tempreg,$tempreg,$at
5656              For a local symbol, we want
5657                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5658                lui      $at,<hiconstant>
5659                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5660                addu     $tempreg,$tempreg,$at
5661           */
5662
5663           expr1.X_add_number = offset_expr.X_add_number;
5664           offset_expr.X_add_number = 0;
5665           relax_start (offset_expr.X_add_symbol);
5666           gpdelay = reg_needs_delay (mips_gp_register);
5667           if (expr1.X_add_number == 0 && breg == 0
5668               && (call || tempreg == PIC_CALL_REG))
5669             {
5670               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5671               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5672             }
5673           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5674           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5675                        tempreg, tempreg, mips_gp_register);
5676           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5677                        tempreg, lw_reloc_type, tempreg);
5678           if (expr1.X_add_number == 0)
5679             {
5680               if (breg != 0)
5681                 {
5682                   /* We're going to put in an addu instruction using
5683                      tempreg, so we may as well insert the nop right
5684                      now.  */
5685                   load_delay_nop ();
5686                 }
5687             }
5688           else if (expr1.X_add_number >= -0x8000
5689                    && expr1.X_add_number < 0x8000)
5690             {
5691               load_delay_nop ();
5692               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5693                            tempreg, tempreg, BFD_RELOC_LO16);
5694             }
5695           else
5696             {
5697               int dreg;
5698
5699               /* If we are going to add in a base register, and the
5700                  target register and the base register are the same,
5701                  then we are using AT as a temporary register.  Since
5702                  we want to load the constant into AT, we add our
5703                  current AT (from the global offset table) and the
5704                  register into the register now, and pretend we were
5705                  not using a base register.  */
5706               if (breg != treg)
5707                 dreg = tempreg;
5708               else
5709                 {
5710                   assert (tempreg == AT);
5711                   load_delay_nop ();
5712                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5713                                treg, AT, breg);
5714                   dreg = treg;
5715                 }
5716
5717               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5718               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5719
5720               used_at = 1;
5721             }
5722           offset_expr.X_add_number =
5723             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5724           relax_switch ();
5725
5726           if (gpdelay)
5727             {
5728               /* This is needed because this instruction uses $gp, but
5729                  the first instruction on the main stream does not.  */
5730               macro_build (NULL, "nop", "");
5731             }
5732
5733           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5734                        local_reloc_type, mips_gp_register);
5735           if (expr1.X_add_number >= -0x8000
5736               && expr1.X_add_number < 0x8000)
5737             {
5738               load_delay_nop ();
5739               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5740                            tempreg, tempreg, BFD_RELOC_LO16);
5741               /* FIXME: If add_number is 0, and there was no base
5742                  register, the external symbol case ended with a load,
5743                  so if the symbol turns out to not be external, and
5744                  the next instruction uses tempreg, an unnecessary nop
5745                  will be inserted.  */
5746             }
5747           else
5748             {
5749               if (breg == treg)
5750                 {
5751                   /* We must add in the base register now, as in the
5752                      external symbol case.  */
5753                   assert (tempreg == AT);
5754                   load_delay_nop ();
5755                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5756                                treg, AT, breg);
5757                   tempreg = treg;
5758                   /* We set breg to 0 because we have arranged to add
5759                      it in in both cases.  */
5760                   breg = 0;
5761                 }
5762
5763               macro_build_lui (&expr1, AT);
5764               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5765                            AT, AT, BFD_RELOC_LO16);
5766               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5767                            tempreg, tempreg, AT);
5768               used_at = 1;
5769             }
5770           relax_end ();
5771         }
5772       else if (mips_big_got && HAVE_NEWABI)
5773         {
5774           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5775           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5776           int add_breg_early = 0;
5777
5778           /* This is the large GOT case.  If this is a reference to an
5779              external symbol, and there is no constant, we want
5780                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5781                add      $tempreg,$tempreg,$gp
5782                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5783              or for lca or if tempreg is PIC_CALL_REG
5784                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5785                add      $tempreg,$tempreg,$gp
5786                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5787
5788              If we have a small constant, and this is a reference to
5789              an external symbol, we want
5790                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5791                add      $tempreg,$tempreg,$gp
5792                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5793                addi     $tempreg,$tempreg,<constant>
5794
5795              If we have a large constant, and this is a reference to
5796              an external symbol, we want
5797                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5798                addu     $tempreg,$tempreg,$gp
5799                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5800                lui      $at,<hiconstant>
5801                addi     $at,$at,<loconstant>
5802                add      $tempreg,$tempreg,$at
5803
5804              If we have NewABI, and we know it's a local symbol, we want
5805                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5806                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5807              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5808
5809           relax_start (offset_expr.X_add_symbol);
5810
5811           expr1.X_add_number = offset_expr.X_add_number;
5812           offset_expr.X_add_number = 0;
5813
5814           if (expr1.X_add_number == 0 && breg == 0
5815               && (call || tempreg == PIC_CALL_REG))
5816             {
5817               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5818               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5819             }
5820           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5821           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5822                        tempreg, tempreg, mips_gp_register);
5823           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5824                        tempreg, lw_reloc_type, tempreg);
5825
5826           if (expr1.X_add_number == 0)
5827             ;
5828           else if (expr1.X_add_number >= -0x8000
5829                    && expr1.X_add_number < 0x8000)
5830             {
5831               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5832                            tempreg, tempreg, BFD_RELOC_LO16);
5833             }
5834           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5835             {
5836               int dreg;
5837
5838               /* If we are going to add in a base register, and the
5839                  target register and the base register are the same,
5840                  then we are using AT as a temporary register.  Since
5841                  we want to load the constant into AT, we add our
5842                  current AT (from the global offset table) and the
5843                  register into the register now, and pretend we were
5844                  not using a base register.  */
5845               if (breg != treg)
5846                 dreg = tempreg;
5847               else
5848                 {
5849                   assert (tempreg == AT);
5850                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5851                                treg, AT, breg);
5852                   dreg = treg;
5853                   add_breg_early = 1;
5854                 }
5855
5856               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5857               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5858
5859               used_at = 1;
5860             }
5861           else
5862             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5863
5864           relax_switch ();
5865           offset_expr.X_add_number = expr1.X_add_number;
5866           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5867                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5868           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5869                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5870           if (add_breg_early)
5871             {
5872               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5873                            treg, tempreg, breg);
5874               breg = 0;
5875               tempreg = treg;
5876             }
5877           relax_end ();
5878         }
5879       else
5880         abort ();
5881
5882       if (breg != 0)
5883         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5884       break;
5885
5886     case M_J_A:
5887       /* The j instruction may not be used in PIC code, since it
5888          requires an absolute address.  We convert it to a b
5889          instruction.  */
5890       if (mips_pic == NO_PIC)
5891         macro_build (&offset_expr, "j", "a");
5892       else
5893         macro_build (&offset_expr, "b", "p");
5894       break;
5895
5896       /* The jal instructions must be handled as macros because when
5897          generating PIC code they expand to multi-instruction
5898          sequences.  Normally they are simple instructions.  */
5899     case M_JAL_1:
5900       dreg = RA;
5901       /* Fall through.  */
5902     case M_JAL_2:
5903       if (mips_pic == NO_PIC)
5904         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5905       else
5906         {
5907           if (sreg != PIC_CALL_REG)
5908             as_warn (_("MIPS PIC call to register other than $25"));
5909
5910           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5911           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5912             {
5913               if (mips_cprestore_offset < 0)
5914                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5915               else
5916                 {
5917                   if (! mips_frame_reg_valid)
5918                     {
5919                       as_warn (_("No .frame pseudo-op used in PIC code"));
5920                       /* Quiet this warning.  */
5921                       mips_frame_reg_valid = 1;
5922                     }
5923                   if (! mips_cprestore_valid)
5924                     {
5925                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5926                       /* Quiet this warning.  */
5927                       mips_cprestore_valid = 1;
5928                     }
5929                   expr1.X_add_number = mips_cprestore_offset;
5930                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5931                                                 mips_gp_register,
5932                                                 mips_frame_reg,
5933                                                 HAVE_64BIT_ADDRESSES);
5934                 }
5935             }
5936         }
5937
5938       break;
5939
5940     case M_JAL_A:
5941       if (mips_pic == NO_PIC)
5942         macro_build (&offset_expr, "jal", "a");
5943       else if (mips_pic == SVR4_PIC)
5944         {
5945           /* If this is a reference to an external symbol, and we are
5946              using a small GOT, we want
5947                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5948                nop
5949                jalr     $ra,$25
5950                nop
5951                lw       $gp,cprestore($sp)
5952              The cprestore value is set using the .cprestore
5953              pseudo-op.  If we are using a big GOT, we want
5954                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5955                addu     $25,$25,$gp
5956                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5957                nop
5958                jalr     $ra,$25
5959                nop
5960                lw       $gp,cprestore($sp)
5961              If the symbol is not external, we want
5962                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5963                nop
5964                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5965                jalr     $ra,$25
5966                nop
5967                lw $gp,cprestore($sp)
5968
5969              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5970              sequences above, minus nops, unless the symbol is local,
5971              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5972              GOT_DISP.  */
5973           if (HAVE_NEWABI)
5974             {
5975               if (! mips_big_got)
5976                 {
5977                   relax_start (offset_expr.X_add_symbol);
5978                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5979                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5980                                mips_gp_register);
5981                   relax_switch ();
5982                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5983                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5984                                mips_gp_register);
5985                   relax_end ();
5986                 }
5987               else
5988                 {
5989                   relax_start (offset_expr.X_add_symbol);
5990                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5991                                BFD_RELOC_MIPS_CALL_HI16);
5992                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5993                                PIC_CALL_REG, mips_gp_register);
5994                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5995                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5996                                PIC_CALL_REG);
5997                   relax_switch ();
5998                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5999                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6000                                mips_gp_register);
6001                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6002                                PIC_CALL_REG, PIC_CALL_REG,
6003                                BFD_RELOC_MIPS_GOT_OFST);
6004                   relax_end ();
6005                 }
6006
6007               macro_build_jalr (&offset_expr);
6008             }
6009           else
6010             {
6011               relax_start (offset_expr.X_add_symbol);
6012               if (! mips_big_got)
6013                 {
6014                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6015                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6016                                mips_gp_register);
6017                   load_delay_nop ();
6018                   relax_switch ();
6019                 }
6020               else
6021                 {
6022                   int gpdelay;
6023
6024                   gpdelay = reg_needs_delay (mips_gp_register);
6025                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6026                                BFD_RELOC_MIPS_CALL_HI16);
6027                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6028                                PIC_CALL_REG, mips_gp_register);
6029                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6030                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6031                                PIC_CALL_REG);
6032                   load_delay_nop ();
6033                   relax_switch ();
6034                   if (gpdelay)
6035                     macro_build (NULL, "nop", "");
6036                 }
6037               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6038                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6039                            mips_gp_register);
6040               load_delay_nop ();
6041               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6042                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6043               relax_end ();
6044               macro_build_jalr (&offset_expr);
6045
6046               if (mips_cprestore_offset < 0)
6047                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6048               else
6049                 {
6050                   if (! mips_frame_reg_valid)
6051                     {
6052                       as_warn (_("No .frame pseudo-op used in PIC code"));
6053                       /* Quiet this warning.  */
6054                       mips_frame_reg_valid = 1;
6055                     }
6056                   if (! mips_cprestore_valid)
6057                     {
6058                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6059                       /* Quiet this warning.  */
6060                       mips_cprestore_valid = 1;
6061                     }
6062                   if (mips_opts.noreorder)
6063                     macro_build (NULL, "nop", "");
6064                   expr1.X_add_number = mips_cprestore_offset;
6065                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6066                                                 mips_gp_register,
6067                                                 mips_frame_reg,
6068                                                 HAVE_64BIT_ADDRESSES);
6069                 }
6070             }
6071         }
6072       else if (mips_pic == VXWORKS_PIC)
6073         as_bad (_("Non-PIC jump used in PIC library"));
6074       else
6075         abort ();
6076
6077       break;
6078
6079     case M_LB_AB:
6080       s = "lb";
6081       goto ld;
6082     case M_LBU_AB:
6083       s = "lbu";
6084       goto ld;
6085     case M_LH_AB:
6086       s = "lh";
6087       goto ld;
6088     case M_LHU_AB:
6089       s = "lhu";
6090       goto ld;
6091     case M_LW_AB:
6092       s = "lw";
6093       goto ld;
6094     case M_LWC0_AB:
6095       s = "lwc0";
6096       /* Itbl support may require additional care here.  */
6097       coproc = 1;
6098       goto ld;
6099     case M_LWC1_AB:
6100       s = "lwc1";
6101       /* Itbl support may require additional care here.  */
6102       coproc = 1;
6103       goto ld;
6104     case M_LWC2_AB:
6105       s = "lwc2";
6106       /* Itbl support may require additional care here.  */
6107       coproc = 1;
6108       goto ld;
6109     case M_LWC3_AB:
6110       s = "lwc3";
6111       /* Itbl support may require additional care here.  */
6112       coproc = 1;
6113       goto ld;
6114     case M_LWL_AB:
6115       s = "lwl";
6116       lr = 1;
6117       goto ld;
6118     case M_LWR_AB:
6119       s = "lwr";
6120       lr = 1;
6121       goto ld;
6122     case M_LDC1_AB:
6123       if (mips_opts.arch == CPU_R4650)
6124         {
6125           as_bad (_("opcode not supported on this processor"));
6126           break;
6127         }
6128       s = "ldc1";
6129       /* Itbl support may require additional care here.  */
6130       coproc = 1;
6131       goto ld;
6132     case M_LDC2_AB:
6133       s = "ldc2";
6134       /* Itbl support may require additional care here.  */
6135       coproc = 1;
6136       goto ld;
6137     case M_LDC3_AB:
6138       s = "ldc3";
6139       /* Itbl support may require additional care here.  */
6140       coproc = 1;
6141       goto ld;
6142     case M_LDL_AB:
6143       s = "ldl";
6144       lr = 1;
6145       goto ld;
6146     case M_LDR_AB:
6147       s = "ldr";
6148       lr = 1;
6149       goto ld;
6150     case M_LL_AB:
6151       s = "ll";
6152       goto ld;
6153     case M_LLD_AB:
6154       s = "lld";
6155       goto ld;
6156     case M_LWU_AB:
6157       s = "lwu";
6158     ld:
6159       if (breg == treg || coproc || lr)
6160         {
6161           tempreg = AT;
6162           used_at = 1;
6163         }
6164       else
6165         {
6166           tempreg = treg;
6167         }
6168       goto ld_st;
6169     case M_SB_AB:
6170       s = "sb";
6171       goto st;
6172     case M_SH_AB:
6173       s = "sh";
6174       goto st;
6175     case M_SW_AB:
6176       s = "sw";
6177       goto st;
6178     case M_SWC0_AB:
6179       s = "swc0";
6180       /* Itbl support may require additional care here.  */
6181       coproc = 1;
6182       goto st;
6183     case M_SWC1_AB:
6184       s = "swc1";
6185       /* Itbl support may require additional care here.  */
6186       coproc = 1;
6187       goto st;
6188     case M_SWC2_AB:
6189       s = "swc2";
6190       /* Itbl support may require additional care here.  */
6191       coproc = 1;
6192       goto st;
6193     case M_SWC3_AB:
6194       s = "swc3";
6195       /* Itbl support may require additional care here.  */
6196       coproc = 1;
6197       goto st;
6198     case M_SWL_AB:
6199       s = "swl";
6200       goto st;
6201     case M_SWR_AB:
6202       s = "swr";
6203       goto st;
6204     case M_SC_AB:
6205       s = "sc";
6206       goto st;
6207     case M_SCD_AB:
6208       s = "scd";
6209       goto st;
6210     case M_CACHE_AB:
6211       s = "cache";
6212       goto st;
6213     case M_SDC1_AB:
6214       if (mips_opts.arch == CPU_R4650)
6215         {
6216           as_bad (_("opcode not supported on this processor"));
6217           break;
6218         }
6219       s = "sdc1";
6220       coproc = 1;
6221       /* Itbl support may require additional care here.  */
6222       goto st;
6223     case M_SDC2_AB:
6224       s = "sdc2";
6225       /* Itbl support may require additional care here.  */
6226       coproc = 1;
6227       goto st;
6228     case M_SDC3_AB:
6229       s = "sdc3";
6230       /* Itbl support may require additional care here.  */
6231       coproc = 1;
6232       goto st;
6233     case M_SDL_AB:
6234       s = "sdl";
6235       goto st;
6236     case M_SDR_AB:
6237       s = "sdr";
6238     st:
6239       tempreg = AT;
6240       used_at = 1;
6241     ld_st:
6242       /* Itbl support may require additional care here.  */
6243       if (mask == M_LWC1_AB
6244           || mask == M_SWC1_AB
6245           || mask == M_LDC1_AB
6246           || mask == M_SDC1_AB
6247           || mask == M_L_DAB
6248           || mask == M_S_DAB)
6249         fmt = "T,o(b)";
6250       else if (mask == M_CACHE_AB)
6251         fmt = "k,o(b)";
6252       else if (coproc)
6253         fmt = "E,o(b)";
6254       else
6255         fmt = "t,o(b)";
6256
6257       if (offset_expr.X_op != O_constant
6258           && offset_expr.X_op != O_symbol)
6259         {
6260           as_bad (_("expression too complex"));
6261           offset_expr.X_op = O_constant;
6262         }
6263
6264       if (HAVE_32BIT_ADDRESSES
6265           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6266         {
6267           char value [32];
6268
6269           sprintf_vma (value, offset_expr.X_add_number);
6270           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6271         }
6272
6273       /* A constant expression in PIC code can be handled just as it
6274          is in non PIC code.  */
6275       if (offset_expr.X_op == O_constant)
6276         {
6277           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6278                                 & ~(bfd_vma) 0xffff);
6279           normalize_address_expr (&expr1);
6280           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6281           if (breg != 0)
6282             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6283                          tempreg, tempreg, breg);
6284           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6285         }
6286       else if (mips_pic == NO_PIC)
6287         {
6288           /* If this is a reference to a GP relative symbol, and there
6289              is no base register, we want
6290                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6291              Otherwise, if there is no base register, we want
6292                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6293                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6294              If we have a constant, we need two instructions anyhow,
6295              so we always use the latter form.
6296
6297              If we have a base register, and this is a reference to a
6298              GP relative symbol, we want
6299                addu     $tempreg,$breg,$gp
6300                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6301              Otherwise we want
6302                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6303                addu     $tempreg,$tempreg,$breg
6304                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6305              With a constant we always use the latter case.
6306
6307              With 64bit address space and no base register and $at usable,
6308              we want
6309                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6310                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6311                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6312                dsll32   $tempreg,0
6313                daddu    $tempreg,$at
6314                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6315              If we have a base register, we want
6316                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6317                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6318                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6319                daddu    $at,$breg
6320                dsll32   $tempreg,0
6321                daddu    $tempreg,$at
6322                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6323
6324              Without $at we can't generate the optimal path for superscalar
6325              processors here since this would require two temporary registers.
6326                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6327                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6328                dsll     $tempreg,16
6329                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6330                dsll     $tempreg,16
6331                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6332              If we have a base register, we want
6333                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6334                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6335                dsll     $tempreg,16
6336                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6337                dsll     $tempreg,16
6338                daddu    $tempreg,$tempreg,$breg
6339                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6340
6341              For GP relative symbols in 64bit address space we can use
6342              the same sequence as in 32bit address space.  */
6343           if (HAVE_64BIT_SYMBOLS)
6344             {
6345               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6346                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6347                 {
6348                   relax_start (offset_expr.X_add_symbol);
6349                   if (breg == 0)
6350                     {
6351                       macro_build (&offset_expr, s, fmt, treg,
6352                                    BFD_RELOC_GPREL16, mips_gp_register);
6353                     }
6354                   else
6355                     {
6356                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6357                                    tempreg, breg, mips_gp_register);
6358                       macro_build (&offset_expr, s, fmt, treg,
6359                                    BFD_RELOC_GPREL16, tempreg);
6360                     }
6361                   relax_switch ();
6362                 }
6363
6364               if (used_at == 0 && mips_opts.at)
6365                 {
6366                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6367                                BFD_RELOC_MIPS_HIGHEST);
6368                   macro_build (&offset_expr, "lui", "t,u", AT,
6369                                BFD_RELOC_HI16_S);
6370                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6371                                tempreg, BFD_RELOC_MIPS_HIGHER);
6372                   if (breg != 0)
6373                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6374                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6375                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6376                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6377                                tempreg);
6378                   used_at = 1;
6379                 }
6380               else
6381                 {
6382                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6383                                BFD_RELOC_MIPS_HIGHEST);
6384                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6385                                tempreg, BFD_RELOC_MIPS_HIGHER);
6386                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6387                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6388                                tempreg, BFD_RELOC_HI16_S);
6389                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6390                   if (breg != 0)
6391                     macro_build (NULL, "daddu", "d,v,t",
6392                                  tempreg, tempreg, breg);
6393                   macro_build (&offset_expr, s, fmt, treg,
6394                                BFD_RELOC_LO16, tempreg);
6395                 }
6396
6397               if (mips_relax.sequence)
6398                 relax_end ();
6399               break;
6400             }
6401
6402           if (breg == 0)
6403             {
6404               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6405                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6406                 {
6407                   relax_start (offset_expr.X_add_symbol);
6408                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6409                                mips_gp_register);
6410                   relax_switch ();
6411                 }
6412               macro_build_lui (&offset_expr, tempreg);
6413               macro_build (&offset_expr, s, fmt, treg,
6414                            BFD_RELOC_LO16, tempreg);
6415               if (mips_relax.sequence)
6416                 relax_end ();
6417             }
6418           else
6419             {
6420               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6421                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6422                 {
6423                   relax_start (offset_expr.X_add_symbol);
6424                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6425                                tempreg, breg, mips_gp_register);
6426                   macro_build (&offset_expr, s, fmt, treg,
6427                                BFD_RELOC_GPREL16, tempreg);
6428                   relax_switch ();
6429                 }
6430               macro_build_lui (&offset_expr, tempreg);
6431               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6432                            tempreg, tempreg, breg);
6433               macro_build (&offset_expr, s, fmt, treg,
6434                            BFD_RELOC_LO16, tempreg);
6435               if (mips_relax.sequence)
6436                 relax_end ();
6437             }
6438         }
6439       else if (!mips_big_got)
6440         {
6441           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6442
6443           /* If this is a reference to an external symbol, we want
6444                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6445                nop
6446                <op>     $treg,0($tempreg)
6447              Otherwise we want
6448                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6449                nop
6450                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6451                <op>     $treg,0($tempreg)
6452
6453              For NewABI, we want
6454                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6455                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6456
6457              If there is a base register, we add it to $tempreg before
6458              the <op>.  If there is a constant, we stick it in the
6459              <op> instruction.  We don't handle constants larger than
6460              16 bits, because we have no way to load the upper 16 bits
6461              (actually, we could handle them for the subset of cases
6462              in which we are not using $at).  */
6463           assert (offset_expr.X_op == O_symbol);
6464           if (HAVE_NEWABI)
6465             {
6466               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6467                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6468               if (breg != 0)
6469                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6470                              tempreg, tempreg, breg);
6471               macro_build (&offset_expr, s, fmt, treg,
6472                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6473               break;
6474             }
6475           expr1.X_add_number = offset_expr.X_add_number;
6476           offset_expr.X_add_number = 0;
6477           if (expr1.X_add_number < -0x8000
6478               || expr1.X_add_number >= 0x8000)
6479             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6480           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6481                        lw_reloc_type, mips_gp_register);
6482           load_delay_nop ();
6483           relax_start (offset_expr.X_add_symbol);
6484           relax_switch ();
6485           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6486                        tempreg, BFD_RELOC_LO16);
6487           relax_end ();
6488           if (breg != 0)
6489             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6490                          tempreg, tempreg, breg);
6491           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6492         }
6493       else if (mips_big_got && !HAVE_NEWABI)
6494         {
6495           int gpdelay;
6496
6497           /* If this is a reference to an external symbol, we want
6498                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6499                addu     $tempreg,$tempreg,$gp
6500                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6501                <op>     $treg,0($tempreg)
6502              Otherwise we want
6503                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6504                nop
6505                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6506                <op>     $treg,0($tempreg)
6507              If there is a base register, we add it to $tempreg before
6508              the <op>.  If there is a constant, we stick it in the
6509              <op> instruction.  We don't handle constants larger than
6510              16 bits, because we have no way to load the upper 16 bits
6511              (actually, we could handle them for the subset of cases
6512              in which we are not using $at).  */
6513           assert (offset_expr.X_op == O_symbol);
6514           expr1.X_add_number = offset_expr.X_add_number;
6515           offset_expr.X_add_number = 0;
6516           if (expr1.X_add_number < -0x8000
6517               || expr1.X_add_number >= 0x8000)
6518             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6519           gpdelay = reg_needs_delay (mips_gp_register);
6520           relax_start (offset_expr.X_add_symbol);
6521           macro_build (&offset_expr, "lui", "t,u", tempreg,
6522                        BFD_RELOC_MIPS_GOT_HI16);
6523           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6524                        mips_gp_register);
6525           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6526                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6527           relax_switch ();
6528           if (gpdelay)
6529             macro_build (NULL, "nop", "");
6530           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6531                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6532           load_delay_nop ();
6533           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6534                        tempreg, BFD_RELOC_LO16);
6535           relax_end ();
6536
6537           if (breg != 0)
6538             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6539                          tempreg, tempreg, breg);
6540           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6541         }
6542       else if (mips_big_got && HAVE_NEWABI)
6543         {
6544           /* If this is a reference to an external symbol, we want
6545                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6546                add      $tempreg,$tempreg,$gp
6547                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6548                <op>     $treg,<ofst>($tempreg)
6549              Otherwise, for local symbols, we want:
6550                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6551                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6552           assert (offset_expr.X_op == O_symbol);
6553           expr1.X_add_number = offset_expr.X_add_number;
6554           offset_expr.X_add_number = 0;
6555           if (expr1.X_add_number < -0x8000
6556               || expr1.X_add_number >= 0x8000)
6557             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6558           relax_start (offset_expr.X_add_symbol);
6559           macro_build (&offset_expr, "lui", "t,u", tempreg,
6560                        BFD_RELOC_MIPS_GOT_HI16);
6561           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6562                        mips_gp_register);
6563           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6564                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6565           if (breg != 0)
6566             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6567                          tempreg, tempreg, breg);
6568           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6569
6570           relax_switch ();
6571           offset_expr.X_add_number = expr1.X_add_number;
6572           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6573                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6574           if (breg != 0)
6575             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6576                          tempreg, tempreg, breg);
6577           macro_build (&offset_expr, s, fmt, treg,
6578                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6579           relax_end ();
6580         }
6581       else
6582         abort ();
6583
6584       break;
6585
6586     case M_LI:
6587     case M_LI_S:
6588       load_register (treg, &imm_expr, 0);
6589       break;
6590
6591     case M_DLI:
6592       load_register (treg, &imm_expr, 1);
6593       break;
6594
6595     case M_LI_SS:
6596       if (imm_expr.X_op == O_constant)
6597         {
6598           used_at = 1;
6599           load_register (AT, &imm_expr, 0);
6600           macro_build (NULL, "mtc1", "t,G", AT, treg);
6601           break;
6602         }
6603       else
6604         {
6605           assert (offset_expr.X_op == O_symbol
6606                   && strcmp (segment_name (S_GET_SEGMENT
6607                                            (offset_expr.X_add_symbol)),
6608                              ".lit4") == 0
6609                   && offset_expr.X_add_number == 0);
6610           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6611                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6612           break;
6613         }
6614
6615     case M_LI_D:
6616       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6617          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6618          order 32 bits of the value and the low order 32 bits are either
6619          zero or in OFFSET_EXPR.  */
6620       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6621         {
6622           if (HAVE_64BIT_GPRS)
6623             load_register (treg, &imm_expr, 1);
6624           else
6625             {
6626               int hreg, lreg;
6627
6628               if (target_big_endian)
6629                 {
6630                   hreg = treg;
6631                   lreg = treg + 1;
6632                 }
6633               else
6634                 {
6635                   hreg = treg + 1;
6636                   lreg = treg;
6637                 }
6638
6639               if (hreg <= 31)
6640                 load_register (hreg, &imm_expr, 0);
6641               if (lreg <= 31)
6642                 {
6643                   if (offset_expr.X_op == O_absent)
6644                     move_register (lreg, 0);
6645                   else
6646                     {
6647                       assert (offset_expr.X_op == O_constant);
6648                       load_register (lreg, &offset_expr, 0);
6649                     }
6650                 }
6651             }
6652           break;
6653         }
6654
6655       /* We know that sym is in the .rdata section.  First we get the
6656          upper 16 bits of the address.  */
6657       if (mips_pic == NO_PIC)
6658         {
6659           macro_build_lui (&offset_expr, AT);
6660           used_at = 1;
6661         }
6662       else
6663         {
6664           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6665                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6666           used_at = 1;
6667         }
6668
6669       /* Now we load the register(s).  */
6670       if (HAVE_64BIT_GPRS)
6671         {
6672           used_at = 1;
6673           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6674         }
6675       else
6676         {
6677           used_at = 1;
6678           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6679           if (treg != RA)
6680             {
6681               /* FIXME: How in the world do we deal with the possible
6682                  overflow here?  */
6683               offset_expr.X_add_number += 4;
6684               macro_build (&offset_expr, "lw", "t,o(b)",
6685                            treg + 1, BFD_RELOC_LO16, AT);
6686             }
6687         }
6688       break;
6689
6690     case M_LI_DD:
6691       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6692          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6693          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6694          the value and the low order 32 bits are either zero or in
6695          OFFSET_EXPR.  */
6696       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6697         {
6698           used_at = 1;
6699           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6700           if (HAVE_64BIT_FPRS)
6701             {
6702               assert (HAVE_64BIT_GPRS);
6703               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6704             }
6705           else
6706             {
6707               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6708               if (offset_expr.X_op == O_absent)
6709                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6710               else
6711                 {
6712                   assert (offset_expr.X_op == O_constant);
6713                   load_register (AT, &offset_expr, 0);
6714                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6715                 }
6716             }
6717           break;
6718         }
6719
6720       assert (offset_expr.X_op == O_symbol
6721               && offset_expr.X_add_number == 0);
6722       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6723       if (strcmp (s, ".lit8") == 0)
6724         {
6725           if (mips_opts.isa != ISA_MIPS1)
6726             {
6727               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6728                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6729               break;
6730             }
6731           breg = mips_gp_register;
6732           r = BFD_RELOC_MIPS_LITERAL;
6733           goto dob;
6734         }
6735       else
6736         {
6737           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6738           used_at = 1;
6739           if (mips_pic != NO_PIC)
6740             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6741                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6742           else
6743             {
6744               /* FIXME: This won't work for a 64 bit address.  */
6745               macro_build_lui (&offset_expr, AT);
6746             }
6747
6748           if (mips_opts.isa != ISA_MIPS1)
6749             {
6750               macro_build (&offset_expr, "ldc1", "T,o(b)",
6751                            treg, BFD_RELOC_LO16, AT);
6752               break;
6753             }
6754           breg = AT;
6755           r = BFD_RELOC_LO16;
6756           goto dob;
6757         }
6758
6759     case M_L_DOB:
6760       if (mips_opts.arch == CPU_R4650)
6761         {
6762           as_bad (_("opcode not supported on this processor"));
6763           break;
6764         }
6765       /* Even on a big endian machine $fn comes before $fn+1.  We have
6766          to adjust when loading from memory.  */
6767       r = BFD_RELOC_LO16;
6768     dob:
6769       assert (mips_opts.isa == ISA_MIPS1);
6770       macro_build (&offset_expr, "lwc1", "T,o(b)",
6771                    target_big_endian ? treg + 1 : treg, r, breg);
6772       /* FIXME: A possible overflow which I don't know how to deal
6773          with.  */
6774       offset_expr.X_add_number += 4;
6775       macro_build (&offset_expr, "lwc1", "T,o(b)",
6776                    target_big_endian ? treg : treg + 1, r, breg);
6777       break;
6778
6779     case M_L_DAB:
6780       /*
6781        * The MIPS assembler seems to check for X_add_number not
6782        * being double aligned and generating:
6783        *        lui     at,%hi(foo+1)
6784        *        addu    at,at,v1
6785        *        addiu   at,at,%lo(foo+1)
6786        *        lwc1    f2,0(at)
6787        *        lwc1    f3,4(at)
6788        * But, the resulting address is the same after relocation so why
6789        * generate the extra instruction?
6790        */
6791       if (mips_opts.arch == CPU_R4650)
6792         {
6793           as_bad (_("opcode not supported on this processor"));
6794           break;
6795         }
6796       /* Itbl support may require additional care here.  */
6797       coproc = 1;
6798       if (mips_opts.isa != ISA_MIPS1)
6799         {
6800           s = "ldc1";
6801           goto ld;
6802         }
6803
6804       s = "lwc1";
6805       fmt = "T,o(b)";
6806       goto ldd_std;
6807
6808     case M_S_DAB:
6809       if (mips_opts.arch == CPU_R4650)
6810         {
6811           as_bad (_("opcode not supported on this processor"));
6812           break;
6813         }
6814
6815       if (mips_opts.isa != ISA_MIPS1)
6816         {
6817           s = "sdc1";
6818           goto st;
6819         }
6820
6821       s = "swc1";
6822       fmt = "T,o(b)";
6823       /* Itbl support may require additional care here.  */
6824       coproc = 1;
6825       goto ldd_std;
6826
6827     case M_LD_AB:
6828       if (HAVE_64BIT_GPRS)
6829         {
6830           s = "ld";
6831           goto ld;
6832         }
6833
6834       s = "lw";
6835       fmt = "t,o(b)";
6836       goto ldd_std;
6837
6838     case M_SD_AB:
6839       if (HAVE_64BIT_GPRS)
6840         {
6841           s = "sd";
6842           goto st;
6843         }
6844
6845       s = "sw";
6846       fmt = "t,o(b)";
6847
6848     ldd_std:
6849       if (offset_expr.X_op != O_symbol
6850           && offset_expr.X_op != O_constant)
6851         {
6852           as_bad (_("expression too complex"));
6853           offset_expr.X_op = O_constant;
6854         }
6855
6856       if (HAVE_32BIT_ADDRESSES
6857           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6858         {
6859           char value [32];
6860
6861           sprintf_vma (value, offset_expr.X_add_number);
6862           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6863         }
6864
6865       /* Even on a big endian machine $fn comes before $fn+1.  We have
6866          to adjust when loading from memory.  We set coproc if we must
6867          load $fn+1 first.  */
6868       /* Itbl support may require additional care here.  */
6869       if (! target_big_endian)
6870         coproc = 0;
6871
6872       if (mips_pic == NO_PIC
6873           || offset_expr.X_op == O_constant)
6874         {
6875           /* If this is a reference to a GP relative symbol, we want
6876                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6877                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6878              If we have a base register, we use this
6879                addu     $at,$breg,$gp
6880                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6881                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6882              If this is not a GP relative symbol, we want
6883                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6884                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6885                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6886              If there is a base register, we add it to $at after the
6887              lui instruction.  If there is a constant, we always use
6888              the last case.  */
6889           if (offset_expr.X_op == O_symbol
6890               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6891               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6892             {
6893               relax_start (offset_expr.X_add_symbol);
6894               if (breg == 0)
6895                 {
6896                   tempreg = mips_gp_register;
6897                 }
6898               else
6899                 {
6900                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6901                                AT, breg, mips_gp_register);
6902                   tempreg = AT;
6903                   used_at = 1;
6904                 }
6905
6906               /* Itbl support may require additional care here.  */
6907               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6908                            BFD_RELOC_GPREL16, tempreg);
6909               offset_expr.X_add_number += 4;
6910
6911               /* Set mips_optimize to 2 to avoid inserting an
6912                  undesired nop.  */
6913               hold_mips_optimize = mips_optimize;
6914               mips_optimize = 2;
6915               /* Itbl support may require additional care here.  */
6916               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6917                            BFD_RELOC_GPREL16, tempreg);
6918               mips_optimize = hold_mips_optimize;
6919
6920               relax_switch ();
6921
6922               /* We just generated two relocs.  When tc_gen_reloc
6923                  handles this case, it will skip the first reloc and
6924                  handle the second.  The second reloc already has an
6925                  extra addend of 4, which we added above.  We must
6926                  subtract it out, and then subtract another 4 to make
6927                  the first reloc come out right.  The second reloc
6928                  will come out right because we are going to add 4 to
6929                  offset_expr when we build its instruction below.
6930
6931                  If we have a symbol, then we don't want to include
6932                  the offset, because it will wind up being included
6933                  when we generate the reloc.  */
6934
6935               if (offset_expr.X_op == O_constant)
6936                 offset_expr.X_add_number -= 8;
6937               else
6938                 {
6939                   offset_expr.X_add_number = -4;
6940                   offset_expr.X_op = O_constant;
6941                 }
6942             }
6943           used_at = 1;
6944           macro_build_lui (&offset_expr, AT);
6945           if (breg != 0)
6946             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6947           /* Itbl support may require additional care here.  */
6948           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6949                        BFD_RELOC_LO16, AT);
6950           /* FIXME: How do we handle overflow here?  */
6951           offset_expr.X_add_number += 4;
6952           /* Itbl support may require additional care here.  */
6953           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6954                        BFD_RELOC_LO16, AT);
6955           if (mips_relax.sequence)
6956             relax_end ();
6957         }
6958       else if (!mips_big_got)
6959         {
6960           /* If this is a reference to an external symbol, we want
6961                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6962                nop
6963                <op>     $treg,0($at)
6964                <op>     $treg+1,4($at)
6965              Otherwise we want
6966                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6967                nop
6968                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6969                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6970              If there is a base register we add it to $at before the
6971              lwc1 instructions.  If there is a constant we include it
6972              in the lwc1 instructions.  */
6973           used_at = 1;
6974           expr1.X_add_number = offset_expr.X_add_number;
6975           if (expr1.X_add_number < -0x8000
6976               || expr1.X_add_number >= 0x8000 - 4)
6977             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6978           load_got_offset (AT, &offset_expr);
6979           load_delay_nop ();
6980           if (breg != 0)
6981             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6982
6983           /* Set mips_optimize to 2 to avoid inserting an undesired
6984              nop.  */
6985           hold_mips_optimize = mips_optimize;
6986           mips_optimize = 2;
6987
6988           /* Itbl support may require additional care here.  */
6989           relax_start (offset_expr.X_add_symbol);
6990           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6991                        BFD_RELOC_LO16, AT);
6992           expr1.X_add_number += 4;
6993           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6994                        BFD_RELOC_LO16, AT);
6995           relax_switch ();
6996           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6997                        BFD_RELOC_LO16, AT);
6998           offset_expr.X_add_number += 4;
6999           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7000                        BFD_RELOC_LO16, AT);
7001           relax_end ();
7002
7003           mips_optimize = hold_mips_optimize;
7004         }
7005       else if (mips_big_got)
7006         {
7007           int gpdelay;
7008
7009           /* If this is a reference to an external symbol, we want
7010                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7011                addu     $at,$at,$gp
7012                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7013                nop
7014                <op>     $treg,0($at)
7015                <op>     $treg+1,4($at)
7016              Otherwise we want
7017                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7018                nop
7019                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7020                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7021              If there is a base register we add it to $at before the
7022              lwc1 instructions.  If there is a constant we include it
7023              in the lwc1 instructions.  */
7024           used_at = 1;
7025           expr1.X_add_number = offset_expr.X_add_number;
7026           offset_expr.X_add_number = 0;
7027           if (expr1.X_add_number < -0x8000
7028               || expr1.X_add_number >= 0x8000 - 4)
7029             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7030           gpdelay = reg_needs_delay (mips_gp_register);
7031           relax_start (offset_expr.X_add_symbol);
7032           macro_build (&offset_expr, "lui", "t,u",
7033                        AT, BFD_RELOC_MIPS_GOT_HI16);
7034           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7035                        AT, AT, mips_gp_register);
7036           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7037                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7038           load_delay_nop ();
7039           if (breg != 0)
7040             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7041           /* Itbl support may require additional care here.  */
7042           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7043                        BFD_RELOC_LO16, AT);
7044           expr1.X_add_number += 4;
7045
7046           /* Set mips_optimize to 2 to avoid inserting an undesired
7047              nop.  */
7048           hold_mips_optimize = mips_optimize;
7049           mips_optimize = 2;
7050           /* Itbl support may require additional care here.  */
7051           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7052                        BFD_RELOC_LO16, AT);
7053           mips_optimize = hold_mips_optimize;
7054           expr1.X_add_number -= 4;
7055
7056           relax_switch ();
7057           offset_expr.X_add_number = expr1.X_add_number;
7058           if (gpdelay)
7059             macro_build (NULL, "nop", "");
7060           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7061                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7062           load_delay_nop ();
7063           if (breg != 0)
7064             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7065           /* Itbl support may require additional care here.  */
7066           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7067                        BFD_RELOC_LO16, AT);
7068           offset_expr.X_add_number += 4;
7069
7070           /* Set mips_optimize to 2 to avoid inserting an undesired
7071              nop.  */
7072           hold_mips_optimize = mips_optimize;
7073           mips_optimize = 2;
7074           /* Itbl support may require additional care here.  */
7075           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7076                        BFD_RELOC_LO16, AT);
7077           mips_optimize = hold_mips_optimize;
7078           relax_end ();
7079         }
7080       else
7081         abort ();
7082
7083       break;
7084
7085     case M_LD_OB:
7086       s = "lw";
7087       goto sd_ob;
7088     case M_SD_OB:
7089       s = "sw";
7090     sd_ob:
7091       assert (HAVE_32BIT_ADDRESSES);
7092       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7093       offset_expr.X_add_number += 4;
7094       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7095       break;
7096
7097    /* New code added to support COPZ instructions.
7098       This code builds table entries out of the macros in mip_opcodes.
7099       R4000 uses interlocks to handle coproc delays.
7100       Other chips (like the R3000) require nops to be inserted for delays.
7101
7102       FIXME: Currently, we require that the user handle delays.
7103       In order to fill delay slots for non-interlocked chips,
7104       we must have a way to specify delays based on the coprocessor.
7105       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7106       What are the side-effects of the cop instruction?
7107       What cache support might we have and what are its effects?
7108       Both coprocessor & memory require delays. how long???
7109       What registers are read/set/modified?
7110
7111       If an itbl is provided to interpret cop instructions,
7112       this knowledge can be encoded in the itbl spec.  */
7113
7114     case M_COP0:
7115       s = "c0";
7116       goto copz;
7117     case M_COP1:
7118       s = "c1";
7119       goto copz;
7120     case M_COP2:
7121       s = "c2";
7122       goto copz;
7123     case M_COP3:
7124       s = "c3";
7125     copz:
7126       /* For now we just do C (same as Cz).  The parameter will be
7127          stored in insn_opcode by mips_ip.  */
7128       macro_build (NULL, s, "C", ip->insn_opcode);
7129       break;
7130
7131     case M_MOVE:
7132       move_register (dreg, sreg);
7133       break;
7134
7135 #ifdef LOSING_COMPILER
7136     default:
7137       /* Try and see if this is a new itbl instruction.
7138          This code builds table entries out of the macros in mip_opcodes.
7139          FIXME: For now we just assemble the expression and pass it's
7140          value along as a 32-bit immediate.
7141          We may want to have the assembler assemble this value,
7142          so that we gain the assembler's knowledge of delay slots,
7143          symbols, etc.
7144          Would it be more efficient to use mask (id) here? */
7145       if (itbl_have_entries
7146           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7147         {
7148           s = ip->insn_mo->name;
7149           s2 = "cop3";
7150           coproc = ITBL_DECODE_PNUM (immed_expr);;
7151           macro_build (&immed_expr, s, "C");
7152           break;
7153         }
7154       macro2 (ip);
7155       break;
7156     }
7157   if (!mips_opts.at && used_at)
7158     as_bad (_("Macro used $at after \".set noat\""));
7159 }
7160
7161 static void
7162 macro2 (struct mips_cl_insn *ip)
7163 {
7164   unsigned int treg, sreg, dreg, breg;
7165   unsigned int tempreg;
7166   int mask;
7167   int used_at;
7168   expressionS expr1;
7169   const char *s;
7170   const char *s2;
7171   const char *fmt;
7172   int likely = 0;
7173   int dbl = 0;
7174   int coproc = 0;
7175   int lr = 0;
7176   int imm = 0;
7177   int off;
7178   offsetT maxnum;
7179   bfd_reloc_code_real_type r;
7180
7181   treg = (ip->insn_opcode >> 16) & 0x1f;
7182   dreg = (ip->insn_opcode >> 11) & 0x1f;
7183   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7184   mask = ip->insn_mo->mask;
7185
7186   expr1.X_op = O_constant;
7187   expr1.X_op_symbol = NULL;
7188   expr1.X_add_symbol = NULL;
7189   expr1.X_add_number = 1;
7190
7191   switch (mask)
7192     {
7193 #endif /* LOSING_COMPILER */
7194
7195     case M_DMUL:
7196       dbl = 1;
7197     case M_MUL:
7198       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7199       macro_build (NULL, "mflo", "d", dreg);
7200       break;
7201
7202     case M_DMUL_I:
7203       dbl = 1;
7204     case M_MUL_I:
7205       /* The MIPS assembler some times generates shifts and adds.  I'm
7206          not trying to be that fancy. GCC should do this for us
7207          anyway.  */
7208       used_at = 1;
7209       load_register (AT, &imm_expr, dbl);
7210       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7211       macro_build (NULL, "mflo", "d", dreg);
7212       break;
7213
7214     case M_DMULO_I:
7215       dbl = 1;
7216     case M_MULO_I:
7217       imm = 1;
7218       goto do_mulo;
7219
7220     case M_DMULO:
7221       dbl = 1;
7222     case M_MULO:
7223     do_mulo:
7224       start_noreorder ();
7225       used_at = 1;
7226       if (imm)
7227         load_register (AT, &imm_expr, dbl);
7228       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7229       macro_build (NULL, "mflo", "d", dreg);
7230       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7231       macro_build (NULL, "mfhi", "d", AT);
7232       if (mips_trap)
7233         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7234       else
7235         {
7236           expr1.X_add_number = 8;
7237           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7238           macro_build (NULL, "nop", "", 0);
7239           macro_build (NULL, "break", "c", 6);
7240         }
7241       end_noreorder ();
7242       macro_build (NULL, "mflo", "d", dreg);
7243       break;
7244
7245     case M_DMULOU_I:
7246       dbl = 1;
7247     case M_MULOU_I:
7248       imm = 1;
7249       goto do_mulou;
7250
7251     case M_DMULOU:
7252       dbl = 1;
7253     case M_MULOU:
7254     do_mulou:
7255       start_noreorder ();
7256       used_at = 1;
7257       if (imm)
7258         load_register (AT, &imm_expr, dbl);
7259       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7260                    sreg, imm ? AT : treg);
7261       macro_build (NULL, "mfhi", "d", AT);
7262       macro_build (NULL, "mflo", "d", dreg);
7263       if (mips_trap)
7264         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7265       else
7266         {
7267           expr1.X_add_number = 8;
7268           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7269           macro_build (NULL, "nop", "", 0);
7270           macro_build (NULL, "break", "c", 6);
7271         }
7272       end_noreorder ();
7273       break;
7274
7275     case M_DROL:
7276       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7277         {
7278           if (dreg == sreg)
7279             {
7280               tempreg = AT;
7281               used_at = 1;
7282             }
7283           else
7284             {
7285               tempreg = dreg;
7286             }
7287           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7288           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7289           break;
7290         }
7291       used_at = 1;
7292       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7293       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7294       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7295       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7296       break;
7297
7298     case M_ROL:
7299       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7300         {
7301           if (dreg == sreg)
7302             {
7303               tempreg = AT;
7304               used_at = 1;
7305             }
7306           else
7307             {
7308               tempreg = dreg;
7309             }
7310           macro_build (NULL, "negu", "d,w", tempreg, treg);
7311           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7312           break;
7313         }
7314       used_at = 1;
7315       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7316       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7317       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7318       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7319       break;
7320
7321     case M_DROL_I:
7322       {
7323         unsigned int rot;
7324         char *l, *r;
7325
7326         if (imm_expr.X_op != O_constant)
7327           as_bad (_("Improper rotate count"));
7328         rot = imm_expr.X_add_number & 0x3f;
7329         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7330           {
7331             rot = (64 - rot) & 0x3f;
7332             if (rot >= 32)
7333               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7334             else
7335               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7336             break;
7337           }
7338         if (rot == 0)
7339           {
7340             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7341             break;
7342           }
7343         l = (rot < 0x20) ? "dsll" : "dsll32";
7344         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7345         rot &= 0x1f;
7346         used_at = 1;
7347         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7348         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7349         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7350       }
7351       break;
7352
7353     case M_ROL_I:
7354       {
7355         unsigned int rot;
7356
7357         if (imm_expr.X_op != O_constant)
7358           as_bad (_("Improper rotate count"));
7359         rot = imm_expr.X_add_number & 0x1f;
7360         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7361           {
7362             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7363             break;
7364           }
7365         if (rot == 0)
7366           {
7367             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7368             break;
7369           }
7370         used_at = 1;
7371         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7372         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7373         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7374       }
7375       break;
7376
7377     case M_DROR:
7378       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7379         {
7380           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7381           break;
7382         }
7383       used_at = 1;
7384       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7385       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7386       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7387       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7388       break;
7389
7390     case M_ROR:
7391       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7392         {
7393           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7394           break;
7395         }
7396       used_at = 1;
7397       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7398       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7399       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7400       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7401       break;
7402
7403     case M_DROR_I:
7404       {
7405         unsigned int rot;
7406         char *l, *r;
7407
7408         if (imm_expr.X_op != O_constant)
7409           as_bad (_("Improper rotate count"));
7410         rot = imm_expr.X_add_number & 0x3f;
7411         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7412           {
7413             if (rot >= 32)
7414               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7415             else
7416               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7417             break;
7418           }
7419         if (rot == 0)
7420           {
7421             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7422             break;
7423           }
7424         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7425         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7426         rot &= 0x1f;
7427         used_at = 1;
7428         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7429         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7430         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7431       }
7432       break;
7433
7434     case M_ROR_I:
7435       {
7436         unsigned int rot;
7437
7438         if (imm_expr.X_op != O_constant)
7439           as_bad (_("Improper rotate count"));
7440         rot = imm_expr.X_add_number & 0x1f;
7441         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7442           {
7443             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7444             break;
7445           }
7446         if (rot == 0)
7447           {
7448             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7449             break;
7450           }
7451         used_at = 1;
7452         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7453         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7454         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7455       }
7456       break;
7457
7458     case M_S_DOB:
7459       if (mips_opts.arch == CPU_R4650)
7460         {
7461           as_bad (_("opcode not supported on this processor"));
7462           break;
7463         }
7464       assert (mips_opts.isa == ISA_MIPS1);
7465       /* Even on a big endian machine $fn comes before $fn+1.  We have
7466          to adjust when storing to memory.  */
7467       macro_build (&offset_expr, "swc1", "T,o(b)",
7468                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7469       offset_expr.X_add_number += 4;
7470       macro_build (&offset_expr, "swc1", "T,o(b)",
7471                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7472       break;
7473
7474     case M_SEQ:
7475       if (sreg == 0)
7476         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7477       else if (treg == 0)
7478         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7479       else
7480         {
7481           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7482           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7483         }
7484       break;
7485
7486     case M_SEQ_I:
7487       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7488         {
7489           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7490           break;
7491         }
7492       if (sreg == 0)
7493         {
7494           as_warn (_("Instruction %s: result is always false"),
7495                    ip->insn_mo->name);
7496           move_register (dreg, 0);
7497           break;
7498         }
7499       if (imm_expr.X_op == O_constant
7500           && imm_expr.X_add_number >= 0
7501           && imm_expr.X_add_number < 0x10000)
7502         {
7503           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7504         }
7505       else if (imm_expr.X_op == O_constant
7506                && imm_expr.X_add_number > -0x8000
7507                && imm_expr.X_add_number < 0)
7508         {
7509           imm_expr.X_add_number = -imm_expr.X_add_number;
7510           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7511                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7512         }
7513       else
7514         {
7515           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7516           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7517           used_at = 1;
7518         }
7519       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7520       break;
7521
7522     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7523       s = "slt";
7524       goto sge;
7525     case M_SGEU:
7526       s = "sltu";
7527     sge:
7528       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7529       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7530       break;
7531
7532     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7533     case M_SGEU_I:
7534       if (imm_expr.X_op == O_constant
7535           && imm_expr.X_add_number >= -0x8000
7536           && imm_expr.X_add_number < 0x8000)
7537         {
7538           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7539                        dreg, sreg, BFD_RELOC_LO16);
7540         }
7541       else
7542         {
7543           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7544           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7545                        dreg, sreg, AT);
7546           used_at = 1;
7547         }
7548       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7549       break;
7550
7551     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7552       s = "slt";
7553       goto sgt;
7554     case M_SGTU:
7555       s = "sltu";
7556     sgt:
7557       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7558       break;
7559
7560     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7561       s = "slt";
7562       goto sgti;
7563     case M_SGTU_I:
7564       s = "sltu";
7565     sgti:
7566       used_at = 1;
7567       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7568       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7569       break;
7570
7571     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7572       s = "slt";
7573       goto sle;
7574     case M_SLEU:
7575       s = "sltu";
7576     sle:
7577       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7578       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7579       break;
7580
7581     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7582       s = "slt";
7583       goto slei;
7584     case M_SLEU_I:
7585       s = "sltu";
7586     slei:
7587       used_at = 1;
7588       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7589       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7590       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7591       break;
7592
7593     case M_SLT_I:
7594       if (imm_expr.X_op == O_constant
7595           && imm_expr.X_add_number >= -0x8000
7596           && imm_expr.X_add_number < 0x8000)
7597         {
7598           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7599           break;
7600         }
7601       used_at = 1;
7602       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7603       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7604       break;
7605
7606     case M_SLTU_I:
7607       if (imm_expr.X_op == O_constant
7608           && imm_expr.X_add_number >= -0x8000
7609           && imm_expr.X_add_number < 0x8000)
7610         {
7611           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7612                        BFD_RELOC_LO16);
7613           break;
7614         }
7615       used_at = 1;
7616       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7617       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7618       break;
7619
7620     case M_SNE:
7621       if (sreg == 0)
7622         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7623       else if (treg == 0)
7624         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7625       else
7626         {
7627           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7628           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7629         }
7630       break;
7631
7632     case M_SNE_I:
7633       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7634         {
7635           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7636           break;
7637         }
7638       if (sreg == 0)
7639         {
7640           as_warn (_("Instruction %s: result is always true"),
7641                    ip->insn_mo->name);
7642           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7643                        dreg, 0, BFD_RELOC_LO16);
7644           break;
7645         }
7646       if (imm_expr.X_op == O_constant
7647           && imm_expr.X_add_number >= 0
7648           && imm_expr.X_add_number < 0x10000)
7649         {
7650           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7651         }
7652       else if (imm_expr.X_op == O_constant
7653                && imm_expr.X_add_number > -0x8000
7654                && imm_expr.X_add_number < 0)
7655         {
7656           imm_expr.X_add_number = -imm_expr.X_add_number;
7657           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7658                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7659         }
7660       else
7661         {
7662           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7663           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7664           used_at = 1;
7665         }
7666       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7667       break;
7668
7669     case M_DSUB_I:
7670       dbl = 1;
7671     case M_SUB_I:
7672       if (imm_expr.X_op == O_constant
7673           && imm_expr.X_add_number > -0x8000
7674           && imm_expr.X_add_number <= 0x8000)
7675         {
7676           imm_expr.X_add_number = -imm_expr.X_add_number;
7677           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7678                        dreg, sreg, BFD_RELOC_LO16);
7679           break;
7680         }
7681       used_at = 1;
7682       load_register (AT, &imm_expr, dbl);
7683       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7684       break;
7685
7686     case M_DSUBU_I:
7687       dbl = 1;
7688     case M_SUBU_I:
7689       if (imm_expr.X_op == O_constant
7690           && imm_expr.X_add_number > -0x8000
7691           && imm_expr.X_add_number <= 0x8000)
7692         {
7693           imm_expr.X_add_number = -imm_expr.X_add_number;
7694           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7695                        dreg, sreg, BFD_RELOC_LO16);
7696           break;
7697         }
7698       used_at = 1;
7699       load_register (AT, &imm_expr, dbl);
7700       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7701       break;
7702
7703     case M_TEQ_I:
7704       s = "teq";
7705       goto trap;
7706     case M_TGE_I:
7707       s = "tge";
7708       goto trap;
7709     case M_TGEU_I:
7710       s = "tgeu";
7711       goto trap;
7712     case M_TLT_I:
7713       s = "tlt";
7714       goto trap;
7715     case M_TLTU_I:
7716       s = "tltu";
7717       goto trap;
7718     case M_TNE_I:
7719       s = "tne";
7720     trap:
7721       used_at = 1;
7722       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7723       macro_build (NULL, s, "s,t", sreg, AT);
7724       break;
7725
7726     case M_TRUNCWS:
7727     case M_TRUNCWD:
7728       assert (mips_opts.isa == ISA_MIPS1);
7729       used_at = 1;
7730       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7731       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7732
7733       /*
7734        * Is the double cfc1 instruction a bug in the mips assembler;
7735        * or is there a reason for it?
7736        */
7737       start_noreorder ();
7738       macro_build (NULL, "cfc1", "t,G", treg, RA);
7739       macro_build (NULL, "cfc1", "t,G", treg, RA);
7740       macro_build (NULL, "nop", "");
7741       expr1.X_add_number = 3;
7742       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7743       expr1.X_add_number = 2;
7744       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7745       macro_build (NULL, "ctc1", "t,G", AT, RA);
7746       macro_build (NULL, "nop", "");
7747       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7748                    dreg, sreg);
7749       macro_build (NULL, "ctc1", "t,G", treg, RA);
7750       macro_build (NULL, "nop", "");
7751       end_noreorder ();
7752       break;
7753
7754     case M_ULH:
7755       s = "lb";
7756       goto ulh;
7757     case M_ULHU:
7758       s = "lbu";
7759     ulh:
7760       used_at = 1;
7761       if (offset_expr.X_add_number >= 0x7fff)
7762         as_bad (_("operand overflow"));
7763       if (! target_big_endian)
7764         ++offset_expr.X_add_number;
7765       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7766       if (! target_big_endian)
7767         --offset_expr.X_add_number;
7768       else
7769         ++offset_expr.X_add_number;
7770       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7771       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7772       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7773       break;
7774
7775     case M_ULD:
7776       s = "ldl";
7777       s2 = "ldr";
7778       off = 7;
7779       goto ulw;
7780     case M_ULW:
7781       s = "lwl";
7782       s2 = "lwr";
7783       off = 3;
7784     ulw:
7785       if (offset_expr.X_add_number >= 0x8000 - off)
7786         as_bad (_("operand overflow"));
7787       if (treg != breg)
7788         tempreg = treg;
7789       else
7790         {
7791           used_at = 1;
7792           tempreg = AT;
7793         }
7794       if (! target_big_endian)
7795         offset_expr.X_add_number += off;
7796       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7797       if (! target_big_endian)
7798         offset_expr.X_add_number -= off;
7799       else
7800         offset_expr.X_add_number += off;
7801       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7802
7803       /* If necessary, move the result in tempreg the final destination.  */
7804       if (treg == tempreg)
7805         break;
7806       /* Protect second load's delay slot.  */
7807       load_delay_nop ();
7808       move_register (treg, tempreg);
7809       break;
7810
7811     case M_ULD_A:
7812       s = "ldl";
7813       s2 = "ldr";
7814       off = 7;
7815       goto ulwa;
7816     case M_ULW_A:
7817       s = "lwl";
7818       s2 = "lwr";
7819       off = 3;
7820     ulwa:
7821       used_at = 1;
7822       load_address (AT, &offset_expr, &used_at);
7823       if (breg != 0)
7824         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7825       if (! target_big_endian)
7826         expr1.X_add_number = off;
7827       else
7828         expr1.X_add_number = 0;
7829       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7830       if (! target_big_endian)
7831         expr1.X_add_number = 0;
7832       else
7833         expr1.X_add_number = off;
7834       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7835       break;
7836
7837     case M_ULH_A:
7838     case M_ULHU_A:
7839       used_at = 1;
7840       load_address (AT, &offset_expr, &used_at);
7841       if (breg != 0)
7842         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7843       if (target_big_endian)
7844         expr1.X_add_number = 0;
7845       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7846                    treg, BFD_RELOC_LO16, AT);
7847       if (target_big_endian)
7848         expr1.X_add_number = 1;
7849       else
7850         expr1.X_add_number = 0;
7851       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7852       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7853       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7854       break;
7855
7856     case M_USH:
7857       used_at = 1;
7858       if (offset_expr.X_add_number >= 0x7fff)
7859         as_bad (_("operand overflow"));
7860       if (target_big_endian)
7861         ++offset_expr.X_add_number;
7862       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7863       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7864       if (target_big_endian)
7865         --offset_expr.X_add_number;
7866       else
7867         ++offset_expr.X_add_number;
7868       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7869       break;
7870
7871     case M_USD:
7872       s = "sdl";
7873       s2 = "sdr";
7874       off = 7;
7875       goto usw;
7876     case M_USW:
7877       s = "swl";
7878       s2 = "swr";
7879       off = 3;
7880     usw:
7881       if (offset_expr.X_add_number >= 0x8000 - off)
7882         as_bad (_("operand overflow"));
7883       if (! target_big_endian)
7884         offset_expr.X_add_number += off;
7885       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7886       if (! target_big_endian)
7887         offset_expr.X_add_number -= off;
7888       else
7889         offset_expr.X_add_number += off;
7890       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7891       break;
7892
7893     case M_USD_A:
7894       s = "sdl";
7895       s2 = "sdr";
7896       off = 7;
7897       goto uswa;
7898     case M_USW_A:
7899       s = "swl";
7900       s2 = "swr";
7901       off = 3;
7902     uswa:
7903       used_at = 1;
7904       load_address (AT, &offset_expr, &used_at);
7905       if (breg != 0)
7906         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7907       if (! target_big_endian)
7908         expr1.X_add_number = off;
7909       else
7910         expr1.X_add_number = 0;
7911       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7912       if (! target_big_endian)
7913         expr1.X_add_number = 0;
7914       else
7915         expr1.X_add_number = off;
7916       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7917       break;
7918
7919     case M_USH_A:
7920       used_at = 1;
7921       load_address (AT, &offset_expr, &used_at);
7922       if (breg != 0)
7923         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7924       if (! target_big_endian)
7925         expr1.X_add_number = 0;
7926       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7927       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7928       if (! target_big_endian)
7929         expr1.X_add_number = 1;
7930       else
7931         expr1.X_add_number = 0;
7932       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7933       if (! target_big_endian)
7934         expr1.X_add_number = 0;
7935       else
7936         expr1.X_add_number = 1;
7937       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7938       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7939       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7940       break;
7941
7942     default:
7943       /* FIXME: Check if this is one of the itbl macros, since they
7944          are added dynamically.  */
7945       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7946       break;
7947     }
7948   if (!mips_opts.at && used_at)
7949     as_bad (_("Macro used $at after \".set noat\""));
7950 }
7951
7952 /* Implement macros in mips16 mode.  */
7953
7954 static void
7955 mips16_macro (struct mips_cl_insn *ip)
7956 {
7957   int mask;
7958   int xreg, yreg, zreg, tmp;
7959   expressionS expr1;
7960   int dbl;
7961   const char *s, *s2, *s3;
7962
7963   mask = ip->insn_mo->mask;
7964
7965   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
7966   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
7967   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
7968
7969   expr1.X_op = O_constant;
7970   expr1.X_op_symbol = NULL;
7971   expr1.X_add_symbol = NULL;
7972   expr1.X_add_number = 1;
7973
7974   dbl = 0;
7975
7976   switch (mask)
7977     {
7978     default:
7979       internalError ();
7980
7981     case M_DDIV_3:
7982       dbl = 1;
7983     case M_DIV_3:
7984       s = "mflo";
7985       goto do_div3;
7986     case M_DREM_3:
7987       dbl = 1;
7988     case M_REM_3:
7989       s = "mfhi";
7990     do_div3:
7991       start_noreorder ();
7992       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7993       expr1.X_add_number = 2;
7994       macro_build (&expr1, "bnez", "x,p", yreg);
7995       macro_build (NULL, "break", "6", 7);
7996
7997       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7998          since that causes an overflow.  We should do that as well,
7999          but I don't see how to do the comparisons without a temporary
8000          register.  */
8001       end_noreorder ();
8002       macro_build (NULL, s, "x", zreg);
8003       break;
8004
8005     case M_DIVU_3:
8006       s = "divu";
8007       s2 = "mflo";
8008       goto do_divu3;
8009     case M_REMU_3:
8010       s = "divu";
8011       s2 = "mfhi";
8012       goto do_divu3;
8013     case M_DDIVU_3:
8014       s = "ddivu";
8015       s2 = "mflo";
8016       goto do_divu3;
8017     case M_DREMU_3:
8018       s = "ddivu";
8019       s2 = "mfhi";
8020     do_divu3:
8021       start_noreorder ();
8022       macro_build (NULL, s, "0,x,y", xreg, yreg);
8023       expr1.X_add_number = 2;
8024       macro_build (&expr1, "bnez", "x,p", yreg);
8025       macro_build (NULL, "break", "6", 7);
8026       end_noreorder ();
8027       macro_build (NULL, s2, "x", zreg);
8028       break;
8029
8030     case M_DMUL:
8031       dbl = 1;
8032     case M_MUL:
8033       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8034       macro_build (NULL, "mflo", "x", zreg);
8035       break;
8036
8037     case M_DSUBU_I:
8038       dbl = 1;
8039       goto do_subu;
8040     case M_SUBU_I:
8041     do_subu:
8042       if (imm_expr.X_op != O_constant)
8043         as_bad (_("Unsupported large constant"));
8044       imm_expr.X_add_number = -imm_expr.X_add_number;
8045       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8046       break;
8047
8048     case M_SUBU_I_2:
8049       if (imm_expr.X_op != O_constant)
8050         as_bad (_("Unsupported large constant"));
8051       imm_expr.X_add_number = -imm_expr.X_add_number;
8052       macro_build (&imm_expr, "addiu", "x,k", xreg);
8053       break;
8054
8055     case M_DSUBU_I_2:
8056       if (imm_expr.X_op != O_constant)
8057         as_bad (_("Unsupported large constant"));
8058       imm_expr.X_add_number = -imm_expr.X_add_number;
8059       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8060       break;
8061
8062     case M_BEQ:
8063       s = "cmp";
8064       s2 = "bteqz";
8065       goto do_branch;
8066     case M_BNE:
8067       s = "cmp";
8068       s2 = "btnez";
8069       goto do_branch;
8070     case M_BLT:
8071       s = "slt";
8072       s2 = "btnez";
8073       goto do_branch;
8074     case M_BLTU:
8075       s = "sltu";
8076       s2 = "btnez";
8077       goto do_branch;
8078     case M_BLE:
8079       s = "slt";
8080       s2 = "bteqz";
8081       goto do_reverse_branch;
8082     case M_BLEU:
8083       s = "sltu";
8084       s2 = "bteqz";
8085       goto do_reverse_branch;
8086     case M_BGE:
8087       s = "slt";
8088       s2 = "bteqz";
8089       goto do_branch;
8090     case M_BGEU:
8091       s = "sltu";
8092       s2 = "bteqz";
8093       goto do_branch;
8094     case M_BGT:
8095       s = "slt";
8096       s2 = "btnez";
8097       goto do_reverse_branch;
8098     case M_BGTU:
8099       s = "sltu";
8100       s2 = "btnez";
8101
8102     do_reverse_branch:
8103       tmp = xreg;
8104       xreg = yreg;
8105       yreg = tmp;
8106
8107     do_branch:
8108       macro_build (NULL, s, "x,y", xreg, yreg);
8109       macro_build (&offset_expr, s2, "p");
8110       break;
8111
8112     case M_BEQ_I:
8113       s = "cmpi";
8114       s2 = "bteqz";
8115       s3 = "x,U";
8116       goto do_branch_i;
8117     case M_BNE_I:
8118       s = "cmpi";
8119       s2 = "btnez";
8120       s3 = "x,U";
8121       goto do_branch_i;
8122     case M_BLT_I:
8123       s = "slti";
8124       s2 = "btnez";
8125       s3 = "x,8";
8126       goto do_branch_i;
8127     case M_BLTU_I:
8128       s = "sltiu";
8129       s2 = "btnez";
8130       s3 = "x,8";
8131       goto do_branch_i;
8132     case M_BLE_I:
8133       s = "slti";
8134       s2 = "btnez";
8135       s3 = "x,8";
8136       goto do_addone_branch_i;
8137     case M_BLEU_I:
8138       s = "sltiu";
8139       s2 = "btnez";
8140       s3 = "x,8";
8141       goto do_addone_branch_i;
8142     case M_BGE_I:
8143       s = "slti";
8144       s2 = "bteqz";
8145       s3 = "x,8";
8146       goto do_branch_i;
8147     case M_BGEU_I:
8148       s = "sltiu";
8149       s2 = "bteqz";
8150       s3 = "x,8";
8151       goto do_branch_i;
8152     case M_BGT_I:
8153       s = "slti";
8154       s2 = "bteqz";
8155       s3 = "x,8";
8156       goto do_addone_branch_i;
8157     case M_BGTU_I:
8158       s = "sltiu";
8159       s2 = "bteqz";
8160       s3 = "x,8";
8161
8162     do_addone_branch_i:
8163       if (imm_expr.X_op != O_constant)
8164         as_bad (_("Unsupported large constant"));
8165       ++imm_expr.X_add_number;
8166
8167     do_branch_i:
8168       macro_build (&imm_expr, s, s3, xreg);
8169       macro_build (&offset_expr, s2, "p");
8170       break;
8171
8172     case M_ABS:
8173       expr1.X_add_number = 0;
8174       macro_build (&expr1, "slti", "x,8", yreg);
8175       if (xreg != yreg)
8176         move_register (xreg, yreg);
8177       expr1.X_add_number = 2;
8178       macro_build (&expr1, "bteqz", "p");
8179       macro_build (NULL, "neg", "x,w", xreg, xreg);
8180     }
8181 }
8182
8183 /* For consistency checking, verify that all bits are specified either
8184    by the match/mask part of the instruction definition, or by the
8185    operand list.  */
8186 static int
8187 validate_mips_insn (const struct mips_opcode *opc)
8188 {
8189   const char *p = opc->args;
8190   char c;
8191   unsigned long used_bits = opc->mask;
8192
8193   if ((used_bits & opc->match) != opc->match)
8194     {
8195       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8196               opc->name, opc->args);
8197       return 0;
8198     }
8199 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8200   while (*p)
8201     switch (c = *p++)
8202       {
8203       case ',': break;
8204       case '(': break;
8205       case ')': break;
8206       case '+':
8207         switch (c = *p++)
8208           {
8209           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8210           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8211           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8212           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8213           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8214           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8215           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8216           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8217                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8218           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8219           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8220           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8221           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8222           case 'I': break;
8223           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8224           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8225                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8226           default:
8227             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8228                     c, opc->name, opc->args);
8229             return 0;
8230           }
8231         break;
8232       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8233       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8234       case 'A': break;
8235       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8236       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8237       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8238       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8239       case 'F': break;
8240       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8241       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8242       case 'I': break;
8243       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8244       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8245       case 'L': break;
8246       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8247       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8248       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8249       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8250                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8251       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8252       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8253       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8254       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8255       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8256       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8257       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8258       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8259       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8260       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8261       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8262       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8263       case 'f': break;
8264       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8265       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8266       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8267       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8268       case 'l': break;
8269       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8270       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8271       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8272       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8273       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8274       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8275       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8276       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8277       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8278       case 'x': break;
8279       case 'z': break;
8280       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8281       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8282                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8283       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8284       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8285       case '[': break;
8286       case ']': break;
8287       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8288       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8289       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8290       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8291       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8292       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8293       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8294       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8295       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8296       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8297       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8298       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8299       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8300       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8301       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8302       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8303       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8304       default:
8305         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8306                 c, opc->name, opc->args);
8307         return 0;
8308       }
8309 #undef USE_BITS
8310   if (used_bits != 0xffffffff)
8311     {
8312       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8313               ~used_bits & 0xffffffff, opc->name, opc->args);
8314       return 0;
8315     }
8316   return 1;
8317 }
8318
8319 /* UDI immediates.  */
8320 struct mips_immed {
8321   char          type;
8322   unsigned int  shift;
8323   unsigned long mask;
8324   const char *  desc;
8325 };
8326
8327 static const struct mips_immed mips_immed[] = {
8328   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8329   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8330   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8331   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8332   { 0,0,0,0 }
8333 };
8334
8335 /* Check whether an odd floating-point register is allowed.  */
8336 static int
8337 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8338 {
8339   const char *s = insn->name;
8340
8341   if (insn->pinfo == INSN_MACRO)
8342     /* Let a macro pass, we'll catch it later when it is expanded.  */
8343     return 1;
8344
8345   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8346     {
8347       /* Allow odd registers for single-precision ops.  */
8348       switch (insn->pinfo & (FP_S | FP_D))
8349         {
8350         case FP_S:
8351         case 0:
8352           return 1;     /* both single precision - ok */
8353         case FP_D:
8354           return 0;     /* both double precision - fail */
8355         default:
8356           break;
8357         }
8358
8359       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8360       s = strchr (insn->name, '.');
8361       if (argnum == 2)
8362         s = s != NULL ? strchr (s + 1, '.') : NULL;
8363       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8364     } 
8365
8366   /* Single-precision coprocessor loads and moves are OK too.  */
8367   if ((insn->pinfo & FP_S)
8368       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8369                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8370     return 1;
8371
8372   return 0;
8373 }
8374
8375 /* This routine assembles an instruction into its binary format.  As a
8376    side effect, it sets one of the global variables imm_reloc or
8377    offset_reloc to the type of relocation to do if one of the operands
8378    is an address expression.  */
8379
8380 static void
8381 mips_ip (char *str, struct mips_cl_insn *ip)
8382 {
8383   char *s;
8384   const char *args;
8385   char c = 0;
8386   struct mips_opcode *insn;
8387   char *argsStart;
8388   unsigned int regno;
8389   unsigned int lastregno = 0;
8390   unsigned int lastpos = 0;
8391   unsigned int limlo, limhi;
8392   char *s_reset;
8393   char save_c = 0;
8394   offsetT min_range, max_range;
8395   int argnum;
8396   unsigned int rtype;
8397
8398   insn_error = NULL;
8399
8400   /* If the instruction contains a '.', we first try to match an instruction
8401      including the '.'.  Then we try again without the '.'.  */
8402   insn = NULL;
8403   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8404     continue;
8405
8406   /* If we stopped on whitespace, then replace the whitespace with null for
8407      the call to hash_find.  Save the character we replaced just in case we
8408      have to re-parse the instruction.  */
8409   if (ISSPACE (*s))
8410     {
8411       save_c = *s;
8412       *s++ = '\0';
8413     }
8414
8415   insn = (struct mips_opcode *) hash_find (op_hash, str);
8416
8417   /* If we didn't find the instruction in the opcode table, try again, but
8418      this time with just the instruction up to, but not including the
8419      first '.'.  */
8420   if (insn == NULL)
8421     {
8422       /* Restore the character we overwrite above (if any).  */
8423       if (save_c)
8424         *(--s) = save_c;
8425
8426       /* Scan up to the first '.' or whitespace.  */
8427       for (s = str;
8428            *s != '\0' && *s != '.' && !ISSPACE (*s);
8429            ++s)
8430         continue;
8431
8432       /* If we did not find a '.', then we can quit now.  */
8433       if (*s != '.')
8434         {
8435           insn_error = "unrecognized opcode";
8436           return;
8437         }
8438
8439       /* Lookup the instruction in the hash table.  */
8440       *s++ = '\0';
8441       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8442         {
8443           insn_error = "unrecognized opcode";
8444           return;
8445         }
8446     }
8447
8448   argsStart = s;
8449   for (;;)
8450     {
8451       bfd_boolean ok;
8452
8453       assert (strcmp (insn->name, str) == 0);
8454
8455       if (OPCODE_IS_MEMBER (insn,
8456                             (mips_opts.isa
8457                              /* We don't check for mips_opts.mips16 here since
8458                                 we want to allow jalx if -mips16 was specified
8459                                 on the command line.  */
8460                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8461                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8462                              | (mips_opts.ase_dsp ? INSN_DSP : 0)
8463                              | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
8464                                 ? INSN_DSP64 : 0)
8465                              | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
8466                              | (mips_opts.ase_mt ? INSN_MT : 0)
8467                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8468                              | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8469                             mips_opts.arch))
8470         ok = TRUE;
8471       else
8472         ok = FALSE;
8473
8474       if (insn->pinfo != INSN_MACRO)
8475         {
8476           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8477             ok = FALSE;
8478         }
8479
8480       if (! ok)
8481         {
8482           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8483               && strcmp (insn->name, insn[1].name) == 0)
8484             {
8485               ++insn;
8486               continue;
8487             }
8488           else
8489             {
8490               if (!insn_error)
8491                 {
8492                   static char buf[100];
8493                   sprintf (buf,
8494                            _("opcode not supported on this processor: %s (%s)"),
8495                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8496                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8497                   insn_error = buf;
8498                 }
8499               if (save_c)
8500                 *(--s) = save_c;
8501               return;
8502             }
8503         }
8504
8505       create_insn (ip, insn);
8506       insn_error = NULL;
8507       argnum = 1;
8508       for (args = insn->args;; ++args)
8509         {
8510           int is_mdmx;
8511
8512           s += strspn (s, " \t");
8513           is_mdmx = 0;
8514           switch (*args)
8515             {
8516             case '\0':          /* end of args */
8517               if (*s == '\0')
8518                 return;
8519               break;
8520
8521             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8522               my_getExpression (&imm_expr, s);
8523               check_absolute_expr (ip, &imm_expr);
8524               if ((unsigned long) imm_expr.X_add_number != 1
8525                   && (unsigned long) imm_expr.X_add_number != 3)
8526                 {
8527                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8528                           (unsigned long) imm_expr.X_add_number);
8529                 }
8530               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8531               imm_expr.X_op = O_absent;
8532               s = expr_end;
8533               continue;
8534
8535             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8536               my_getExpression (&imm_expr, s);
8537               check_absolute_expr (ip, &imm_expr);
8538               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8539                 {
8540                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8541                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8542                 }
8543               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8544               imm_expr.X_op = O_absent;
8545               s = expr_end;
8546               continue;
8547
8548             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8549               my_getExpression (&imm_expr, s);
8550               check_absolute_expr (ip, &imm_expr);
8551               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8552                 {
8553                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8554                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8555                 }
8556               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8557               imm_expr.X_op = O_absent;
8558               s = expr_end;
8559               continue;
8560
8561             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8562               my_getExpression (&imm_expr, s);
8563               check_absolute_expr (ip, &imm_expr);
8564               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8565                 {
8566                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8567                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8568                 }
8569               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8570               imm_expr.X_op = O_absent;
8571               s = expr_end;
8572               continue;
8573
8574             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8575               my_getExpression (&imm_expr, s);
8576               check_absolute_expr (ip, &imm_expr);
8577               if (imm_expr.X_add_number & ~OP_MASK_RS)
8578                 {
8579                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8580                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8581                 }
8582               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8583               imm_expr.X_op = O_absent;
8584               s = expr_end;
8585               continue;
8586
8587             case '7': /* four dsp accumulators in bits 11,12 */ 
8588               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8589                   s[3] >= '0' && s[3] <= '3')
8590                 {
8591                   regno = s[3] - '0';
8592                   s += 4;
8593                   INSERT_OPERAND (DSPACC, *ip, regno);
8594                   continue;
8595                 }
8596               else
8597                 as_bad (_("Invalid dsp acc register"));
8598               break;
8599
8600             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8601               my_getExpression (&imm_expr, s);
8602               check_absolute_expr (ip, &imm_expr);
8603               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8604                 {
8605                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8606                           OP_MASK_WRDSP,
8607                           (unsigned long) imm_expr.X_add_number);
8608                 }
8609               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8610               imm_expr.X_op = O_absent;
8611               s = expr_end;
8612               continue;
8613
8614             case '9': /* four dsp accumulators in bits 21,22 */
8615               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8616                   s[3] >= '0' && s[3] <= '3')
8617                 {
8618                   regno = s[3] - '0';
8619                   s += 4;
8620                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8621                   continue;
8622                 }
8623               else
8624                 as_bad (_("Invalid dsp acc register"));
8625               break;
8626
8627             case '0': /* dsp 6-bit signed immediate in bit 20 */
8628               my_getExpression (&imm_expr, s);
8629               check_absolute_expr (ip, &imm_expr);
8630               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8631               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8632               if (imm_expr.X_add_number < min_range ||
8633                   imm_expr.X_add_number > max_range)
8634                 {
8635                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8636                           (long) min_range, (long) max_range,
8637                           (long) imm_expr.X_add_number);
8638                 }
8639               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8640               imm_expr.X_op = O_absent;
8641               s = expr_end;
8642               continue;
8643
8644             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8645               my_getExpression (&imm_expr, s);
8646               check_absolute_expr (ip, &imm_expr);
8647               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8648                 {
8649                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8650                           OP_MASK_RDDSP,
8651                           (unsigned long) imm_expr.X_add_number);
8652                 }
8653               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8654               imm_expr.X_op = O_absent;
8655               s = expr_end;
8656               continue;
8657
8658             case ':': /* dsp 7-bit signed immediate in bit 19 */
8659               my_getExpression (&imm_expr, s);
8660               check_absolute_expr (ip, &imm_expr);
8661               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8662               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8663               if (imm_expr.X_add_number < min_range ||
8664                   imm_expr.X_add_number > max_range)
8665                 {
8666                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8667                           (long) min_range, (long) max_range,
8668                           (long) imm_expr.X_add_number);
8669                 }
8670               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8671               imm_expr.X_op = O_absent;
8672               s = expr_end;
8673               continue;
8674
8675             case '@': /* dsp 10-bit signed immediate in bit 16 */
8676               my_getExpression (&imm_expr, s);
8677               check_absolute_expr (ip, &imm_expr);
8678               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8679               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8680               if (imm_expr.X_add_number < min_range ||
8681                   imm_expr.X_add_number > max_range)
8682                 {
8683                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8684                           (long) min_range, (long) max_range,
8685                           (long) imm_expr.X_add_number);
8686                 }
8687               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8688               imm_expr.X_op = O_absent;
8689               s = expr_end;
8690               continue;
8691
8692             case '!': /* MT usermode flag bit.  */
8693               my_getExpression (&imm_expr, s);
8694               check_absolute_expr (ip, &imm_expr);
8695               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8696                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8697                         (unsigned long) imm_expr.X_add_number);
8698               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8699               imm_expr.X_op = O_absent;
8700               s = expr_end;
8701               continue;
8702
8703             case '$': /* MT load high flag bit.  */
8704               my_getExpression (&imm_expr, s);
8705               check_absolute_expr (ip, &imm_expr);
8706               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8707                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8708                         (unsigned long) imm_expr.X_add_number);
8709               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8710               imm_expr.X_op = O_absent;
8711               s = expr_end;
8712               continue;
8713
8714             case '*': /* four dsp accumulators in bits 18,19 */ 
8715               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8716                   s[3] >= '0' && s[3] <= '3')
8717                 {
8718                   regno = s[3] - '0';
8719                   s += 4;
8720                   INSERT_OPERAND (MTACC_T, *ip, regno);
8721                   continue;
8722                 }
8723               else
8724                 as_bad (_("Invalid dsp/smartmips acc register"));
8725               break;
8726
8727             case '&': /* four dsp accumulators in bits 13,14 */ 
8728               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8729                   s[3] >= '0' && s[3] <= '3')
8730                 {
8731                   regno = s[3] - '0';
8732                   s += 4;
8733                   INSERT_OPERAND (MTACC_D, *ip, regno);
8734                   continue;
8735                 }
8736               else
8737                 as_bad (_("Invalid dsp/smartmips acc register"));
8738               break;
8739
8740             case ',':
8741               ++argnum;
8742               if (*s++ == *args)
8743                 continue;
8744               s--;
8745               switch (*++args)
8746                 {
8747                 case 'r':
8748                 case 'v':
8749                   INSERT_OPERAND (RS, *ip, lastregno);
8750                   continue;
8751
8752                 case 'w':
8753                   INSERT_OPERAND (RT, *ip, lastregno);
8754                   continue;
8755
8756                 case 'W':
8757                   INSERT_OPERAND (FT, *ip, lastregno);
8758                   continue;
8759
8760                 case 'V':
8761                   INSERT_OPERAND (FS, *ip, lastregno);
8762                   continue;
8763                 }
8764               break;
8765
8766             case '(':
8767               /* Handle optional base register.
8768                  Either the base register is omitted or
8769                  we must have a left paren.  */
8770               /* This is dependent on the next operand specifier
8771                  is a base register specification.  */
8772               assert (args[1] == 'b' || args[1] == '5'
8773                       || args[1] == '-' || args[1] == '4');
8774               if (*s == '\0')
8775                 return;
8776
8777             case ')':           /* these must match exactly */
8778             case '[':
8779             case ']':
8780               if (*s++ == *args)
8781                 continue;
8782               break;
8783
8784             case '+':           /* Opcode extension character.  */
8785               switch (*++args)
8786                 {
8787                 case '1':       /* UDI immediates.  */
8788                 case '2':
8789                 case '3':
8790                 case '4':
8791                   {
8792                     const struct mips_immed *imm = mips_immed;
8793
8794                     while (imm->type && imm->type != *args)
8795                       ++imm;
8796                     if (! imm->type)
8797                       internalError ();
8798                     my_getExpression (&imm_expr, s);
8799                     check_absolute_expr (ip, &imm_expr);
8800                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8801                       {
8802                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8803                                  imm->desc ? imm->desc : ip->insn_mo->name,
8804                                  (unsigned long) imm_expr.X_add_number,
8805                                  (unsigned long) imm_expr.X_add_number);
8806                               imm_expr.X_add_number &= imm->mask;
8807                       }
8808                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8809                                         << imm->shift);
8810                     imm_expr.X_op = O_absent;
8811                     s = expr_end;
8812                   }
8813                   continue;
8814                   
8815                 case 'A':               /* ins/ext position, becomes LSB.  */
8816                   limlo = 0;
8817                   limhi = 31;
8818                   goto do_lsb;
8819                 case 'E':
8820                   limlo = 32;
8821                   limhi = 63;
8822                   goto do_lsb;
8823 do_lsb:
8824                   my_getExpression (&imm_expr, s);
8825                   check_absolute_expr (ip, &imm_expr);
8826                   if ((unsigned long) imm_expr.X_add_number < limlo
8827                       || (unsigned long) imm_expr.X_add_number > limhi)
8828                     {
8829                       as_bad (_("Improper position (%lu)"),
8830                               (unsigned long) imm_expr.X_add_number);
8831                       imm_expr.X_add_number = limlo;
8832                     }
8833                   lastpos = imm_expr.X_add_number;
8834                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8835                   imm_expr.X_op = O_absent;
8836                   s = expr_end;
8837                   continue;
8838
8839                 case 'B':               /* ins size, becomes MSB.  */
8840                   limlo = 1;
8841                   limhi = 32;
8842                   goto do_msb;
8843                 case 'F':
8844                   limlo = 33;
8845                   limhi = 64;
8846                   goto do_msb;
8847 do_msb:
8848                   my_getExpression (&imm_expr, s);
8849                   check_absolute_expr (ip, &imm_expr);
8850                   /* Check for negative input so that small negative numbers
8851                      will not succeed incorrectly.  The checks against
8852                      (pos+size) transitively check "size" itself,
8853                      assuming that "pos" is reasonable.  */
8854                   if ((long) imm_expr.X_add_number < 0
8855                       || ((unsigned long) imm_expr.X_add_number
8856                           + lastpos) < limlo
8857                       || ((unsigned long) imm_expr.X_add_number
8858                           + lastpos) > limhi)
8859                     {
8860                       as_bad (_("Improper insert size (%lu, position %lu)"),
8861                               (unsigned long) imm_expr.X_add_number,
8862                               (unsigned long) lastpos);
8863                       imm_expr.X_add_number = limlo - lastpos;
8864                     }
8865                   INSERT_OPERAND (INSMSB, *ip,
8866                                  lastpos + imm_expr.X_add_number - 1);
8867                   imm_expr.X_op = O_absent;
8868                   s = expr_end;
8869                   continue;
8870
8871                 case 'C':               /* ext size, becomes MSBD.  */
8872                   limlo = 1;
8873                   limhi = 32;
8874                   goto do_msbd;
8875                 case 'G':
8876                   limlo = 33;
8877                   limhi = 64;
8878                   goto do_msbd;
8879                 case 'H':
8880                   limlo = 33;
8881                   limhi = 64;
8882                   goto do_msbd;
8883 do_msbd:
8884                   my_getExpression (&imm_expr, s);
8885                   check_absolute_expr (ip, &imm_expr);
8886                   /* Check for negative input so that small negative numbers
8887                      will not succeed incorrectly.  The checks against
8888                      (pos+size) transitively check "size" itself,
8889                      assuming that "pos" is reasonable.  */
8890                   if ((long) imm_expr.X_add_number < 0
8891                       || ((unsigned long) imm_expr.X_add_number
8892                           + lastpos) < limlo
8893                       || ((unsigned long) imm_expr.X_add_number
8894                           + lastpos) > limhi)
8895                     {
8896                       as_bad (_("Improper extract size (%lu, position %lu)"),
8897                               (unsigned long) imm_expr.X_add_number,
8898                               (unsigned long) lastpos);
8899                       imm_expr.X_add_number = limlo - lastpos;
8900                     }
8901                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
8902                   imm_expr.X_op = O_absent;
8903                   s = expr_end;
8904                   continue;
8905
8906                 case 'D':
8907                   /* +D is for disassembly only; never match.  */
8908                   break;
8909
8910                 case 'I':
8911                   /* "+I" is like "I", except that imm2_expr is used.  */
8912                   my_getExpression (&imm2_expr, s);
8913                   if (imm2_expr.X_op != O_big
8914                       && imm2_expr.X_op != O_constant)
8915                   insn_error = _("absolute expression required");
8916                   if (HAVE_32BIT_GPRS)
8917                     normalize_constant_expr (&imm2_expr);
8918                   s = expr_end;
8919                   continue;
8920
8921                 case 'T': /* Coprocessor register.  */
8922                   /* +T is for disassembly only; never match.  */
8923                   break;
8924
8925                 case 't': /* Coprocessor register number.  */
8926                   if (s[0] == '$' && ISDIGIT (s[1]))
8927                     {
8928                       ++s;
8929                       regno = 0;
8930                       do
8931                         {
8932                           regno *= 10;
8933                           regno += *s - '0';
8934                           ++s;
8935                         }
8936                       while (ISDIGIT (*s));
8937                       if (regno > 31)
8938                         as_bad (_("Invalid register number (%d)"), regno);
8939                       else
8940                         {
8941                           INSERT_OPERAND (RT, *ip, regno);
8942                           continue;
8943                         }
8944                     }
8945                   else
8946                     as_bad (_("Invalid coprocessor 0 register number"));
8947                   break;
8948
8949                 default:
8950                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8951                     *args, insn->name, insn->args);
8952                   /* Further processing is fruitless.  */
8953                   return;
8954                 }
8955               break;
8956
8957             case '<':           /* must be at least one digit */
8958               /*
8959                * According to the manual, if the shift amount is greater
8960                * than 31 or less than 0, then the shift amount should be
8961                * mod 32.  In reality the mips assembler issues an error.
8962                * We issue a warning and mask out all but the low 5 bits.
8963                */
8964               my_getExpression (&imm_expr, s);
8965               check_absolute_expr (ip, &imm_expr);
8966               if ((unsigned long) imm_expr.X_add_number > 31)
8967                 as_warn (_("Improper shift amount (%lu)"),
8968                          (unsigned long) imm_expr.X_add_number);
8969               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8970               imm_expr.X_op = O_absent;
8971               s = expr_end;
8972               continue;
8973
8974             case '>':           /* shift amount minus 32 */
8975               my_getExpression (&imm_expr, s);
8976               check_absolute_expr (ip, &imm_expr);
8977               if ((unsigned long) imm_expr.X_add_number < 32
8978                   || (unsigned long) imm_expr.X_add_number > 63)
8979                 break;
8980               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8981               imm_expr.X_op = O_absent;
8982               s = expr_end;
8983               continue;
8984
8985             case 'k':           /* cache code */
8986             case 'h':           /* prefx code */
8987               my_getExpression (&imm_expr, s);
8988               check_absolute_expr (ip, &imm_expr);
8989               if ((unsigned long) imm_expr.X_add_number > 31)
8990                 as_warn (_("Invalid value for `%s' (%lu)"),
8991                          ip->insn_mo->name,
8992                          (unsigned long) imm_expr.X_add_number);
8993               if (*args == 'k')
8994                 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8995               else
8996                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8997               imm_expr.X_op = O_absent;
8998               s = expr_end;
8999               continue;
9000
9001             case 'c':           /* break code */
9002               my_getExpression (&imm_expr, s);
9003               check_absolute_expr (ip, &imm_expr);
9004               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9005                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9006                          ip->insn_mo->name,
9007                          (unsigned long) imm_expr.X_add_number);
9008               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9009               imm_expr.X_op = O_absent;
9010               s = expr_end;
9011               continue;
9012
9013             case 'q':           /* lower break code */
9014               my_getExpression (&imm_expr, s);
9015               check_absolute_expr (ip, &imm_expr);
9016               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9017                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9018                          ip->insn_mo->name,
9019                          (unsigned long) imm_expr.X_add_number);
9020               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9021               imm_expr.X_op = O_absent;
9022               s = expr_end;
9023               continue;
9024
9025             case 'B':           /* 20-bit syscall/break code.  */
9026               my_getExpression (&imm_expr, s);
9027               check_absolute_expr (ip, &imm_expr);
9028               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9029                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9030                          ip->insn_mo->name,
9031                          (unsigned long) imm_expr.X_add_number);
9032               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9033               imm_expr.X_op = O_absent;
9034               s = expr_end;
9035               continue;
9036
9037             case 'C':           /* Coprocessor code */
9038               my_getExpression (&imm_expr, s);
9039               check_absolute_expr (ip, &imm_expr);
9040               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9041                 {
9042                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9043                            (unsigned long) imm_expr.X_add_number);
9044                   imm_expr.X_add_number &= OP_MASK_COPZ;
9045                 }
9046               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9047               imm_expr.X_op = O_absent;
9048               s = expr_end;
9049               continue;
9050
9051             case 'J':           /* 19-bit wait code.  */
9052               my_getExpression (&imm_expr, s);
9053               check_absolute_expr (ip, &imm_expr);
9054               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9055                 {
9056                   as_warn (_("Illegal 19-bit code (%lu)"),
9057                            (unsigned long) imm_expr.X_add_number);
9058                   imm_expr.X_add_number &= OP_MASK_CODE19;
9059                 }
9060               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9061               imm_expr.X_op = O_absent;
9062               s = expr_end;
9063               continue;
9064
9065             case 'P':           /* Performance register.  */
9066               my_getExpression (&imm_expr, s);
9067               check_absolute_expr (ip, &imm_expr);
9068               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9069                 as_warn (_("Invalid performance register (%lu)"),
9070                          (unsigned long) imm_expr.X_add_number);
9071               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9072               imm_expr.X_op = O_absent;
9073               s = expr_end;
9074               continue;
9075
9076             case 'G':           /* Coprocessor destination register.  */
9077               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9078                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9079               else
9080                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9081               INSERT_OPERAND (RD, *ip, regno);
9082               if (ok) 
9083                 {
9084                   lastregno = regno;
9085                   continue;
9086                 }
9087               else
9088                 break;
9089
9090             case 'b':           /* base register */
9091             case 'd':           /* destination register */
9092             case 's':           /* source register */
9093             case 't':           /* target register */
9094             case 'r':           /* both target and source */
9095             case 'v':           /* both dest and source */
9096             case 'w':           /* both dest and target */
9097             case 'E':           /* coprocessor target register */
9098             case 'K':           /* 'rdhwr' destination register */
9099             case 'x':           /* ignore register name */
9100             case 'z':           /* must be zero register */
9101             case 'U':           /* destination register (clo/clz).  */
9102             case 'g':           /* coprocessor destination register */
9103               s_reset = s;            
9104               if (*args == 'E' || *args == 'K')
9105                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9106               else
9107                 {
9108                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9109                   if (regno == AT && mips_opts.at)
9110                     {
9111                       if (mips_opts.at == ATREG)
9112                         as_warn (_("used $at without \".set noat\""));
9113                       else
9114                         as_warn (_("used $%u with \".set at=$%u\""),
9115                                  regno, mips_opts.at);
9116                     }
9117                 }
9118               if (ok)
9119                 {
9120                   c = *args;
9121                   if (*s == ' ')
9122                     ++s;
9123                   if (args[1] != *s)
9124                     {
9125                       if (c == 'r' || c == 'v' || c == 'w')
9126                         {
9127                           regno = lastregno;
9128                           s = s_reset;
9129                           ++args;
9130                         }
9131                     }
9132                   /* 'z' only matches $0.  */
9133                   if (c == 'z' && regno != 0)
9134                     break;
9135
9136                   if (c == 's' && !strcmp (ip->insn_mo->name, "jalr"))
9137                     {
9138                       if (regno == lastregno)
9139                         {
9140                           insn_error = _("source and destinationations must be different");
9141                           continue;
9142                         }
9143                       if (regno == 31 && lastregno == 0)
9144                         {
9145                           insn_error = _("a destination register must be supplied");
9146                           continue;
9147                         }
9148                     }
9149         /* Now that we have assembled one operand, we use the args string
9150          * to figure out where it goes in the instruction.  */
9151                   switch (c)
9152                     {
9153                     case 'r':
9154                     case 's':
9155                     case 'v':
9156                     case 'b':
9157                       INSERT_OPERAND (RS, *ip, regno);
9158                       break;
9159                     case 'd':
9160                     case 'G':
9161                     case 'K':
9162                     case 'g':
9163                       INSERT_OPERAND (RD, *ip, regno);
9164                       break;
9165                     case 'U':
9166                       INSERT_OPERAND (RD, *ip, regno);
9167                       INSERT_OPERAND (RT, *ip, regno);
9168                       break;
9169                     case 'w':
9170                     case 't':
9171                     case 'E':
9172                       INSERT_OPERAND (RT, *ip, regno);
9173                       break;
9174                     case 'x':
9175                       /* This case exists because on the r3000 trunc
9176                          expands into a macro which requires a gp
9177                          register.  On the r6000 or r4000 it is
9178                          assembled into a single instruction which
9179                          ignores the register.  Thus the insn version
9180                          is MIPS_ISA2 and uses 'x', and the macro
9181                          version is MIPS_ISA1 and uses 't'.  */
9182                       break;
9183                     case 'z':
9184                       /* This case is for the div instruction, which
9185                          acts differently if the destination argument
9186                          is $0.  This only matches $0, and is checked
9187                          outside the switch.  */
9188                       break;
9189                     case 'D':
9190                       /* Itbl operand; not yet implemented. FIXME ?? */
9191                       break;
9192                       /* What about all other operands like 'i', which
9193                          can be specified in the opcode table? */
9194                     }
9195                   lastregno = regno;
9196                   continue;
9197                 }
9198               switch (*args++)
9199                 {
9200                 case 'r':
9201                 case 'v':
9202                   INSERT_OPERAND (RS, *ip, lastregno);
9203                   continue;
9204                 case 'w':
9205                   INSERT_OPERAND (RT, *ip, lastregno);
9206                   continue;
9207                 }
9208               break;
9209
9210             case 'O':           /* MDMX alignment immediate constant.  */
9211               my_getExpression (&imm_expr, s);
9212               check_absolute_expr (ip, &imm_expr);
9213               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9214                 as_warn ("Improper align amount (%ld), using low bits",
9215                          (long) imm_expr.X_add_number);
9216               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9217               imm_expr.X_op = O_absent;
9218               s = expr_end;
9219               continue;
9220
9221             case 'Q':           /* MDMX vector, element sel, or const.  */
9222               if (s[0] != '$')
9223                 {
9224                   /* MDMX Immediate.  */
9225                   my_getExpression (&imm_expr, s);
9226                   check_absolute_expr (ip, &imm_expr);
9227                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9228                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9229                              (long) imm_expr.X_add_number);
9230                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9231                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9232                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9233                   else
9234                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9235                   imm_expr.X_op = O_absent;
9236                   s = expr_end;
9237                   continue;
9238                 }
9239               /* Not MDMX Immediate.  Fall through.  */
9240             case 'X':           /* MDMX destination register.  */
9241             case 'Y':           /* MDMX source register.  */
9242             case 'Z':           /* MDMX target register.  */
9243               is_mdmx = 1;
9244             case 'D':           /* floating point destination register */
9245             case 'S':           /* floating point source register */
9246             case 'T':           /* floating point target register */
9247             case 'R':           /* floating point source register */
9248             case 'V':
9249             case 'W':
9250               rtype = RTYPE_FPU;
9251               if (is_mdmx
9252                   || (mips_opts.ase_mdmx
9253                       && (ip->insn_mo->pinfo & FP_D)
9254                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9255                                                 | INSN_COPROC_MEMORY_DELAY
9256                                                 | INSN_LOAD_COPROC_DELAY
9257                                                 | INSN_LOAD_MEMORY_DELAY
9258                                                 | INSN_STORE_MEMORY))))
9259                 rtype |= RTYPE_VEC;
9260               s_reset = s;
9261               if (reg_lookup (&s, rtype, &regno))
9262                 {
9263                   if ((regno & 1) != 0
9264                       && HAVE_32BIT_FPRS
9265                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9266                     as_warn (_("Float register should be even, was %d"),
9267                              regno);
9268
9269                   c = *args;
9270                   if (*s == ' ')
9271                     ++s;
9272                   if (args[1] != *s)
9273                     {
9274                       if (c == 'V' || c == 'W')
9275                         {
9276                           regno = lastregno;
9277                           s = s_reset;
9278                           ++args;
9279                         }
9280                     }
9281                   switch (c)
9282                     {
9283                     case 'D':
9284                     case 'X':
9285                       INSERT_OPERAND (FD, *ip, regno);
9286                       break;
9287                     case 'V':
9288                     case 'S':
9289                     case 'Y':
9290                       INSERT_OPERAND (FS, *ip, regno);
9291                       break;
9292                     case 'Q':
9293                       /* This is like 'Z', but also needs to fix the MDMX
9294                          vector/scalar select bits.  Note that the
9295                          scalar immediate case is handled above.  */
9296                       if (*s == '[')
9297                         {
9298                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9299                           int max_el = (is_qh ? 3 : 7);
9300                           s++;
9301                           my_getExpression(&imm_expr, s);
9302                           check_absolute_expr (ip, &imm_expr);
9303                           s = expr_end;
9304                           if (imm_expr.X_add_number > max_el)
9305                             as_bad(_("Bad element selector %ld"),
9306                                    (long) imm_expr.X_add_number);
9307                           imm_expr.X_add_number &= max_el;
9308                           ip->insn_opcode |= (imm_expr.X_add_number
9309                                               << (OP_SH_VSEL +
9310                                                   (is_qh ? 2 : 1)));
9311                           imm_expr.X_op = O_absent;
9312                           if (*s != ']')
9313                             as_warn(_("Expecting ']' found '%s'"), s);
9314                           else
9315                             s++;
9316                         }
9317                       else
9318                         {
9319                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9320                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9321                                                 << OP_SH_VSEL);
9322                           else
9323                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9324                                                 OP_SH_VSEL);
9325                         }
9326                       /* Fall through */
9327                     case 'W':
9328                     case 'T':
9329                     case 'Z':
9330                       INSERT_OPERAND (FT, *ip, regno);
9331                       break;
9332                     case 'R':
9333                       INSERT_OPERAND (FR, *ip, regno);
9334                       break;
9335                     }
9336                   lastregno = regno;
9337                   continue;
9338                 }
9339
9340               switch (*args++)
9341                 {
9342                 case 'V':
9343                   INSERT_OPERAND (FS, *ip, lastregno);
9344                   continue;
9345                 case 'W':
9346                   INSERT_OPERAND (FT, *ip, lastregno);
9347                   continue;
9348                 }
9349               break;
9350
9351             case 'I':
9352               my_getExpression (&imm_expr, s);
9353               if (imm_expr.X_op != O_big
9354                   && imm_expr.X_op != O_constant)
9355                 insn_error = _("absolute expression required");
9356               if (HAVE_32BIT_GPRS)
9357                 normalize_constant_expr (&imm_expr);
9358               s = expr_end;
9359               continue;
9360
9361             case 'A':
9362               my_getExpression (&offset_expr, s);
9363               normalize_address_expr (&offset_expr);
9364               *imm_reloc = BFD_RELOC_32;
9365               s = expr_end;
9366               continue;
9367
9368             case 'F':
9369             case 'L':
9370             case 'f':
9371             case 'l':
9372               {
9373                 int f64;
9374                 int using_gprs;
9375                 char *save_in;
9376                 char *err;
9377                 unsigned char temp[8];
9378                 int len;
9379                 unsigned int length;
9380                 segT seg;
9381                 subsegT subseg;
9382                 char *p;
9383
9384                 /* These only appear as the last operand in an
9385                    instruction, and every instruction that accepts
9386                    them in any variant accepts them in all variants.
9387                    This means we don't have to worry about backing out
9388                    any changes if the instruction does not match.
9389
9390                    The difference between them is the size of the
9391                    floating point constant and where it goes.  For 'F'
9392                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9393                    is 32 bits.  Where the constant is placed is based
9394                    on how the MIPS assembler does things:
9395                     F -- .rdata
9396                     L -- .lit8
9397                     f -- immediate value
9398                     l -- .lit4
9399
9400                     The .lit4 and .lit8 sections are only used if
9401                     permitted by the -G argument.
9402
9403                     The code below needs to know whether the target register
9404                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9405                     'F' are used with GPR-based instructions and 'l' and
9406                     'L' are used with FPR-based instructions.  */
9407
9408                 f64 = *args == 'F' || *args == 'L';
9409                 using_gprs = *args == 'F' || *args == 'f';
9410
9411                 save_in = input_line_pointer;
9412                 input_line_pointer = s;
9413                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9414                 length = len;
9415                 s = input_line_pointer;
9416                 input_line_pointer = save_in;
9417                 if (err != NULL && *err != '\0')
9418                   {
9419                     as_bad (_("Bad floating point constant: %s"), err);
9420                     memset (temp, '\0', sizeof temp);
9421                     length = f64 ? 8 : 4;
9422                   }
9423
9424                 assert (length == (unsigned) (f64 ? 8 : 4));
9425
9426                 if (*args == 'f'
9427                     || (*args == 'l'
9428                         && (g_switch_value < 4
9429                             || (temp[0] == 0 && temp[1] == 0)
9430                             || (temp[2] == 0 && temp[3] == 0))))
9431                   {
9432                     imm_expr.X_op = O_constant;
9433                     if (! target_big_endian)
9434                       imm_expr.X_add_number = bfd_getl32 (temp);
9435                     else
9436                       imm_expr.X_add_number = bfd_getb32 (temp);
9437                   }
9438                 else if (length > 4
9439                          && ! mips_disable_float_construction
9440                          /* Constants can only be constructed in GPRs and
9441                             copied to FPRs if the GPRs are at least as wide
9442                             as the FPRs.  Force the constant into memory if
9443                             we are using 64-bit FPRs but the GPRs are only
9444                             32 bits wide.  */
9445                          && (using_gprs
9446                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9447                          && ((temp[0] == 0 && temp[1] == 0)
9448                              || (temp[2] == 0 && temp[3] == 0))
9449                          && ((temp[4] == 0 && temp[5] == 0)
9450                              || (temp[6] == 0 && temp[7] == 0)))
9451                   {
9452                     /* The value is simple enough to load with a couple of
9453                        instructions.  If using 32-bit registers, set
9454                        imm_expr to the high order 32 bits and offset_expr to
9455                        the low order 32 bits.  Otherwise, set imm_expr to
9456                        the entire 64 bit constant.  */
9457                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9458                       {
9459                         imm_expr.X_op = O_constant;
9460                         offset_expr.X_op = O_constant;
9461                         if (! target_big_endian)
9462                           {
9463                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9464                             offset_expr.X_add_number = bfd_getl32 (temp);
9465                           }
9466                         else
9467                           {
9468                             imm_expr.X_add_number = bfd_getb32 (temp);
9469                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9470                           }
9471                         if (offset_expr.X_add_number == 0)
9472                           offset_expr.X_op = O_absent;
9473                       }
9474                     else if (sizeof (imm_expr.X_add_number) > 4)
9475                       {
9476                         imm_expr.X_op = O_constant;
9477                         if (! target_big_endian)
9478                           imm_expr.X_add_number = bfd_getl64 (temp);
9479                         else
9480                           imm_expr.X_add_number = bfd_getb64 (temp);
9481                       }
9482                     else
9483                       {
9484                         imm_expr.X_op = O_big;
9485                         imm_expr.X_add_number = 4;
9486                         if (! target_big_endian)
9487                           {
9488                             generic_bignum[0] = bfd_getl16 (temp);
9489                             generic_bignum[1] = bfd_getl16 (temp + 2);
9490                             generic_bignum[2] = bfd_getl16 (temp + 4);
9491                             generic_bignum[3] = bfd_getl16 (temp + 6);
9492                           }
9493                         else
9494                           {
9495                             generic_bignum[0] = bfd_getb16 (temp + 6);
9496                             generic_bignum[1] = bfd_getb16 (temp + 4);
9497                             generic_bignum[2] = bfd_getb16 (temp + 2);
9498                             generic_bignum[3] = bfd_getb16 (temp);
9499                           }
9500                       }
9501                   }
9502                 else
9503                   {
9504                     const char *newname;
9505                     segT new_seg;
9506
9507                     /* Switch to the right section.  */
9508                     seg = now_seg;
9509                     subseg = now_subseg;
9510                     switch (*args)
9511                       {
9512                       default: /* unused default case avoids warnings.  */
9513                       case 'L':
9514                         newname = RDATA_SECTION_NAME;
9515                         if (g_switch_value >= 8)
9516                           newname = ".lit8";
9517                         break;
9518                       case 'F':
9519                         newname = RDATA_SECTION_NAME;
9520                         break;
9521                       case 'l':
9522                         assert (g_switch_value >= 4);
9523                         newname = ".lit4";
9524                         break;
9525                       }
9526                     new_seg = subseg_new (newname, (subsegT) 0);
9527                     if (IS_ELF)
9528                       bfd_set_section_flags (stdoutput, new_seg,
9529                                              (SEC_ALLOC
9530                                               | SEC_LOAD
9531                                               | SEC_READONLY
9532                                               | SEC_DATA));
9533                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9534                     if (IS_ELF && strcmp (TARGET_OS, "elf") != 0)
9535                       record_alignment (new_seg, 4);
9536                     else
9537                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9538                     if (seg == now_seg)
9539                       as_bad (_("Can't use floating point insn in this section"));
9540
9541                     /* Set the argument to the current address in the
9542                        section.  */
9543                     offset_expr.X_op = O_symbol;
9544                     offset_expr.X_add_symbol =
9545                       symbol_new ("L0\001", now_seg,
9546                                   (valueT) frag_now_fix (), frag_now);
9547                     offset_expr.X_add_number = 0;
9548
9549                     /* Put the floating point number into the section.  */
9550                     p = frag_more ((int) length);
9551                     memcpy (p, temp, length);
9552
9553                     /* Switch back to the original section.  */
9554                     subseg_set (seg, subseg);
9555                   }
9556               }
9557               continue;
9558
9559             case 'i':           /* 16 bit unsigned immediate */
9560             case 'j':           /* 16 bit signed immediate */
9561               *imm_reloc = BFD_RELOC_LO16;
9562               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9563                 {
9564                   int more;
9565                   offsetT minval, maxval;
9566
9567                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9568                           && strcmp (insn->name, insn[1].name) == 0);
9569
9570                   /* If the expression was written as an unsigned number,
9571                      only treat it as signed if there are no more
9572                      alternatives.  */
9573                   if (more
9574                       && *args == 'j'
9575                       && sizeof (imm_expr.X_add_number) <= 4
9576                       && imm_expr.X_op == O_constant
9577                       && imm_expr.X_add_number < 0
9578                       && imm_expr.X_unsigned
9579                       && HAVE_64BIT_GPRS)
9580                     break;
9581
9582                   /* For compatibility with older assemblers, we accept
9583                      0x8000-0xffff as signed 16-bit numbers when only
9584                      signed numbers are allowed.  */
9585                   if (*args == 'i')
9586                     minval = 0, maxval = 0xffff;
9587                   else if (more)
9588                     minval = -0x8000, maxval = 0x7fff;
9589                   else
9590                     minval = -0x8000, maxval = 0xffff;
9591
9592                   if (imm_expr.X_op != O_constant
9593                       || imm_expr.X_add_number < minval
9594                       || imm_expr.X_add_number > maxval)
9595                     {
9596                       if (more)
9597                         break;
9598                       if (imm_expr.X_op == O_constant
9599                           || imm_expr.X_op == O_big)
9600                         as_bad (_("expression out of range"));
9601                     }
9602                 }
9603               s = expr_end;
9604               continue;
9605
9606             case 'o':           /* 16 bit offset */
9607               /* Check whether there is only a single bracketed expression
9608                  left.  If so, it must be the base register and the
9609                  constant must be zero.  */
9610               if (*s == '(' && strchr (s + 1, '(') == 0)
9611                 {
9612                   offset_expr.X_op = O_constant;
9613                   offset_expr.X_add_number = 0;
9614                   continue;
9615                 }
9616
9617               /* If this value won't fit into a 16 bit offset, then go
9618                  find a macro that will generate the 32 bit offset
9619                  code pattern.  */
9620               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9621                   && (offset_expr.X_op != O_constant
9622                       || offset_expr.X_add_number >= 0x8000
9623                       || offset_expr.X_add_number < -0x8000))
9624                 break;
9625
9626               s = expr_end;
9627               continue;
9628
9629             case 'p':           /* pc relative offset */
9630               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9631               my_getExpression (&offset_expr, s);
9632               s = expr_end;
9633               continue;
9634
9635             case 'u':           /* upper 16 bits */
9636               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9637                   && imm_expr.X_op == O_constant
9638                   && (imm_expr.X_add_number < 0
9639                       || imm_expr.X_add_number >= 0x10000))
9640                 as_bad (_("lui expression not in range 0..65535"));
9641               s = expr_end;
9642               continue;
9643
9644             case 'a':           /* 26 bit address */
9645               my_getExpression (&offset_expr, s);
9646               s = expr_end;
9647               *offset_reloc = BFD_RELOC_MIPS_JMP;
9648               continue;
9649
9650             case 'N':           /* 3 bit branch condition code */
9651             case 'M':           /* 3 bit compare condition code */
9652               rtype = RTYPE_CCC;
9653               if (ip->insn_mo->pinfo & (FP_D| FP_S))
9654                 rtype |= RTYPE_FCC;
9655               if (!reg_lookup (&s, rtype, &regno))
9656                 break;
9657               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9658                    || strcmp(str + strlen(str) - 5, "any2f") == 0
9659                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
9660                   && (regno & 1) != 0)
9661                 as_warn(_("Condition code register should be even for %s, was %d"),
9662                         str, regno);
9663               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9664                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
9665                   && (regno & 3) != 0)
9666                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9667                         str, regno);
9668               if (*args == 'N')
9669                 INSERT_OPERAND (BCC, *ip, regno);
9670               else
9671                 INSERT_OPERAND (CCC, *ip, regno);
9672               continue;
9673
9674             case 'H':
9675               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9676                 s += 2;
9677               if (ISDIGIT (*s))
9678                 {
9679                   c = 0;
9680                   do
9681                     {
9682                       c *= 10;
9683                       c += *s - '0';
9684                       ++s;
9685                     }
9686                   while (ISDIGIT (*s));
9687                 }
9688               else
9689                 c = 8; /* Invalid sel value.  */
9690
9691               if (c > 7)
9692                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9693               ip->insn_opcode |= c;
9694               continue;
9695
9696             case 'e':
9697               /* Must be at least one digit.  */
9698               my_getExpression (&imm_expr, s);
9699               check_absolute_expr (ip, &imm_expr);
9700
9701               if ((unsigned long) imm_expr.X_add_number
9702                   > (unsigned long) OP_MASK_VECBYTE)
9703                 {
9704                   as_bad (_("bad byte vector index (%ld)"),
9705                            (long) imm_expr.X_add_number);
9706                   imm_expr.X_add_number = 0;
9707                 }
9708
9709               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9710               imm_expr.X_op = O_absent;
9711               s = expr_end;
9712               continue;
9713
9714             case '%':
9715               my_getExpression (&imm_expr, s);
9716               check_absolute_expr (ip, &imm_expr);
9717
9718               if ((unsigned long) imm_expr.X_add_number
9719                   > (unsigned long) OP_MASK_VECALIGN)
9720                 {
9721                   as_bad (_("bad byte vector index (%ld)"),
9722                            (long) imm_expr.X_add_number);
9723                   imm_expr.X_add_number = 0;
9724                 }
9725
9726               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9727               imm_expr.X_op = O_absent;
9728               s = expr_end;
9729               continue;
9730
9731             default:
9732               as_bad (_("bad char = '%c'\n"), *args);
9733               internalError ();
9734             }
9735           break;
9736         }
9737       /* Args don't match.  */
9738       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9739           !strcmp (insn->name, insn[1].name))
9740         {
9741           ++insn;
9742           s = argsStart;
9743           insn_error = _("illegal operands");
9744           continue;
9745         }
9746       if (save_c)
9747         *(--s) = save_c;
9748       insn_error = _("illegal operands");
9749       return;
9750     }
9751 }
9752
9753 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9754
9755 /* This routine assembles an instruction into its binary format when
9756    assembling for the mips16.  As a side effect, it sets one of the
9757    global variables imm_reloc or offset_reloc to the type of
9758    relocation to do if one of the operands is an address expression.
9759    It also sets mips16_small and mips16_ext if the user explicitly
9760    requested a small or extended instruction.  */
9761
9762 static void
9763 mips16_ip (char *str, struct mips_cl_insn *ip)
9764 {
9765   char *s;
9766   const char *args;
9767   struct mips_opcode *insn;
9768   char *argsstart;
9769   unsigned int regno;
9770   unsigned int lastregno = 0;
9771   char *s_reset;
9772   size_t i;
9773
9774   insn_error = NULL;
9775
9776   mips16_small = FALSE;
9777   mips16_ext = FALSE;
9778
9779   for (s = str; ISLOWER (*s); ++s)
9780     ;
9781   switch (*s)
9782     {
9783     case '\0':
9784       break;
9785
9786     case ' ':
9787       *s++ = '\0';
9788       break;
9789
9790     case '.':
9791       if (s[1] == 't' && s[2] == ' ')
9792         {
9793           *s = '\0';
9794           mips16_small = TRUE;
9795           s += 3;
9796           break;
9797         }
9798       else if (s[1] == 'e' && s[2] == ' ')
9799         {
9800           *s = '\0';
9801           mips16_ext = TRUE;
9802           s += 3;
9803           break;
9804         }
9805       /* Fall through.  */
9806     default:
9807       insn_error = _("unknown opcode");
9808       return;
9809     }
9810
9811   if (mips_opts.noautoextend && ! mips16_ext)
9812     mips16_small = TRUE;
9813
9814   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9815     {
9816       insn_error = _("unrecognized opcode");
9817       return;
9818     }
9819
9820   argsstart = s;
9821   for (;;)
9822     {
9823       bfd_boolean ok;
9824
9825       assert (strcmp (insn->name, str) == 0);
9826
9827       if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
9828         ok = TRUE;
9829       else
9830         ok = FALSE;
9831
9832       if (! ok)
9833         {
9834           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
9835               && strcmp (insn->name, insn[1].name) == 0)
9836             {
9837               ++insn;
9838               continue;
9839             }
9840           else
9841             {
9842               if (!insn_error)
9843                 {
9844                   static char buf[100];
9845                   sprintf (buf,
9846                            _("opcode not supported on this processor: %s (%s)"),
9847                            mips_cpu_info_from_arch (mips_opts.arch)->name,
9848                            mips_cpu_info_from_isa (mips_opts.isa)->name);
9849                   insn_error = buf;
9850                 }
9851               return;
9852             }
9853         }
9854
9855       create_insn (ip, insn);
9856       imm_expr.X_op = O_absent;
9857       imm_reloc[0] = BFD_RELOC_UNUSED;
9858       imm_reloc[1] = BFD_RELOC_UNUSED;
9859       imm_reloc[2] = BFD_RELOC_UNUSED;
9860       imm2_expr.X_op = O_absent;
9861       offset_expr.X_op = O_absent;
9862       offset_reloc[0] = BFD_RELOC_UNUSED;
9863       offset_reloc[1] = BFD_RELOC_UNUSED;
9864       offset_reloc[2] = BFD_RELOC_UNUSED;
9865       for (args = insn->args; 1; ++args)
9866         {
9867           int c;
9868
9869           if (*s == ' ')
9870             ++s;
9871
9872           /* In this switch statement we call break if we did not find
9873              a match, continue if we did find a match, or return if we
9874              are done.  */
9875
9876           c = *args;
9877           switch (c)
9878             {
9879             case '\0':
9880               if (*s == '\0')
9881                 {
9882                   /* Stuff the immediate value in now, if we can.  */
9883                   if (imm_expr.X_op == O_constant
9884                       && *imm_reloc > BFD_RELOC_UNUSED
9885                       && insn->pinfo != INSN_MACRO)
9886                     {
9887                       valueT tmp;
9888
9889                       switch (*offset_reloc)
9890                         {
9891                           case BFD_RELOC_MIPS16_HI16_S:
9892                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9893                             break;
9894
9895                           case BFD_RELOC_MIPS16_HI16:
9896                             tmp = imm_expr.X_add_number >> 16;
9897                             break;
9898
9899                           case BFD_RELOC_MIPS16_LO16:
9900                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9901                                   - 0x8000;
9902                             break;
9903
9904                           case BFD_RELOC_UNUSED:
9905                             tmp = imm_expr.X_add_number;
9906                             break;
9907
9908                           default:
9909                             internalError ();
9910                         }
9911                       *offset_reloc = BFD_RELOC_UNUSED;
9912
9913                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9914                                     tmp, TRUE, mips16_small,
9915                                     mips16_ext, &ip->insn_opcode,
9916                                     &ip->use_extend, &ip->extend);
9917                       imm_expr.X_op = O_absent;
9918                       *imm_reloc = BFD_RELOC_UNUSED;
9919                     }
9920
9921                   return;
9922                 }
9923               break;
9924
9925             case ',':
9926               if (*s++ == c)
9927                 continue;
9928               s--;
9929               switch (*++args)
9930                 {
9931                 case 'v':
9932                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9933                   continue;
9934                 case 'w':
9935                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9936                   continue;
9937                 }
9938               break;
9939
9940             case '(':
9941             case ')':
9942               if (*s++ == c)
9943                 continue;
9944               break;
9945
9946             case 'v':
9947             case 'w':
9948               if (s[0] != '$')
9949                 {
9950                   if (c == 'v')
9951                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9952                   else
9953                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9954                   ++args;
9955                   continue;
9956                 }
9957               /* Fall through.  */
9958             case 'x':
9959             case 'y':
9960             case 'z':
9961             case 'Z':
9962             case '0':
9963             case 'S':
9964             case 'R':
9965             case 'X':
9966             case 'Y':
9967               s_reset = s;
9968               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9969                 {
9970                   if (c == 'v' || c == 'w')
9971                     {
9972                       if (c == 'v')
9973                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9974                       else
9975                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9976                       ++args;
9977                       continue;
9978                     }
9979                   break;
9980                 }
9981
9982               if (*s == ' ')
9983                 ++s;
9984               if (args[1] != *s)
9985                 {
9986                   if (c == 'v' || c == 'w')
9987                     {
9988                       regno = mips16_to_32_reg_map[lastregno];
9989                       s = s_reset;
9990                       ++args;
9991                     }
9992                 }
9993
9994               switch (c)
9995                 {
9996                 case 'x':
9997                 case 'y':
9998                 case 'z':
9999                 case 'v':
10000                 case 'w':
10001                 case 'Z':
10002                   regno = mips32_to_16_reg_map[regno];
10003                   break;
10004
10005                 case '0':
10006                   if (regno != 0)
10007                     regno = ILLEGAL_REG;
10008                   break;
10009
10010                 case 'S':
10011                   if (regno != SP)
10012                     regno = ILLEGAL_REG;
10013                   break;
10014
10015                 case 'R':
10016                   if (regno != RA)
10017                     regno = ILLEGAL_REG;
10018                   break;
10019
10020                 case 'X':
10021                 case 'Y':
10022                   if (regno == AT && mips_opts.at)
10023                     {
10024                       if (mips_opts.at == ATREG)
10025                         as_warn (_("used $at without \".set noat\""));
10026                       else
10027                         as_warn (_("used $%u with \".set at=$%u\""),
10028                                  regno, mips_opts.at);
10029                     }
10030                   break;
10031
10032                 default:
10033                   internalError ();
10034                 }
10035
10036               if (regno == ILLEGAL_REG)
10037                 break;
10038
10039               switch (c)
10040                 {
10041                 case 'x':
10042                 case 'v':
10043                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10044                   break;
10045                 case 'y':
10046                 case 'w':
10047                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10048                   break;
10049                 case 'z':
10050                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10051                   break;
10052                 case 'Z':
10053                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10054                 case '0':
10055                 case 'S':
10056                 case 'R':
10057                   break;
10058                 case 'X':
10059                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10060                   break;
10061                 case 'Y':
10062                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10063                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10064                   break;
10065                 default:
10066                   internalError ();
10067                 }
10068
10069               lastregno = regno;
10070               continue;
10071
10072             case 'P':
10073               if (strncmp (s, "$pc", 3) == 0)
10074                 {
10075                   s += 3;
10076                   continue;
10077                 }
10078               break;
10079
10080             case '5':
10081             case 'H':
10082             case 'W':
10083             case 'D':
10084             case 'j':
10085             case 'V':
10086             case 'C':
10087             case 'U':
10088             case 'k':
10089             case 'K':
10090               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10091               if (i > 0)
10092                 {
10093                   if (imm_expr.X_op != O_constant)
10094                     {
10095                       mips16_ext = TRUE;
10096                       ip->use_extend = TRUE;
10097                       ip->extend = 0;
10098                     }
10099                   else
10100                     {
10101                       /* We need to relax this instruction.  */
10102                       *offset_reloc = *imm_reloc;
10103                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10104                     }
10105                   s = expr_end;
10106                   continue;
10107                 }
10108               *imm_reloc = BFD_RELOC_UNUSED;
10109               /* Fall through.  */
10110             case '<':
10111             case '>':
10112             case '[':
10113             case ']':
10114             case '4':
10115             case '8':
10116               my_getExpression (&imm_expr, s);
10117               if (imm_expr.X_op == O_register)
10118                 {
10119                   /* What we thought was an expression turned out to
10120                      be a register.  */
10121
10122                   if (s[0] == '(' && args[1] == '(')
10123                     {
10124                       /* It looks like the expression was omitted
10125                          before a register indirection, which means
10126                          that the expression is implicitly zero.  We
10127                          still set up imm_expr, so that we handle
10128                          explicit extensions correctly.  */
10129                       imm_expr.X_op = O_constant;
10130                       imm_expr.X_add_number = 0;
10131                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10132                       continue;
10133                     }
10134
10135                   break;
10136                 }
10137
10138               /* We need to relax this instruction.  */
10139               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10140               s = expr_end;
10141               continue;
10142
10143             case 'p':
10144             case 'q':
10145             case 'A':
10146             case 'B':
10147             case 'E':
10148               /* We use offset_reloc rather than imm_reloc for the PC
10149                  relative operands.  This lets macros with both
10150                  immediate and address operands work correctly.  */
10151               my_getExpression (&offset_expr, s);
10152
10153               if (offset_expr.X_op == O_register)
10154                 break;
10155
10156               /* We need to relax this instruction.  */
10157               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10158               s = expr_end;
10159               continue;
10160
10161             case '6':           /* break code */
10162               my_getExpression (&imm_expr, s);
10163               check_absolute_expr (ip, &imm_expr);
10164               if ((unsigned long) imm_expr.X_add_number > 63)
10165                 as_warn (_("Invalid value for `%s' (%lu)"),
10166                          ip->insn_mo->name,
10167                          (unsigned long) imm_expr.X_add_number);
10168               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10169               imm_expr.X_op = O_absent;
10170               s = expr_end;
10171               continue;
10172
10173             case 'a':           /* 26 bit address */
10174               my_getExpression (&offset_expr, s);
10175               s = expr_end;
10176               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10177               ip->insn_opcode <<= 16;
10178               continue;
10179
10180             case 'l':           /* register list for entry macro */
10181             case 'L':           /* register list for exit macro */
10182               {
10183                 int mask;
10184
10185                 if (c == 'l')
10186                   mask = 0;
10187                 else
10188                   mask = 7 << 3;
10189                 while (*s != '\0')
10190                   {
10191                     unsigned int freg, reg1, reg2;
10192
10193                     while (*s == ' ' || *s == ',')
10194                       ++s;
10195                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10196                       freg = 0;
10197                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10198                       freg = 1;
10199                     else
10200                       {
10201                         as_bad (_("can't parse register list"));
10202                         break;
10203                       }
10204                     if (*s == ' ')
10205                       ++s;
10206                     if (*s != '-')
10207                       reg2 = reg1;
10208                     else
10209                       {
10210                         ++s;
10211                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10212                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10213                           {
10214                             as_bad (_("invalid register list"));
10215                             break;
10216                           }
10217                       }
10218                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10219                       {
10220                         mask &= ~ (7 << 3);
10221                         mask |= 5 << 3;
10222                       }
10223                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10224                       {
10225                         mask &= ~ (7 << 3);
10226                         mask |= 6 << 3;
10227                       }
10228                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10229                       mask |= (reg2 - 3) << 3;
10230                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10231                       mask |= (reg2 - 15) << 1;
10232                     else if (reg1 == RA && reg2 == RA)
10233                       mask |= 1;
10234                     else
10235                       {
10236                         as_bad (_("invalid register list"));
10237                         break;
10238                       }
10239                   }
10240                 /* The mask is filled in in the opcode table for the
10241                    benefit of the disassembler.  We remove it before
10242                    applying the actual mask.  */
10243                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10244                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10245               }
10246             continue;
10247
10248             case 'm':           /* Register list for save insn.  */
10249             case 'M':           /* Register list for restore insn.  */
10250               {
10251                 int opcode = 0;
10252                 int framesz = 0, seen_framesz = 0;
10253                 int args = 0, statics = 0, sregs = 0;
10254
10255                 while (*s != '\0')
10256                   {
10257                     unsigned int reg1, reg2;
10258
10259                     SKIP_SPACE_TABS (s);
10260                     while (*s == ',')
10261                       ++s;
10262                     SKIP_SPACE_TABS (s);
10263
10264                     my_getExpression (&imm_expr, s);
10265                     if (imm_expr.X_op == O_constant)
10266                       {
10267                         /* Handle the frame size.  */
10268                         if (seen_framesz)
10269                           {
10270                             as_bad (_("more than one frame size in list"));
10271                             break;
10272                           }
10273                         seen_framesz = 1;
10274                         framesz = imm_expr.X_add_number;
10275                         imm_expr.X_op = O_absent;
10276                         s = expr_end;
10277                         continue;
10278                       }
10279
10280                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10281                       {
10282                         as_bad (_("can't parse register list"));
10283                         break;
10284                       }
10285
10286                     while (*s == ' ')
10287                       ++s;
10288
10289                     if (*s != '-')
10290                       reg2 = reg1;
10291                     else
10292                       {
10293                         ++s;
10294                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10295                             || reg2 < reg1)
10296                           {
10297                             as_bad (_("can't parse register list"));
10298                             break;
10299                           }
10300                       }
10301
10302                     while (reg1 <= reg2)
10303                       {
10304                         if (reg1 >= 4 && reg1 <= 7)
10305                           {
10306                             if (!seen_framesz)
10307                                 /* args $a0-$a3 */
10308                                 args |= 1 << (reg1 - 4);
10309                             else
10310                                 /* statics $a0-$a3 */
10311                                 statics |= 1 << (reg1 - 4);
10312                           }
10313                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10314                           {
10315                             /* $s0-$s8 */
10316                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10317                           }
10318                         else if (reg1 == 31)
10319                           {
10320                             /* Add $ra to insn.  */
10321                             opcode |= 0x40;
10322                           }
10323                         else
10324                           {
10325                             as_bad (_("unexpected register in list"));
10326                             break;
10327                           }
10328                         if (++reg1 == 24)
10329                           reg1 = 30;
10330                       }
10331                   }
10332
10333                 /* Encode args/statics combination.  */
10334                 if (args & statics)
10335                   as_bad (_("arg/static registers overlap"));
10336                 else if (args == 0xf)
10337                   /* All $a0-$a3 are args.  */
10338                   opcode |= MIPS16_ALL_ARGS << 16;
10339                 else if (statics == 0xf)
10340                   /* All $a0-$a3 are statics.  */
10341                   opcode |= MIPS16_ALL_STATICS << 16;
10342                 else 
10343                   {
10344                     int narg = 0, nstat = 0;
10345
10346                     /* Count arg registers.  */
10347                     while (args & 0x1)
10348                       {
10349                         args >>= 1;
10350                         narg++;
10351                       }
10352                     if (args != 0)
10353                       as_bad (_("invalid arg register list"));
10354
10355                     /* Count static registers.  */
10356                     while (statics & 0x8)
10357                       {
10358                         statics = (statics << 1) & 0xf;
10359                         nstat++;
10360                       }
10361                     if (statics != 0) 
10362                       as_bad (_("invalid static register list"));
10363
10364                     /* Encode args/statics.  */
10365                     opcode |= ((narg << 2) | nstat) << 16;
10366                   }
10367
10368                 /* Encode $s0/$s1.  */
10369                 if (sregs & (1 << 0))           /* $s0 */
10370                   opcode |= 0x20;
10371                 if (sregs & (1 << 1))           /* $s1 */
10372                   opcode |= 0x10;
10373                 sregs >>= 2;
10374
10375                 if (sregs != 0)
10376                   {
10377                     /* Count regs $s2-$s8.  */
10378                     int nsreg = 0;
10379                     while (sregs & 1)
10380                       {
10381                         sregs >>= 1;
10382                         nsreg++;
10383                       }
10384                     if (sregs != 0)
10385                       as_bad (_("invalid static register list"));
10386                     /* Encode $s2-$s8. */
10387                     opcode |= nsreg << 24;
10388                   }
10389
10390                 /* Encode frame size.  */
10391                 if (!seen_framesz)
10392                   as_bad (_("missing frame size"));
10393                 else if ((framesz & 7) != 0 || framesz < 0
10394                          || framesz > 0xff * 8)
10395                   as_bad (_("invalid frame size"));
10396                 else if (framesz != 128 || (opcode >> 16) != 0)
10397                   {
10398                     framesz /= 8;
10399                     opcode |= (((framesz & 0xf0) << 16)
10400                              | (framesz & 0x0f));
10401                   }
10402
10403                 /* Finally build the instruction.  */
10404                 if ((opcode >> 16) != 0 || framesz == 0)
10405                   {
10406                     ip->use_extend = TRUE;
10407                     ip->extend = opcode >> 16;
10408                   }
10409                 ip->insn_opcode |= opcode & 0x7f;
10410               }
10411             continue;
10412
10413             case 'e':           /* extend code */
10414               my_getExpression (&imm_expr, s);
10415               check_absolute_expr (ip, &imm_expr);
10416               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10417                 {
10418                   as_warn (_("Invalid value for `%s' (%lu)"),
10419                            ip->insn_mo->name,
10420                            (unsigned long) imm_expr.X_add_number);
10421                   imm_expr.X_add_number &= 0x7ff;
10422                 }
10423               ip->insn_opcode |= imm_expr.X_add_number;
10424               imm_expr.X_op = O_absent;
10425               s = expr_end;
10426               continue;
10427
10428             default:
10429               internalError ();
10430             }
10431           break;
10432         }
10433
10434       /* Args don't match.  */
10435       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10436           strcmp (insn->name, insn[1].name) == 0)
10437         {
10438           ++insn;
10439           s = argsstart;
10440           continue;
10441         }
10442
10443       insn_error = _("illegal operands");
10444
10445       return;
10446     }
10447 }
10448
10449 /* This structure holds information we know about a mips16 immediate
10450    argument type.  */
10451
10452 struct mips16_immed_operand
10453 {
10454   /* The type code used in the argument string in the opcode table.  */
10455   int type;
10456   /* The number of bits in the short form of the opcode.  */
10457   int nbits;
10458   /* The number of bits in the extended form of the opcode.  */
10459   int extbits;
10460   /* The amount by which the short form is shifted when it is used;
10461      for example, the sw instruction has a shift count of 2.  */
10462   int shift;
10463   /* The amount by which the short form is shifted when it is stored
10464      into the instruction code.  */
10465   int op_shift;
10466   /* Non-zero if the short form is unsigned.  */
10467   int unsp;
10468   /* Non-zero if the extended form is unsigned.  */
10469   int extu;
10470   /* Non-zero if the value is PC relative.  */
10471   int pcrel;
10472 };
10473
10474 /* The mips16 immediate operand types.  */
10475
10476 static const struct mips16_immed_operand mips16_immed_operands[] =
10477 {
10478   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10479   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10480   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10481   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10482   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10483   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10484   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10485   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10486   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10487   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10488   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10489   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10490   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10491   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10492   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10493   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10494   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10495   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10496   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10497   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10498   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10499 };
10500
10501 #define MIPS16_NUM_IMMED \
10502   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10503
10504 /* Handle a mips16 instruction with an immediate value.  This or's the
10505    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10506    whether an extended value is needed; if one is needed, it sets
10507    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10508    If SMALL is true, an unextended opcode was explicitly requested.
10509    If EXT is true, an extended opcode was explicitly requested.  If
10510    WARN is true, warn if EXT does not match reality.  */
10511
10512 static void
10513 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10514               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10515               unsigned long *insn, bfd_boolean *use_extend,
10516               unsigned short *extend)
10517 {
10518   const struct mips16_immed_operand *op;
10519   int mintiny, maxtiny;
10520   bfd_boolean needext;
10521
10522   op = mips16_immed_operands;
10523   while (op->type != type)
10524     {
10525       ++op;
10526       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10527     }
10528
10529   if (op->unsp)
10530     {
10531       if (type == '<' || type == '>' || type == '[' || type == ']')
10532         {
10533           mintiny = 1;
10534           maxtiny = 1 << op->nbits;
10535         }
10536       else
10537         {
10538           mintiny = 0;
10539           maxtiny = (1 << op->nbits) - 1;
10540         }
10541     }
10542   else
10543     {
10544       mintiny = - (1 << (op->nbits - 1));
10545       maxtiny = (1 << (op->nbits - 1)) - 1;
10546     }
10547
10548   /* Branch offsets have an implicit 0 in the lowest bit.  */
10549   if (type == 'p' || type == 'q')
10550     val /= 2;
10551
10552   if ((val & ((1 << op->shift) - 1)) != 0
10553       || val < (mintiny << op->shift)
10554       || val > (maxtiny << op->shift))
10555     needext = TRUE;
10556   else
10557     needext = FALSE;
10558
10559   if (warn && ext && ! needext)
10560     as_warn_where (file, line,
10561                    _("extended operand requested but not required"));
10562   if (small && needext)
10563     as_bad_where (file, line, _("invalid unextended operand value"));
10564
10565   if (small || (! ext && ! needext))
10566     {
10567       int insnval;
10568
10569       *use_extend = FALSE;
10570       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10571       insnval <<= op->op_shift;
10572       *insn |= insnval;
10573     }
10574   else
10575     {
10576       long minext, maxext;
10577       int extval;
10578
10579       if (op->extu)
10580         {
10581           minext = 0;
10582           maxext = (1 << op->extbits) - 1;
10583         }
10584       else
10585         {
10586           minext = - (1 << (op->extbits - 1));
10587           maxext = (1 << (op->extbits - 1)) - 1;
10588         }
10589       if (val < minext || val > maxext)
10590         as_bad_where (file, line,
10591                       _("operand value out of range for instruction"));
10592
10593       *use_extend = TRUE;
10594       if (op->extbits == 16)
10595         {
10596           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10597           val &= 0x1f;
10598         }
10599       else if (op->extbits == 15)
10600         {
10601           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10602           val &= 0xf;
10603         }
10604       else
10605         {
10606           extval = ((val & 0x1f) << 6) | (val & 0x20);
10607           val = 0;
10608         }
10609
10610       *extend = (unsigned short) extval;
10611       *insn |= val;
10612     }
10613 }
10614 \f
10615 struct percent_op_match
10616 {
10617   const char *str;
10618   bfd_reloc_code_real_type reloc;
10619 };
10620
10621 static const struct percent_op_match mips_percent_op[] =
10622 {
10623   {"%lo", BFD_RELOC_LO16},
10624 #ifdef OBJ_ELF
10625   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10626   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10627   {"%call16", BFD_RELOC_MIPS_CALL16},
10628   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10629   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10630   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10631   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10632   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10633   {"%got", BFD_RELOC_MIPS_GOT16},
10634   {"%gp_rel", BFD_RELOC_GPREL16},
10635   {"%half", BFD_RELOC_16},
10636   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10637   {"%higher", BFD_RELOC_MIPS_HIGHER},
10638   {"%neg", BFD_RELOC_MIPS_SUB},
10639   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10640   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10641   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10642   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10643   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10644   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10645   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10646 #endif
10647   {"%hi", BFD_RELOC_HI16_S}
10648 };
10649
10650 static const struct percent_op_match mips16_percent_op[] =
10651 {
10652   {"%lo", BFD_RELOC_MIPS16_LO16},
10653   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10654   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10655 };
10656
10657
10658 /* Return true if *STR points to a relocation operator.  When returning true,
10659    move *STR over the operator and store its relocation code in *RELOC.
10660    Leave both *STR and *RELOC alone when returning false.  */
10661
10662 static bfd_boolean
10663 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10664 {
10665   const struct percent_op_match *percent_op;
10666   size_t limit, i;
10667
10668   if (mips_opts.mips16)
10669     {
10670       percent_op = mips16_percent_op;
10671       limit = ARRAY_SIZE (mips16_percent_op);
10672     }
10673   else
10674     {
10675       percent_op = mips_percent_op;
10676       limit = ARRAY_SIZE (mips_percent_op);
10677     }
10678
10679   for (i = 0; i < limit; i++)
10680     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10681       {
10682         int len = strlen (percent_op[i].str);
10683
10684         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10685           continue;
10686
10687         *str += strlen (percent_op[i].str);
10688         *reloc = percent_op[i].reloc;
10689
10690         /* Check whether the output BFD supports this relocation.
10691            If not, issue an error and fall back on something safe.  */
10692         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10693           {
10694             as_bad ("relocation %s isn't supported by the current ABI",
10695                     percent_op[i].str);
10696             *reloc = BFD_RELOC_UNUSED;
10697           }
10698         return TRUE;
10699       }
10700   return FALSE;
10701 }
10702
10703
10704 /* Parse string STR as a 16-bit relocatable operand.  Store the
10705    expression in *EP and the relocations in the array starting
10706    at RELOC.  Return the number of relocation operators used.
10707
10708    On exit, EXPR_END points to the first character after the expression.  */
10709
10710 static size_t
10711 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10712                        char *str)
10713 {
10714   bfd_reloc_code_real_type reversed_reloc[3];
10715   size_t reloc_index, i;
10716   int crux_depth, str_depth;
10717   char *crux;
10718
10719   /* Search for the start of the main expression, recoding relocations
10720      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10721      of the main expression and with CRUX_DEPTH containing the number
10722      of open brackets at that point.  */
10723   reloc_index = -1;
10724   str_depth = 0;
10725   do
10726     {
10727       reloc_index++;
10728       crux = str;
10729       crux_depth = str_depth;
10730
10731       /* Skip over whitespace and brackets, keeping count of the number
10732          of brackets.  */
10733       while (*str == ' ' || *str == '\t' || *str == '(')
10734         if (*str++ == '(')
10735           str_depth++;
10736     }
10737   while (*str == '%'
10738          && reloc_index < (HAVE_NEWABI ? 3 : 1)
10739          && parse_relocation (&str, &reversed_reloc[reloc_index]));
10740
10741   my_getExpression (ep, crux);
10742   str = expr_end;
10743
10744   /* Match every open bracket.  */
10745   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10746     if (*str++ == ')')
10747       crux_depth--;
10748
10749   if (crux_depth > 0)
10750     as_bad ("unclosed '('");
10751
10752   expr_end = str;
10753
10754   if (reloc_index != 0)
10755     {
10756       prev_reloc_op_frag = frag_now;
10757       for (i = 0; i < reloc_index; i++)
10758         reloc[i] = reversed_reloc[reloc_index - 1 - i];
10759     }
10760
10761   return reloc_index;
10762 }
10763
10764 static void
10765 my_getExpression (expressionS *ep, char *str)
10766 {
10767   char *save_in;
10768   valueT val;
10769
10770   save_in = input_line_pointer;
10771   input_line_pointer = str;
10772   expression (ep);
10773   expr_end = input_line_pointer;
10774   input_line_pointer = save_in;
10775
10776   /* If we are in mips16 mode, and this is an expression based on `.',
10777      then we bump the value of the symbol by 1 since that is how other
10778      text symbols are handled.  We don't bother to handle complex
10779      expressions, just `.' plus or minus a constant.  */
10780   if (mips_opts.mips16
10781       && ep->X_op == O_symbol
10782       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10783       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10784       && symbol_get_frag (ep->X_add_symbol) == frag_now
10785       && symbol_constant_p (ep->X_add_symbol)
10786       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10787     S_SET_VALUE (ep->X_add_symbol, val + 1);
10788 }
10789
10790 char *
10791 md_atof (int type, char *litP, int *sizeP)
10792 {
10793   return ieee_md_atof (type, litP, sizeP, target_big_endian);
10794 }
10795
10796 void
10797 md_number_to_chars (char *buf, valueT val, int n)
10798 {
10799   if (target_big_endian)
10800     number_to_chars_bigendian (buf, val, n);
10801   else
10802     number_to_chars_littleendian (buf, val, n);
10803 }
10804 \f
10805 #ifdef OBJ_ELF
10806 static int support_64bit_objects(void)
10807 {
10808   const char **list, **l;
10809   int yes;
10810
10811   list = bfd_target_list ();
10812   for (l = list; *l != NULL; l++)
10813 #ifdef TE_TMIPS
10814     /* This is traditional mips */
10815     if (strcmp (*l, "elf64-tradbigmips") == 0
10816         || strcmp (*l, "elf64-tradlittlemips") == 0)
10817 #else
10818     if (strcmp (*l, "elf64-bigmips") == 0
10819         || strcmp (*l, "elf64-littlemips") == 0)
10820 #endif
10821       break;
10822   yes = (*l != NULL);
10823   free (list);
10824   return yes;
10825 }
10826 #endif /* OBJ_ELF */
10827
10828 const char *md_shortopts = "O::g::G:";
10829
10830 struct option md_longopts[] =
10831 {
10832   /* Options which specify architecture.  */
10833 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10834 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10835   {"march", required_argument, NULL, OPTION_MARCH},
10836 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10837   {"mtune", required_argument, NULL, OPTION_MTUNE},
10838 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10839   {"mips0", no_argument, NULL, OPTION_MIPS1},
10840   {"mips1", no_argument, NULL, OPTION_MIPS1},
10841 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10842   {"mips2", no_argument, NULL, OPTION_MIPS2},
10843 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10844   {"mips3", no_argument, NULL, OPTION_MIPS3},
10845 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10846   {"mips4", no_argument, NULL, OPTION_MIPS4},
10847 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10848   {"mips5", no_argument, NULL, OPTION_MIPS5},
10849 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10850   {"mips32", no_argument, NULL, OPTION_MIPS32},
10851 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10852   {"mips64", no_argument, NULL, OPTION_MIPS64},
10853 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10854   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10855 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10856   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10857
10858   /* Options which specify Application Specific Extensions (ASEs).  */
10859 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10860 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10861   {"mips16", no_argument, NULL, OPTION_MIPS16},
10862 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10863   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10864 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10865   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10866 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10867   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10868 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10869   {"mdmx", no_argument, NULL, OPTION_MDMX},
10870 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10871   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10872 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10873   {"mdsp", no_argument, NULL, OPTION_DSP},
10874 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10875   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
10876 #define OPTION_MT (OPTION_ASE_BASE + 8)
10877   {"mmt", no_argument, NULL, OPTION_MT},
10878 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10879   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
10880 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
10881   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
10882 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
10883   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
10884 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
10885   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
10886 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
10887   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
10888
10889   /* Old-style architecture options.  Don't add more of these.  */
10890 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
10891 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10892   {"m4650", no_argument, NULL, OPTION_M4650},
10893 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10894   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10895 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10896   {"m4010", no_argument, NULL, OPTION_M4010},
10897 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10898   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10899 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10900   {"m4100", no_argument, NULL, OPTION_M4100},
10901 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10902   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10903 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10904   {"m3900", no_argument, NULL, OPTION_M3900},
10905 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10906   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10907
10908   /* Options which enable bug fixes.  */
10909 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10910 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10911   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10912 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10913   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10914   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10915 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10916 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10917   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10918   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10919 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10920 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10921   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
10922   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
10923
10924   /* Miscellaneous options.  */
10925 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10926 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10927   {"trap", no_argument, NULL, OPTION_TRAP},
10928   {"no-break", no_argument, NULL, OPTION_TRAP},
10929 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10930   {"break", no_argument, NULL, OPTION_BREAK},
10931   {"no-trap", no_argument, NULL, OPTION_BREAK},
10932 #define OPTION_EB (OPTION_MISC_BASE + 2)
10933   {"EB", no_argument, NULL, OPTION_EB},
10934 #define OPTION_EL (OPTION_MISC_BASE + 3)
10935   {"EL", no_argument, NULL, OPTION_EL},
10936 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10937   {"mfp32", no_argument, NULL, OPTION_FP32},
10938 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10939   {"mgp32", no_argument, NULL, OPTION_GP32},
10940 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10941   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10942 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10943   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10944 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10945   {"mfp64", no_argument, NULL, OPTION_FP64},
10946 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10947   {"mgp64", no_argument, NULL, OPTION_GP64},
10948 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10949 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10950   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10951   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10952 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10953 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10954   {"mshared", no_argument, NULL, OPTION_MSHARED},
10955   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
10956 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10957 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10958   {"msym32", no_argument, NULL, OPTION_MSYM32},
10959   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
10960
10961   /* ELF-specific options.  */
10962 #ifdef OBJ_ELF
10963 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 16)
10964 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10965   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10966   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10967 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10968   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10969 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10970   {"xgot",        no_argument, NULL, OPTION_XGOT},
10971 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10972   {"mabi", required_argument, NULL, OPTION_MABI},
10973 #define OPTION_32          (OPTION_ELF_BASE + 4)
10974   {"32",          no_argument, NULL, OPTION_32},
10975 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10976   {"n32",         no_argument, NULL, OPTION_N32},
10977 #define OPTION_64          (OPTION_ELF_BASE + 6)
10978   {"64",          no_argument, NULL, OPTION_64},
10979 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10980   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10981 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10982   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10983 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
10984   {"mpdr", no_argument, NULL, OPTION_PDR},
10985 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
10986   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10987 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10988   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
10989 #endif /* OBJ_ELF */
10990
10991   {NULL, no_argument, NULL, 0}
10992 };
10993 size_t md_longopts_size = sizeof (md_longopts);
10994
10995 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10996    NEW_VALUE.  Warn if another value was already specified.  Note:
10997    we have to defer parsing the -march and -mtune arguments in order
10998    to handle 'from-abi' correctly, since the ABI might be specified
10999    in a later argument.  */
11000
11001 static void
11002 mips_set_option_string (const char **string_ptr, const char *new_value)
11003 {
11004   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11005     as_warn (_("A different %s was already specified, is now %s"),
11006              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11007              new_value);
11008
11009   *string_ptr = new_value;
11010 }
11011
11012 int
11013 md_parse_option (int c, char *arg)
11014 {
11015   switch (c)
11016     {
11017     case OPTION_CONSTRUCT_FLOATS:
11018       mips_disable_float_construction = 0;
11019       break;
11020
11021     case OPTION_NO_CONSTRUCT_FLOATS:
11022       mips_disable_float_construction = 1;
11023       break;
11024
11025     case OPTION_TRAP:
11026       mips_trap = 1;
11027       break;
11028
11029     case OPTION_BREAK:
11030       mips_trap = 0;
11031       break;
11032
11033     case OPTION_EB:
11034       target_big_endian = 1;
11035       break;
11036
11037     case OPTION_EL:
11038       target_big_endian = 0;
11039       break;
11040
11041     case 'O':
11042       if (arg == NULL)
11043         mips_optimize = 1;
11044       else if (arg[0] == '0')
11045         mips_optimize = 0;
11046       else if (arg[0] == '1')
11047         mips_optimize = 1;
11048       else
11049         mips_optimize = 2;
11050       break;
11051
11052     case 'g':
11053       if (arg == NULL)
11054         mips_debug = 2;
11055       else
11056         mips_debug = atoi (arg);
11057       break;
11058
11059     case OPTION_MIPS1:
11060       file_mips_isa = ISA_MIPS1;
11061       break;
11062
11063     case OPTION_MIPS2:
11064       file_mips_isa = ISA_MIPS2;
11065       break;
11066
11067     case OPTION_MIPS3:
11068       file_mips_isa = ISA_MIPS3;
11069       break;
11070
11071     case OPTION_MIPS4:
11072       file_mips_isa = ISA_MIPS4;
11073       break;
11074
11075     case OPTION_MIPS5:
11076       file_mips_isa = ISA_MIPS5;
11077       break;
11078
11079     case OPTION_MIPS32:
11080       file_mips_isa = ISA_MIPS32;
11081       break;
11082
11083     case OPTION_MIPS32R2:
11084       file_mips_isa = ISA_MIPS32R2;
11085       break;
11086
11087     case OPTION_MIPS64R2:
11088       file_mips_isa = ISA_MIPS64R2;
11089       break;
11090
11091     case OPTION_MIPS64:
11092       file_mips_isa = ISA_MIPS64;
11093       break;
11094
11095     case OPTION_MTUNE:
11096       mips_set_option_string (&mips_tune_string, arg);
11097       break;
11098
11099     case OPTION_MARCH:
11100       mips_set_option_string (&mips_arch_string, arg);
11101       break;
11102
11103     case OPTION_M4650:
11104       mips_set_option_string (&mips_arch_string, "4650");
11105       mips_set_option_string (&mips_tune_string, "4650");
11106       break;
11107
11108     case OPTION_NO_M4650:
11109       break;
11110
11111     case OPTION_M4010:
11112       mips_set_option_string (&mips_arch_string, "4010");
11113       mips_set_option_string (&mips_tune_string, "4010");
11114       break;
11115
11116     case OPTION_NO_M4010:
11117       break;
11118
11119     case OPTION_M4100:
11120       mips_set_option_string (&mips_arch_string, "4100");
11121       mips_set_option_string (&mips_tune_string, "4100");
11122       break;
11123
11124     case OPTION_NO_M4100:
11125       break;
11126
11127     case OPTION_M3900:
11128       mips_set_option_string (&mips_arch_string, "3900");
11129       mips_set_option_string (&mips_tune_string, "3900");
11130       break;
11131
11132     case OPTION_NO_M3900:
11133       break;
11134
11135     case OPTION_MDMX:
11136       mips_opts.ase_mdmx = 1;
11137       break;
11138
11139     case OPTION_NO_MDMX:
11140       mips_opts.ase_mdmx = 0;
11141       break;
11142
11143     case OPTION_DSP:
11144       mips_opts.ase_dsp = 1;
11145       mips_opts.ase_dspr2 = 0;
11146       break;
11147
11148     case OPTION_NO_DSP:
11149       mips_opts.ase_dsp = 0;
11150       mips_opts.ase_dspr2 = 0;
11151       break;
11152
11153     case OPTION_DSPR2:
11154       mips_opts.ase_dspr2 = 1;
11155       mips_opts.ase_dsp = 1;
11156       break;
11157
11158     case OPTION_NO_DSPR2:
11159       mips_opts.ase_dspr2 = 0;
11160       mips_opts.ase_dsp = 0;
11161       break;
11162
11163     case OPTION_MT:
11164       mips_opts.ase_mt = 1;
11165       break;
11166
11167     case OPTION_NO_MT:
11168       mips_opts.ase_mt = 0;
11169       break;
11170
11171     case OPTION_MIPS16:
11172       mips_opts.mips16 = 1;
11173       mips_no_prev_insn ();
11174       break;
11175
11176     case OPTION_NO_MIPS16:
11177       mips_opts.mips16 = 0;
11178       mips_no_prev_insn ();
11179       break;
11180
11181     case OPTION_MIPS3D:
11182       mips_opts.ase_mips3d = 1;
11183       break;
11184
11185     case OPTION_NO_MIPS3D:
11186       mips_opts.ase_mips3d = 0;
11187       break;
11188
11189     case OPTION_SMARTMIPS:
11190       mips_opts.ase_smartmips = 1;
11191       break;
11192
11193     case OPTION_NO_SMARTMIPS:
11194       mips_opts.ase_smartmips = 0;
11195       break;
11196
11197     case OPTION_FIX_VR4120:
11198       mips_fix_vr4120 = 1;
11199       break;
11200
11201     case OPTION_NO_FIX_VR4120:
11202       mips_fix_vr4120 = 0;
11203       break;
11204
11205     case OPTION_FIX_VR4130:
11206       mips_fix_vr4130 = 1;
11207       break;
11208
11209     case OPTION_NO_FIX_VR4130:
11210       mips_fix_vr4130 = 0;
11211       break;
11212
11213     case OPTION_RELAX_BRANCH:
11214       mips_relax_branch = 1;
11215       break;
11216
11217     case OPTION_NO_RELAX_BRANCH:
11218       mips_relax_branch = 0;
11219       break;
11220
11221     case OPTION_MSHARED:
11222       mips_in_shared = TRUE;
11223       break;
11224
11225     case OPTION_MNO_SHARED:
11226       mips_in_shared = FALSE;
11227       break;
11228
11229     case OPTION_MSYM32:
11230       mips_opts.sym32 = TRUE;
11231       break;
11232
11233     case OPTION_MNO_SYM32:
11234       mips_opts.sym32 = FALSE;
11235       break;
11236
11237 #ifdef OBJ_ELF
11238       /* When generating ELF code, we permit -KPIC and -call_shared to
11239          select SVR4_PIC, and -non_shared to select no PIC.  This is
11240          intended to be compatible with Irix 5.  */
11241     case OPTION_CALL_SHARED:
11242       if (!IS_ELF)
11243         {
11244           as_bad (_("-call_shared is supported only for ELF format"));
11245           return 0;
11246         }
11247       mips_pic = SVR4_PIC;
11248       mips_abicalls = TRUE;
11249       break;
11250
11251     case OPTION_NON_SHARED:
11252       if (!IS_ELF)
11253         {
11254           as_bad (_("-non_shared is supported only for ELF format"));
11255           return 0;
11256         }
11257       mips_pic = NO_PIC;
11258       mips_abicalls = FALSE;
11259       break;
11260
11261       /* The -xgot option tells the assembler to use 32 bit offsets
11262          when accessing the got in SVR4_PIC mode.  It is for Irix
11263          compatibility.  */
11264     case OPTION_XGOT:
11265       mips_big_got = 1;
11266       break;
11267 #endif /* OBJ_ELF */
11268
11269     case 'G':
11270       g_switch_value = atoi (arg);
11271       g_switch_seen = 1;
11272       break;
11273
11274 #ifdef OBJ_ELF
11275       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11276          and -mabi=64.  */
11277     case OPTION_32:
11278       if (!IS_ELF)
11279         {
11280           as_bad (_("-32 is supported for ELF format only"));
11281           return 0;
11282         }
11283       mips_abi = O32_ABI;
11284       break;
11285
11286     case OPTION_N32:
11287       if (!IS_ELF)
11288         {
11289           as_bad (_("-n32 is supported for ELF format only"));
11290           return 0;
11291         }
11292       mips_abi = N32_ABI;
11293       break;
11294
11295     case OPTION_64:
11296       if (!IS_ELF)
11297         {
11298           as_bad (_("-64 is supported for ELF format only"));
11299           return 0;
11300         }
11301       mips_abi = N64_ABI;
11302       if (!support_64bit_objects())
11303         as_fatal (_("No compiled in support for 64 bit object file format"));
11304       break;
11305 #endif /* OBJ_ELF */
11306
11307     case OPTION_GP32:
11308       file_mips_gp32 = 1;
11309       break;
11310
11311     case OPTION_GP64:
11312       file_mips_gp32 = 0;
11313       break;
11314
11315     case OPTION_FP32:
11316       file_mips_fp32 = 1;
11317       break;
11318
11319     case OPTION_FP64:
11320       file_mips_fp32 = 0;
11321       break;
11322
11323 #ifdef OBJ_ELF
11324     case OPTION_MABI:
11325       if (!IS_ELF)
11326         {
11327           as_bad (_("-mabi is supported for ELF format only"));
11328           return 0;
11329         }
11330       if (strcmp (arg, "32") == 0)
11331         mips_abi = O32_ABI;
11332       else if (strcmp (arg, "o64") == 0)
11333         mips_abi = O64_ABI;
11334       else if (strcmp (arg, "n32") == 0)
11335         mips_abi = N32_ABI;
11336       else if (strcmp (arg, "64") == 0)
11337         {
11338           mips_abi = N64_ABI;
11339           if (! support_64bit_objects())
11340             as_fatal (_("No compiled in support for 64 bit object file "
11341                         "format"));
11342         }
11343       else if (strcmp (arg, "eabi") == 0)
11344         mips_abi = EABI_ABI;
11345       else
11346         {
11347           as_fatal (_("invalid abi -mabi=%s"), arg);
11348           return 0;
11349         }
11350       break;
11351 #endif /* OBJ_ELF */
11352
11353     case OPTION_M7000_HILO_FIX:
11354       mips_7000_hilo_fix = TRUE;
11355       break;
11356
11357     case OPTION_MNO_7000_HILO_FIX:
11358       mips_7000_hilo_fix = FALSE;
11359       break;
11360
11361 #ifdef OBJ_ELF
11362     case OPTION_MDEBUG:
11363       mips_flag_mdebug = TRUE;
11364       break;
11365
11366     case OPTION_NO_MDEBUG:
11367       mips_flag_mdebug = FALSE;
11368       break;
11369
11370     case OPTION_PDR:
11371       mips_flag_pdr = TRUE;
11372       break;
11373
11374     case OPTION_NO_PDR:
11375       mips_flag_pdr = FALSE;
11376       break;
11377
11378     case OPTION_MVXWORKS_PIC:
11379       mips_pic = VXWORKS_PIC;
11380       break;
11381 #endif /* OBJ_ELF */
11382
11383     default:
11384       return 0;
11385     }
11386
11387   return 1;
11388 }
11389 \f
11390 /* Set up globals to generate code for the ISA or processor
11391    described by INFO.  */
11392
11393 static void
11394 mips_set_architecture (const struct mips_cpu_info *info)
11395 {
11396   if (info != 0)
11397     {
11398       file_mips_arch = info->cpu;
11399       mips_opts.arch = info->cpu;
11400       mips_opts.isa = info->isa;
11401     }
11402 }
11403
11404
11405 /* Likewise for tuning.  */
11406
11407 static void
11408 mips_set_tune (const struct mips_cpu_info *info)
11409 {
11410   if (info != 0)
11411     mips_tune = info->cpu;
11412 }
11413
11414
11415 void
11416 mips_after_parse_args (void)
11417 {
11418   const struct mips_cpu_info *arch_info = 0;
11419   const struct mips_cpu_info *tune_info = 0;
11420
11421   /* GP relative stuff not working for PE */
11422   if (strncmp (TARGET_OS, "pe", 2) == 0)
11423     {
11424       if (g_switch_seen && g_switch_value != 0)
11425         as_bad (_("-G not supported in this configuration."));
11426       g_switch_value = 0;
11427     }
11428
11429   if (mips_abi == NO_ABI)
11430     mips_abi = MIPS_DEFAULT_ABI;
11431
11432   /* The following code determines the architecture and register size.
11433      Similar code was added to GCC 3.3 (see override_options() in
11434      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11435      as much as possible.  */
11436
11437   if (mips_arch_string != 0)
11438     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11439
11440   if (file_mips_isa != ISA_UNKNOWN)
11441     {
11442       /* Handle -mipsN.  At this point, file_mips_isa contains the
11443          ISA level specified by -mipsN, while arch_info->isa contains
11444          the -march selection (if any).  */
11445       if (arch_info != 0)
11446         {
11447           /* -march takes precedence over -mipsN, since it is more descriptive.
11448              There's no harm in specifying both as long as the ISA levels
11449              are the same.  */
11450           if (file_mips_isa != arch_info->isa)
11451             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11452                     mips_cpu_info_from_isa (file_mips_isa)->name,
11453                     mips_cpu_info_from_isa (arch_info->isa)->name);
11454         }
11455       else
11456         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11457     }
11458
11459   if (arch_info == 0)
11460     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11461
11462   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11463     as_bad ("-march=%s is not compatible with the selected ABI",
11464             arch_info->name);
11465
11466   mips_set_architecture (arch_info);
11467
11468   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11469   if (mips_tune_string != 0)
11470     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11471
11472   if (tune_info == 0)
11473     mips_set_tune (arch_info);
11474   else
11475     mips_set_tune (tune_info);
11476
11477   if (file_mips_gp32 >= 0)
11478     {
11479       /* The user specified the size of the integer registers.  Make sure
11480          it agrees with the ABI and ISA.  */
11481       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11482         as_bad (_("-mgp64 used with a 32-bit processor"));
11483       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11484         as_bad (_("-mgp32 used with a 64-bit ABI"));
11485       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11486         as_bad (_("-mgp64 used with a 32-bit ABI"));
11487     }
11488   else
11489     {
11490       /* Infer the integer register size from the ABI and processor.
11491          Restrict ourselves to 32-bit registers if that's all the
11492          processor has, or if the ABI cannot handle 64-bit registers.  */
11493       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11494                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11495     }
11496
11497   switch (file_mips_fp32)
11498     {
11499     default:
11500     case -1:
11501       /* No user specified float register size.
11502          ??? GAS treats single-float processors as though they had 64-bit
11503          float registers (although it complains when double-precision
11504          instructions are used).  As things stand, saying they have 32-bit
11505          registers would lead to spurious "register must be even" messages.
11506          So here we assume float registers are never smaller than the
11507          integer ones.  */
11508       if (file_mips_gp32 == 0)
11509         /* 64-bit integer registers implies 64-bit float registers.  */
11510         file_mips_fp32 = 0;
11511       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11512                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11513         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11514         file_mips_fp32 = 0;
11515       else
11516         /* 32-bit float registers.  */
11517         file_mips_fp32 = 1;
11518       break;
11519
11520     /* The user specified the size of the float registers.  Check if it
11521        agrees with the ABI and ISA.  */
11522     case 0:
11523       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11524         as_bad (_("-mfp64 used with a 32-bit fpu"));
11525       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11526                && !ISA_HAS_MXHC1 (mips_opts.isa))
11527         as_warn (_("-mfp64 used with a 32-bit ABI"));
11528       break;
11529     case 1:
11530       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11531         as_warn (_("-mfp32 used with a 64-bit ABI"));
11532       break;
11533     }
11534
11535   /* End of GCC-shared inference code.  */
11536
11537   /* This flag is set when we have a 64-bit capable CPU but use only
11538      32-bit wide registers.  Note that EABI does not use it.  */
11539   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11540       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11541           || mips_abi == O32_ABI))
11542     mips_32bitmode = 1;
11543
11544   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11545     as_bad (_("trap exception not supported at ISA 1"));
11546
11547   /* If the selected architecture includes support for ASEs, enable
11548      generation of code for them.  */
11549   if (mips_opts.mips16 == -1)
11550     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11551   if (mips_opts.ase_mips3d == -1)
11552     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11553                             && file_mips_fp32 == 0) ? 1 : 0;
11554   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11555     as_bad (_("-mfp32 used with -mips3d"));
11556
11557   if (mips_opts.ase_mdmx == -1)
11558     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11559                           && file_mips_fp32 == 0) ? 1 : 0;
11560   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11561     as_bad (_("-mfp32 used with -mdmx"));
11562
11563   if (mips_opts.ase_smartmips == -1)
11564     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11565   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11566       as_warn ("%s ISA does not support SmartMIPS", 
11567                mips_cpu_info_from_isa (mips_opts.isa)->name);
11568
11569   if (mips_opts.ase_dsp == -1)
11570     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11571   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11572       as_warn ("%s ISA does not support DSP ASE", 
11573                mips_cpu_info_from_isa (mips_opts.isa)->name);
11574
11575   if (mips_opts.ase_dspr2 == -1)
11576     {
11577       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11578       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11579     }
11580   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11581       as_warn ("%s ISA does not support DSP R2 ASE",
11582                mips_cpu_info_from_isa (mips_opts.isa)->name);
11583
11584   if (mips_opts.ase_mt == -1)
11585     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11586   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11587       as_warn ("%s ISA does not support MT ASE",
11588                mips_cpu_info_from_isa (mips_opts.isa)->name);
11589
11590   file_mips_isa = mips_opts.isa;
11591   file_ase_mips16 = mips_opts.mips16;
11592   file_ase_mips3d = mips_opts.ase_mips3d;
11593   file_ase_mdmx = mips_opts.ase_mdmx;
11594   file_ase_smartmips = mips_opts.ase_smartmips;
11595   file_ase_dsp = mips_opts.ase_dsp;
11596   file_ase_dspr2 = mips_opts.ase_dspr2;
11597   file_ase_mt = mips_opts.ase_mt;
11598   mips_opts.gp32 = file_mips_gp32;
11599   mips_opts.fp32 = file_mips_fp32;
11600
11601   if (mips_flag_mdebug < 0)
11602     {
11603 #ifdef OBJ_MAYBE_ECOFF
11604       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11605         mips_flag_mdebug = 1;
11606       else
11607 #endif /* OBJ_MAYBE_ECOFF */
11608         mips_flag_mdebug = 0;
11609     }
11610 }
11611 \f
11612 void
11613 mips_init_after_args (void)
11614 {
11615   /* initialize opcodes */
11616   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11617   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11618 }
11619
11620 long
11621 md_pcrel_from (fixS *fixP)
11622 {
11623   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11624   switch (fixP->fx_r_type)
11625     {
11626     case BFD_RELOC_16_PCREL_S2:
11627     case BFD_RELOC_MIPS_JMP:
11628       /* Return the address of the delay slot.  */
11629       return addr + 4;
11630     default:
11631       /* We have no relocation type for PC relative MIPS16 instructions.  */
11632       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11633         as_bad_where (fixP->fx_file, fixP->fx_line,
11634                       _("PC relative MIPS16 instruction references a different section"));
11635       return addr;
11636     }
11637 }
11638
11639 /* This is called before the symbol table is processed.  In order to
11640    work with gcc when using mips-tfile, we must keep all local labels.
11641    However, in other cases, we want to discard them.  If we were
11642    called with -g, but we didn't see any debugging information, it may
11643    mean that gcc is smuggling debugging information through to
11644    mips-tfile, in which case we must generate all local labels.  */
11645
11646 void
11647 mips_frob_file_before_adjust (void)
11648 {
11649 #ifndef NO_ECOFF_DEBUGGING
11650   if (ECOFF_DEBUGGING
11651       && mips_debug != 0
11652       && ! ecoff_debugging_seen)
11653     flag_keep_locals = 1;
11654 #endif
11655 }
11656
11657 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11658    the corresponding LO16 reloc.  This is called before md_apply_fix and
11659    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11660    relocation operators.
11661
11662    For our purposes, a %lo() expression matches a %got() or %hi()
11663    expression if:
11664
11665       (a) it refers to the same symbol; and
11666       (b) the offset applied in the %lo() expression is no lower than
11667           the offset applied in the %got() or %hi().
11668
11669    (b) allows us to cope with code like:
11670
11671         lui     $4,%hi(foo)
11672         lh      $4,%lo(foo+2)($4)
11673
11674    ...which is legal on RELA targets, and has a well-defined behaviour
11675    if the user knows that adding 2 to "foo" will not induce a carry to
11676    the high 16 bits.
11677
11678    When several %lo()s match a particular %got() or %hi(), we use the
11679    following rules to distinguish them:
11680
11681      (1) %lo()s with smaller offsets are a better match than %lo()s with
11682          higher offsets.
11683
11684      (2) %lo()s with no matching %got() or %hi() are better than those
11685          that already have a matching %got() or %hi().
11686
11687      (3) later %lo()s are better than earlier %lo()s.
11688
11689    These rules are applied in order.
11690
11691    (1) means, among other things, that %lo()s with identical offsets are
11692    chosen if they exist.
11693
11694    (2) means that we won't associate several high-part relocations with
11695    the same low-part relocation unless there's no alternative.  Having
11696    several high parts for the same low part is a GNU extension; this rule
11697    allows careful users to avoid it.
11698
11699    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
11700    with the last high-part relocation being at the front of the list.
11701    It therefore makes sense to choose the last matching low-part
11702    relocation, all other things being equal.  It's also easier
11703    to code that way.  */
11704
11705 void
11706 mips_frob_file (void)
11707 {
11708   struct mips_hi_fixup *l;
11709
11710   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11711     {
11712       segment_info_type *seginfo;
11713       bfd_boolean matched_lo_p;
11714       fixS **hi_pos, **lo_pos, **pos;
11715
11716       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11717
11718       /* If a GOT16 relocation turns out to be against a global symbol,
11719          there isn't supposed to be a matching LO.  */
11720       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11721           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11722         continue;
11723
11724       /* Check quickly whether the next fixup happens to be a matching %lo.  */
11725       if (fixup_has_matching_lo_p (l->fixp))
11726         continue;
11727
11728       seginfo = seg_info (l->seg);
11729
11730       /* Set HI_POS to the position of this relocation in the chain.
11731          Set LO_POS to the position of the chosen low-part relocation.
11732          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11733          relocation that matches an immediately-preceding high-part
11734          relocation.  */
11735       hi_pos = NULL;
11736       lo_pos = NULL;
11737       matched_lo_p = FALSE;
11738       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11739         {
11740           if (*pos == l->fixp)
11741             hi_pos = pos;
11742
11743           if (((*pos)->fx_r_type == BFD_RELOC_LO16
11744                || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
11745               && (*pos)->fx_addsy == l->fixp->fx_addsy
11746               && (*pos)->fx_offset >= l->fixp->fx_offset
11747               && (lo_pos == NULL
11748                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
11749                   || (!matched_lo_p
11750                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11751             lo_pos = pos;
11752
11753           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11754                           && fixup_has_matching_lo_p (*pos));
11755         }
11756
11757       /* If we found a match, remove the high-part relocation from its
11758          current position and insert it before the low-part relocation.
11759          Make the offsets match so that fixup_has_matching_lo_p()
11760          will return true.
11761
11762          We don't warn about unmatched high-part relocations since some
11763          versions of gcc have been known to emit dead "lui ...%hi(...)"
11764          instructions.  */
11765       if (lo_pos != NULL)
11766         {
11767           l->fixp->fx_offset = (*lo_pos)->fx_offset;
11768           if (l->fixp->fx_next != *lo_pos)
11769             {
11770               *hi_pos = l->fixp->fx_next;
11771               l->fixp->fx_next = *lo_pos;
11772               *lo_pos = l->fixp;
11773             }
11774         }
11775     }
11776 }
11777
11778 /* We may have combined relocations without symbols in the N32/N64 ABI.
11779    We have to prevent gas from dropping them.  */
11780
11781 int
11782 mips_force_relocation (fixS *fixp)
11783 {
11784   if (generic_force_reloc (fixp))
11785     return 1;
11786
11787   if (HAVE_NEWABI
11788       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11789       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11790           || fixp->fx_r_type == BFD_RELOC_HI16_S
11791           || fixp->fx_r_type == BFD_RELOC_LO16))
11792     return 1;
11793
11794   return 0;
11795 }
11796
11797 /* Apply a fixup to the object file.  */
11798
11799 void
11800 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11801 {
11802   bfd_byte *buf;
11803   long insn;
11804   reloc_howto_type *howto;
11805
11806   /* We ignore generic BFD relocations we don't know about.  */
11807   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11808   if (! howto)
11809     return;
11810
11811   assert (fixP->fx_size == 4
11812           || fixP->fx_r_type == BFD_RELOC_16
11813           || fixP->fx_r_type == BFD_RELOC_64
11814           || fixP->fx_r_type == BFD_RELOC_CTOR
11815           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11816           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11817           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11818           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
11819
11820   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11821
11822   assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
11823
11824   /* Don't treat parts of a composite relocation as done.  There are two
11825      reasons for this:
11826
11827      (1) The second and third parts will be against 0 (RSS_UNDEF) but
11828          should nevertheless be emitted if the first part is.
11829
11830      (2) In normal usage, composite relocations are never assembly-time
11831          constants.  The easiest way of dealing with the pathological
11832          exceptions is to generate a relocation against STN_UNDEF and
11833          leave everything up to the linker.  */
11834   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
11835     fixP->fx_done = 1;
11836
11837   switch (fixP->fx_r_type)
11838     {
11839     case BFD_RELOC_MIPS_TLS_GD:
11840     case BFD_RELOC_MIPS_TLS_LDM:
11841     case BFD_RELOC_MIPS_TLS_DTPREL32:
11842     case BFD_RELOC_MIPS_TLS_DTPREL64:
11843     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
11844     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
11845     case BFD_RELOC_MIPS_TLS_GOTTPREL:
11846     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
11847     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
11848       S_SET_THREAD_LOCAL (fixP->fx_addsy);
11849       /* fall through */
11850
11851     case BFD_RELOC_MIPS_JMP:
11852     case BFD_RELOC_MIPS_SHIFT5:
11853     case BFD_RELOC_MIPS_SHIFT6:
11854     case BFD_RELOC_MIPS_GOT_DISP:
11855     case BFD_RELOC_MIPS_GOT_PAGE:
11856     case BFD_RELOC_MIPS_GOT_OFST:
11857     case BFD_RELOC_MIPS_SUB:
11858     case BFD_RELOC_MIPS_INSERT_A:
11859     case BFD_RELOC_MIPS_INSERT_B:
11860     case BFD_RELOC_MIPS_DELETE:
11861     case BFD_RELOC_MIPS_HIGHEST:
11862     case BFD_RELOC_MIPS_HIGHER:
11863     case BFD_RELOC_MIPS_SCN_DISP:
11864     case BFD_RELOC_MIPS_REL16:
11865     case BFD_RELOC_MIPS_RELGOT:
11866     case BFD_RELOC_MIPS_JALR:
11867     case BFD_RELOC_HI16:
11868     case BFD_RELOC_HI16_S:
11869     case BFD_RELOC_GPREL16:
11870     case BFD_RELOC_MIPS_LITERAL:
11871     case BFD_RELOC_MIPS_CALL16:
11872     case BFD_RELOC_MIPS_GOT16:
11873     case BFD_RELOC_GPREL32:
11874     case BFD_RELOC_MIPS_GOT_HI16:
11875     case BFD_RELOC_MIPS_GOT_LO16:
11876     case BFD_RELOC_MIPS_CALL_HI16:
11877     case BFD_RELOC_MIPS_CALL_LO16:
11878     case BFD_RELOC_MIPS16_GPREL:
11879     case BFD_RELOC_MIPS16_HI16:
11880     case BFD_RELOC_MIPS16_HI16_S:
11881     case BFD_RELOC_MIPS16_JMP:
11882       /* Nothing needed to do.  The value comes from the reloc entry.  */
11883       break;
11884
11885     case BFD_RELOC_64:
11886       /* This is handled like BFD_RELOC_32, but we output a sign
11887          extended value if we are only 32 bits.  */
11888       if (fixP->fx_done)
11889         {
11890           if (8 <= sizeof (valueT))
11891             md_number_to_chars ((char *) buf, *valP, 8);
11892           else
11893             {
11894               valueT hiv;
11895
11896               if ((*valP & 0x80000000) != 0)
11897                 hiv = 0xffffffff;
11898               else
11899                 hiv = 0;
11900               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11901                                   *valP, 4);
11902               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11903                                   hiv, 4);
11904             }
11905         }
11906       break;
11907
11908     case BFD_RELOC_RVA:
11909     case BFD_RELOC_32:
11910     case BFD_RELOC_16:
11911       /* If we are deleting this reloc entry, we must fill in the
11912          value now.  This can happen if we have a .word which is not
11913          resolved when it appears but is later defined.  */
11914       if (fixP->fx_done)
11915         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
11916       break;
11917
11918     case BFD_RELOC_LO16:
11919     case BFD_RELOC_MIPS16_LO16:
11920       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11921          may be safe to remove, but if so it's not obvious.  */
11922       /* When handling an embedded PIC switch statement, we can wind
11923          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11924       if (fixP->fx_done)
11925         {
11926           if (*valP + 0x8000 > 0xffff)
11927             as_bad_where (fixP->fx_file, fixP->fx_line,
11928                           _("relocation overflow"));
11929           if (target_big_endian)
11930             buf += 2;
11931           md_number_to_chars ((char *) buf, *valP, 2);
11932         }
11933       break;
11934
11935     case BFD_RELOC_16_PCREL_S2:
11936       if ((*valP & 0x3) != 0)
11937         as_bad_where (fixP->fx_file, fixP->fx_line,
11938                       _("Branch to misaligned address (%lx)"), (long) *valP);
11939
11940       /* We need to save the bits in the instruction since fixup_segment()
11941          might be deleting the relocation entry (i.e., a branch within
11942          the current segment).  */
11943       if (! fixP->fx_done)
11944         break;
11945
11946       /* Update old instruction data.  */
11947       if (target_big_endian)
11948         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11949       else
11950         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11951
11952       if (*valP + 0x20000 <= 0x3ffff)
11953         {
11954           insn |= (*valP >> 2) & 0xffff;
11955           md_number_to_chars ((char *) buf, insn, 4);
11956         }
11957       else if (mips_pic == NO_PIC
11958                && fixP->fx_done
11959                && fixP->fx_frag->fr_address >= text_section->vma
11960                && (fixP->fx_frag->fr_address
11961                    < text_section->vma + bfd_get_section_size (text_section))
11962                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
11963                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
11964                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11965         {
11966           /* The branch offset is too large.  If this is an
11967              unconditional branch, and we are not generating PIC code,
11968              we can convert it to an absolute jump instruction.  */
11969           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
11970             insn = 0x0c000000;  /* jal */
11971           else
11972             insn = 0x08000000;  /* j */
11973           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11974           fixP->fx_done = 0;
11975           fixP->fx_addsy = section_symbol (text_section);
11976           *valP += md_pcrel_from (fixP);
11977           md_number_to_chars ((char *) buf, insn, 4);
11978         }
11979       else
11980         {
11981           /* If we got here, we have branch-relaxation disabled,
11982              and there's nothing we can do to fix this instruction
11983              without turning it into a longer sequence.  */
11984           as_bad_where (fixP->fx_file, fixP->fx_line,
11985                         _("Branch out of range"));
11986         }
11987       break;
11988
11989     case BFD_RELOC_VTABLE_INHERIT:
11990       fixP->fx_done = 0;
11991       if (fixP->fx_addsy
11992           && !S_IS_DEFINED (fixP->fx_addsy)
11993           && !S_IS_WEAK (fixP->fx_addsy))
11994         S_SET_WEAK (fixP->fx_addsy);
11995       break;
11996
11997     case BFD_RELOC_VTABLE_ENTRY:
11998       fixP->fx_done = 0;
11999       break;
12000
12001     default:
12002       internalError ();
12003     }
12004
12005   /* Remember value for tc_gen_reloc.  */
12006   fixP->fx_addnumber = *valP;
12007 }
12008
12009 static symbolS *
12010 get_symbol (void)
12011 {
12012   int c;
12013   char *name;
12014   symbolS *p;
12015
12016   name = input_line_pointer;
12017   c = get_symbol_end ();
12018   p = (symbolS *) symbol_find_or_make (name);
12019   *input_line_pointer = c;
12020   return p;
12021 }
12022
12023 /* Align the current frag to a given power of two.  If a particular
12024    fill byte should be used, FILL points to an integer that contains
12025    that byte, otherwise FILL is null.
12026
12027    The MIPS assembler also automatically adjusts any preceding
12028    label.  */
12029
12030 static void
12031 mips_align (int to, int *fill, symbolS *label)
12032 {
12033   mips_emit_delays ();
12034   mips_record_mips16_mode ();
12035   if (fill == NULL && subseg_text_p (now_seg))
12036     frag_align_code (to, 0);
12037   else
12038     frag_align (to, fill ? *fill : 0, 0);
12039   record_alignment (now_seg, to);
12040   if (label != NULL)
12041     {
12042       assert (S_GET_SEGMENT (label) == now_seg);
12043       symbol_set_frag (label, frag_now);
12044       S_SET_VALUE (label, (valueT) frag_now_fix ());
12045     }
12046 }
12047
12048 /* Align to a given power of two.  .align 0 turns off the automatic
12049    alignment used by the data creating pseudo-ops.  */
12050
12051 static void
12052 s_align (int x ATTRIBUTE_UNUSED)
12053 {
12054   int temp, fill_value, *fill_ptr;
12055   long max_alignment = 28;
12056
12057   /* o Note that the assembler pulls down any immediately preceding label
12058        to the aligned address.
12059      o It's not documented but auto alignment is reinstated by
12060        a .align pseudo instruction.
12061      o Note also that after auto alignment is turned off the mips assembler
12062        issues an error on attempt to assemble an improperly aligned data item.
12063        We don't.  */
12064
12065   temp = get_absolute_expression ();
12066   if (temp > max_alignment)
12067     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12068   else if (temp < 0)
12069     {
12070       as_warn (_("Alignment negative: 0 assumed."));
12071       temp = 0;
12072     }
12073   if (*input_line_pointer == ',')
12074     {
12075       ++input_line_pointer;
12076       fill_value = get_absolute_expression ();
12077       fill_ptr = &fill_value;
12078     }
12079   else
12080     fill_ptr = 0;
12081   if (temp)
12082     {
12083       segment_info_type *si = seg_info (now_seg);
12084       struct insn_label_list *l = si->label_list;
12085       /* Auto alignment should be switched on by next section change.  */
12086       auto_align = 1;
12087       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12088     }
12089   else
12090     {
12091       auto_align = 0;
12092     }
12093
12094   demand_empty_rest_of_line ();
12095 }
12096
12097 static void
12098 s_change_sec (int sec)
12099 {
12100   segT seg;
12101
12102 #ifdef OBJ_ELF
12103   /* The ELF backend needs to know that we are changing sections, so
12104      that .previous works correctly.  We could do something like check
12105      for an obj_section_change_hook macro, but that might be confusing
12106      as it would not be appropriate to use it in the section changing
12107      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12108      This should be cleaner, somehow.  */
12109   if (IS_ELF)
12110     obj_elf_section_change_hook ();
12111 #endif
12112
12113   mips_emit_delays ();
12114   switch (sec)
12115     {
12116     case 't':
12117       s_text (0);
12118       break;
12119     case 'd':
12120       s_data (0);
12121       break;
12122     case 'b':
12123       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12124       demand_empty_rest_of_line ();
12125       break;
12126
12127     case 'r':
12128       seg = subseg_new (RDATA_SECTION_NAME,
12129                         (subsegT) get_absolute_expression ());
12130       if (IS_ELF)
12131         {
12132           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12133                                                   | SEC_READONLY | SEC_RELOC
12134                                                   | SEC_DATA));
12135           if (strcmp (TARGET_OS, "elf") != 0)
12136             record_alignment (seg, 4);
12137         }
12138       demand_empty_rest_of_line ();
12139       break;
12140
12141     case 's':
12142       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12143       if (IS_ELF)
12144         {
12145           bfd_set_section_flags (stdoutput, seg,
12146                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12147           if (strcmp (TARGET_OS, "elf") != 0)
12148             record_alignment (seg, 4);
12149         }
12150       demand_empty_rest_of_line ();
12151       break;
12152     }
12153
12154   auto_align = 1;
12155 }
12156
12157 void
12158 s_change_section (int ignore ATTRIBUTE_UNUSED)
12159 {
12160 #ifdef OBJ_ELF
12161   char *section_name;
12162   char c;
12163   char next_c = 0;
12164   int section_type;
12165   int section_flag;
12166   int section_entry_size;
12167   int section_alignment;
12168
12169   if (!IS_ELF)
12170     return;
12171
12172   section_name = input_line_pointer;
12173   c = get_symbol_end ();
12174   if (c)
12175     next_c = *(input_line_pointer + 1);
12176
12177   /* Do we have .section Name<,"flags">?  */
12178   if (c != ',' || (c == ',' && next_c == '"'))
12179     {
12180       /* just after name is now '\0'.  */
12181       *input_line_pointer = c;
12182       input_line_pointer = section_name;
12183       obj_elf_section (ignore);
12184       return;
12185     }
12186   input_line_pointer++;
12187
12188   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12189   if (c == ',')
12190     section_type = get_absolute_expression ();
12191   else
12192     section_type = 0;
12193   if (*input_line_pointer++ == ',')
12194     section_flag = get_absolute_expression ();
12195   else
12196     section_flag = 0;
12197   if (*input_line_pointer++ == ',')
12198     section_entry_size = get_absolute_expression ();
12199   else
12200     section_entry_size = 0;
12201   if (*input_line_pointer++ == ',')
12202     section_alignment = get_absolute_expression ();
12203   else
12204     section_alignment = 0;
12205
12206   section_name = xstrdup (section_name);
12207
12208   /* When using the generic form of .section (as implemented by obj-elf.c),
12209      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12210      traditionally had to fall back on the more common @progbits instead.
12211
12212      There's nothing really harmful in this, since bfd will correct
12213      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12214      means that, for backwards compatibility, the special_section entries
12215      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12216
12217      Even so, we shouldn't force users of the MIPS .section syntax to
12218      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12219      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12220      generic type-checking code.  */
12221   if (section_type == SHT_MIPS_DWARF)
12222     section_type = SHT_PROGBITS;
12223
12224   obj_elf_change_section (section_name, section_type, section_flag,
12225                           section_entry_size, 0, 0, 0);
12226
12227   if (now_seg->name != section_name)
12228     free (section_name);
12229 #endif /* OBJ_ELF */
12230 }
12231
12232 void
12233 mips_enable_auto_align (void)
12234 {
12235   auto_align = 1;
12236 }
12237
12238 static void
12239 s_cons (int log_size)
12240 {
12241   segment_info_type *si = seg_info (now_seg);
12242   struct insn_label_list *l = si->label_list;
12243   symbolS *label;
12244
12245   label = l != NULL ? l->label : NULL;
12246   mips_emit_delays ();
12247   if (log_size > 0 && auto_align)
12248     mips_align (log_size, 0, label);
12249   mips_clear_insn_labels ();
12250   cons (1 << log_size);
12251 }
12252
12253 static void
12254 s_float_cons (int type)
12255 {
12256   segment_info_type *si = seg_info (now_seg);
12257   struct insn_label_list *l = si->label_list;
12258   symbolS *label;
12259
12260   label = l != NULL ? l->label : NULL;
12261
12262   mips_emit_delays ();
12263
12264   if (auto_align)
12265     {
12266       if (type == 'd')
12267         mips_align (3, 0, label);
12268       else
12269         mips_align (2, 0, label);
12270     }
12271
12272   mips_clear_insn_labels ();
12273
12274   float_cons (type);
12275 }
12276
12277 /* Handle .globl.  We need to override it because on Irix 5 you are
12278    permitted to say
12279        .globl foo .text
12280    where foo is an undefined symbol, to mean that foo should be
12281    considered to be the address of a function.  */
12282
12283 static void
12284 s_mips_globl (int x ATTRIBUTE_UNUSED)
12285 {
12286   char *name;
12287   int c;
12288   symbolS *symbolP;
12289   flagword flag;
12290
12291   do
12292     {
12293       name = input_line_pointer;
12294       c = get_symbol_end ();
12295       symbolP = symbol_find_or_make (name);
12296       S_SET_EXTERNAL (symbolP);
12297
12298       *input_line_pointer = c;
12299       SKIP_WHITESPACE ();
12300
12301       /* On Irix 5, every global symbol that is not explicitly labelled as
12302          being a function is apparently labelled as being an object.  */
12303       flag = BSF_OBJECT;
12304
12305       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12306           && (*input_line_pointer != ','))
12307         {
12308           char *secname;
12309           asection *sec;
12310
12311           secname = input_line_pointer;
12312           c = get_symbol_end ();
12313           sec = bfd_get_section_by_name (stdoutput, secname);
12314           if (sec == NULL)
12315             as_bad (_("%s: no such section"), secname);
12316           *input_line_pointer = c;
12317
12318           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12319             flag = BSF_FUNCTION;
12320         }
12321
12322       symbol_get_bfdsym (symbolP)->flags |= flag;
12323
12324       c = *input_line_pointer;
12325       if (c == ',')
12326         {
12327           input_line_pointer++;
12328           SKIP_WHITESPACE ();
12329           if (is_end_of_line[(unsigned char) *input_line_pointer])
12330             c = '\n';
12331         }
12332     }
12333   while (c == ',');
12334
12335   demand_empty_rest_of_line ();
12336 }
12337
12338 static void
12339 s_option (int x ATTRIBUTE_UNUSED)
12340 {
12341   char *opt;
12342   char c;
12343
12344   opt = input_line_pointer;
12345   c = get_symbol_end ();
12346
12347   if (*opt == 'O')
12348     {
12349       /* FIXME: What does this mean?  */
12350     }
12351   else if (strncmp (opt, "pic", 3) == 0)
12352     {
12353       int i;
12354
12355       i = atoi (opt + 3);
12356       if (i == 0)
12357         mips_pic = NO_PIC;
12358       else if (i == 2)
12359         {
12360         mips_pic = SVR4_PIC;
12361           mips_abicalls = TRUE;
12362         }
12363       else
12364         as_bad (_(".option pic%d not supported"), i);
12365
12366       if (mips_pic == SVR4_PIC)
12367         {
12368           if (g_switch_seen && g_switch_value != 0)
12369             as_warn (_("-G may not be used with SVR4 PIC code"));
12370           g_switch_value = 0;
12371           bfd_set_gp_size (stdoutput, 0);
12372         }
12373     }
12374   else
12375     as_warn (_("Unrecognized option \"%s\""), opt);
12376
12377   *input_line_pointer = c;
12378   demand_empty_rest_of_line ();
12379 }
12380
12381 /* This structure is used to hold a stack of .set values.  */
12382
12383 struct mips_option_stack
12384 {
12385   struct mips_option_stack *next;
12386   struct mips_set_options options;
12387 };
12388
12389 static struct mips_option_stack *mips_opts_stack;
12390
12391 /* Handle the .set pseudo-op.  */
12392
12393 static void
12394 s_mipsset (int x ATTRIBUTE_UNUSED)
12395 {
12396   char *name = input_line_pointer, ch;
12397
12398   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12399     ++input_line_pointer;
12400   ch = *input_line_pointer;
12401   *input_line_pointer = '\0';
12402
12403   if (strcmp (name, "reorder") == 0)
12404     {
12405       if (mips_opts.noreorder)
12406         end_noreorder ();
12407     }
12408   else if (strcmp (name, "noreorder") == 0)
12409     {
12410       if (!mips_opts.noreorder)
12411         start_noreorder ();
12412     }
12413   else if (strncmp (name, "at=", 3) == 0)
12414     {
12415       char *s = name + 3;
12416
12417       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12418         as_bad (_("Unrecognized register name `%s'"), s);
12419     }
12420   else if (strcmp (name, "at") == 0)
12421     {
12422       mips_opts.at = ATREG;
12423     }
12424   else if (strcmp (name, "noat") == 0)
12425     {
12426       mips_opts.at = ZERO;
12427     }
12428   else if (strcmp (name, "macro") == 0)
12429     {
12430       mips_opts.warn_about_macros = 0;
12431     }
12432   else if (strcmp (name, "nomacro") == 0)
12433     {
12434       if (mips_opts.noreorder == 0)
12435         as_bad (_("`noreorder' must be set before `nomacro'"));
12436       mips_opts.warn_about_macros = 1;
12437     }
12438   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12439     {
12440       mips_opts.nomove = 0;
12441     }
12442   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12443     {
12444       mips_opts.nomove = 1;
12445     }
12446   else if (strcmp (name, "bopt") == 0)
12447     {
12448       mips_opts.nobopt = 0;
12449     }
12450   else if (strcmp (name, "nobopt") == 0)
12451     {
12452       mips_opts.nobopt = 1;
12453     }
12454   else if (strcmp (name, "gp=default") == 0)
12455     mips_opts.gp32 = file_mips_gp32;
12456   else if (strcmp (name, "gp=32") == 0)
12457     mips_opts.gp32 = 1;
12458   else if (strcmp (name, "gp=64") == 0)
12459     {
12460       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12461         as_warn ("%s isa does not support 64-bit registers",
12462                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12463       mips_opts.gp32 = 0;
12464     }
12465   else if (strcmp (name, "fp=default") == 0)
12466     mips_opts.fp32 = file_mips_fp32;
12467   else if (strcmp (name, "fp=32") == 0)
12468     mips_opts.fp32 = 1;
12469   else if (strcmp (name, "fp=64") == 0)
12470     {
12471       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12472         as_warn ("%s isa does not support 64-bit floating point registers",
12473                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12474       mips_opts.fp32 = 0;
12475     }
12476   else if (strcmp (name, "mips16") == 0
12477            || strcmp (name, "MIPS-16") == 0)
12478     mips_opts.mips16 = 1;
12479   else if (strcmp (name, "nomips16") == 0
12480            || strcmp (name, "noMIPS-16") == 0)
12481     mips_opts.mips16 = 0;
12482   else if (strcmp (name, "smartmips") == 0)
12483     {
12484       if (!ISA_SUPPORTS_SMARTMIPS)
12485         as_warn ("%s ISA does not support SmartMIPS ASE", 
12486                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12487       mips_opts.ase_smartmips = 1;
12488     }
12489   else if (strcmp (name, "nosmartmips") == 0)
12490     mips_opts.ase_smartmips = 0;
12491   else if (strcmp (name, "mips3d") == 0)
12492     mips_opts.ase_mips3d = 1;
12493   else if (strcmp (name, "nomips3d") == 0)
12494     mips_opts.ase_mips3d = 0;
12495   else if (strcmp (name, "mdmx") == 0)
12496     mips_opts.ase_mdmx = 1;
12497   else if (strcmp (name, "nomdmx") == 0)
12498     mips_opts.ase_mdmx = 0;
12499   else if (strcmp (name, "dsp") == 0)
12500     {
12501       if (!ISA_SUPPORTS_DSP_ASE)
12502         as_warn ("%s ISA does not support DSP ASE", 
12503                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12504       mips_opts.ase_dsp = 1;
12505       mips_opts.ase_dspr2 = 0;
12506     }
12507   else if (strcmp (name, "nodsp") == 0)
12508     {
12509       mips_opts.ase_dsp = 0;
12510       mips_opts.ase_dspr2 = 0;
12511     }
12512   else if (strcmp (name, "dspr2") == 0)
12513     {
12514       if (!ISA_SUPPORTS_DSPR2_ASE)
12515         as_warn ("%s ISA does not support DSP R2 ASE",
12516                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12517       mips_opts.ase_dspr2 = 1;
12518       mips_opts.ase_dsp = 1;
12519     }
12520   else if (strcmp (name, "nodspr2") == 0)
12521     {
12522       mips_opts.ase_dspr2 = 0;
12523       mips_opts.ase_dsp = 0;
12524     }
12525   else if (strcmp (name, "mt") == 0)
12526     {
12527       if (!ISA_SUPPORTS_MT_ASE)
12528         as_warn ("%s ISA does not support MT ASE", 
12529                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12530       mips_opts.ase_mt = 1;
12531     }
12532   else if (strcmp (name, "nomt") == 0)
12533     mips_opts.ase_mt = 0;
12534   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12535     {
12536       int reset = 0;
12537
12538       /* Permit the user to change the ISA and architecture on the fly.
12539          Needless to say, misuse can cause serious problems.  */
12540       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12541         {
12542           reset = 1;
12543           mips_opts.isa = file_mips_isa;
12544           mips_opts.arch = file_mips_arch;
12545         }
12546       else if (strncmp (name, "arch=", 5) == 0)
12547         {
12548           const struct mips_cpu_info *p;
12549
12550           p = mips_parse_cpu("internal use", name + 5);
12551           if (!p)
12552             as_bad (_("unknown architecture %s"), name + 5);
12553           else
12554             {
12555               mips_opts.arch = p->cpu;
12556               mips_opts.isa = p->isa;
12557             }
12558         }
12559       else if (strncmp (name, "mips", 4) == 0)
12560         {
12561           const struct mips_cpu_info *p;
12562
12563           p = mips_parse_cpu("internal use", name);
12564           if (!p)
12565             as_bad (_("unknown ISA level %s"), name + 4);
12566           else
12567             {
12568               mips_opts.arch = p->cpu;
12569               mips_opts.isa = p->isa;
12570             }
12571         }
12572       else
12573         as_bad (_("unknown ISA or architecture %s"), name);
12574
12575       switch (mips_opts.isa)
12576         {
12577         case  0:
12578           break;
12579         case ISA_MIPS1:
12580         case ISA_MIPS2:
12581         case ISA_MIPS32:
12582         case ISA_MIPS32R2:
12583           mips_opts.gp32 = 1;
12584           mips_opts.fp32 = 1;
12585           break;
12586         case ISA_MIPS3:
12587         case ISA_MIPS4:
12588         case ISA_MIPS5:
12589         case ISA_MIPS64:
12590         case ISA_MIPS64R2:
12591           mips_opts.gp32 = 0;
12592           mips_opts.fp32 = 0;
12593           break;
12594         default:
12595           as_bad (_("unknown ISA level %s"), name + 4);
12596           break;
12597         }
12598       if (reset)
12599         {
12600           mips_opts.gp32 = file_mips_gp32;
12601           mips_opts.fp32 = file_mips_fp32;
12602         }
12603     }
12604   else if (strcmp (name, "autoextend") == 0)
12605     mips_opts.noautoextend = 0;
12606   else if (strcmp (name, "noautoextend") == 0)
12607     mips_opts.noautoextend = 1;
12608   else if (strcmp (name, "push") == 0)
12609     {
12610       struct mips_option_stack *s;
12611
12612       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12613       s->next = mips_opts_stack;
12614       s->options = mips_opts;
12615       mips_opts_stack = s;
12616     }
12617   else if (strcmp (name, "pop") == 0)
12618     {
12619       struct mips_option_stack *s;
12620
12621       s = mips_opts_stack;
12622       if (s == NULL)
12623         as_bad (_(".set pop with no .set push"));
12624       else
12625         {
12626           /* If we're changing the reorder mode we need to handle
12627              delay slots correctly.  */
12628           if (s->options.noreorder && ! mips_opts.noreorder)
12629             start_noreorder ();
12630           else if (! s->options.noreorder && mips_opts.noreorder)
12631             end_noreorder ();
12632
12633           mips_opts = s->options;
12634           mips_opts_stack = s->next;
12635           free (s);
12636         }
12637     }
12638   else if (strcmp (name, "sym32") == 0)
12639     mips_opts.sym32 = TRUE;
12640   else if (strcmp (name, "nosym32") == 0)
12641     mips_opts.sym32 = FALSE;
12642   else if (strchr (name, ','))
12643     {
12644       /* Generic ".set" directive; use the generic handler.  */
12645       *input_line_pointer = ch;
12646       input_line_pointer = name;
12647       s_set (0);
12648       return;
12649     }
12650   else
12651     {
12652       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12653     }
12654   *input_line_pointer = ch;
12655   demand_empty_rest_of_line ();
12656 }
12657
12658 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12659    .option pic2.  It means to generate SVR4 PIC calls.  */
12660
12661 static void
12662 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12663 {
12664   mips_pic = SVR4_PIC;
12665   mips_abicalls = TRUE;
12666
12667   if (g_switch_seen && g_switch_value != 0)
12668     as_warn (_("-G may not be used with SVR4 PIC code"));
12669   g_switch_value = 0;
12670
12671   bfd_set_gp_size (stdoutput, 0);
12672   demand_empty_rest_of_line ();
12673 }
12674
12675 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12676    PIC code.  It sets the $gp register for the function based on the
12677    function address, which is in the register named in the argument.
12678    This uses a relocation against _gp_disp, which is handled specially
12679    by the linker.  The result is:
12680         lui     $gp,%hi(_gp_disp)
12681         addiu   $gp,$gp,%lo(_gp_disp)
12682         addu    $gp,$gp,.cpload argument
12683    The .cpload argument is normally $25 == $t9.
12684
12685    The -mno-shared option changes this to:
12686         lui     $gp,%hi(__gnu_local_gp)
12687         addiu   $gp,$gp,%lo(__gnu_local_gp)
12688    and the argument is ignored.  This saves an instruction, but the
12689    resulting code is not position independent; it uses an absolute
12690    address for __gnu_local_gp.  Thus code assembled with -mno-shared
12691    can go into an ordinary executable, but not into a shared library.  */
12692
12693 static void
12694 s_cpload (int ignore ATTRIBUTE_UNUSED)
12695 {
12696   expressionS ex;
12697   int reg;
12698   int in_shared;
12699
12700   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12701      .cpload is ignored.  */
12702   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12703     {
12704       s_ignore (0);
12705       return;
12706     }
12707
12708   /* .cpload should be in a .set noreorder section.  */
12709   if (mips_opts.noreorder == 0)
12710     as_warn (_(".cpload not in noreorder section"));
12711
12712   reg = tc_get_register (0);
12713
12714   /* If we need to produce a 64-bit address, we are better off using
12715      the default instruction sequence.  */
12716   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
12717
12718   ex.X_op = O_symbol;
12719   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
12720                                          "__gnu_local_gp");
12721   ex.X_op_symbol = NULL;
12722   ex.X_add_number = 0;
12723
12724   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12725   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12726
12727   macro_start ();
12728   macro_build_lui (&ex, mips_gp_register);
12729   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12730                mips_gp_register, BFD_RELOC_LO16);
12731   if (in_shared)
12732     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12733                  mips_gp_register, reg);
12734   macro_end ();
12735
12736   demand_empty_rest_of_line ();
12737 }
12738
12739 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
12740      .cpsetup $reg1, offset|$reg2, label
12741
12742    If offset is given, this results in:
12743      sd         $gp, offset($sp)
12744      lui        $gp, %hi(%neg(%gp_rel(label)))
12745      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12746      daddu      $gp, $gp, $reg1
12747
12748    If $reg2 is given, this results in:
12749      daddu      $reg2, $gp, $0
12750      lui        $gp, %hi(%neg(%gp_rel(label)))
12751      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12752      daddu      $gp, $gp, $reg1
12753    $reg1 is normally $25 == $t9.
12754
12755    The -mno-shared option replaces the last three instructions with
12756         lui     $gp,%hi(_gp)
12757         addiu   $gp,$gp,%lo(_gp)  */
12758
12759 static void
12760 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12761 {
12762   expressionS ex_off;
12763   expressionS ex_sym;
12764   int reg1;
12765
12766   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12767      We also need NewABI support.  */
12768   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12769     {
12770       s_ignore (0);
12771       return;
12772     }
12773
12774   reg1 = tc_get_register (0);
12775   SKIP_WHITESPACE ();
12776   if (*input_line_pointer != ',')
12777     {
12778       as_bad (_("missing argument separator ',' for .cpsetup"));
12779       return;
12780     }
12781   else
12782     ++input_line_pointer;
12783   SKIP_WHITESPACE ();
12784   if (*input_line_pointer == '$')
12785     {
12786       mips_cpreturn_register = tc_get_register (0);
12787       mips_cpreturn_offset = -1;
12788     }
12789   else
12790     {
12791       mips_cpreturn_offset = get_absolute_expression ();
12792       mips_cpreturn_register = -1;
12793     }
12794   SKIP_WHITESPACE ();
12795   if (*input_line_pointer != ',')
12796     {
12797       as_bad (_("missing argument separator ',' for .cpsetup"));
12798       return;
12799     }
12800   else
12801     ++input_line_pointer;
12802   SKIP_WHITESPACE ();
12803   expression (&ex_sym);
12804
12805   macro_start ();
12806   if (mips_cpreturn_register == -1)
12807     {
12808       ex_off.X_op = O_constant;
12809       ex_off.X_add_symbol = NULL;
12810       ex_off.X_op_symbol = NULL;
12811       ex_off.X_add_number = mips_cpreturn_offset;
12812
12813       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12814                    BFD_RELOC_LO16, SP);
12815     }
12816   else
12817     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12818                  mips_gp_register, 0);
12819
12820   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
12821     {
12822       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
12823                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
12824                    BFD_RELOC_HI16_S);
12825
12826       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12827                    mips_gp_register, -1, BFD_RELOC_GPREL16,
12828                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
12829
12830       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12831                    mips_gp_register, reg1);
12832     }
12833   else
12834     {
12835       expressionS ex;
12836
12837       ex.X_op = O_symbol;
12838       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
12839       ex.X_op_symbol = NULL;
12840       ex.X_add_number = 0;
12841
12842       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12843       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12844
12845       macro_build_lui (&ex, mips_gp_register);
12846       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12847                    mips_gp_register, BFD_RELOC_LO16);
12848     }
12849
12850   macro_end ();
12851
12852   demand_empty_rest_of_line ();
12853 }
12854
12855 static void
12856 s_cplocal (int ignore ATTRIBUTE_UNUSED)
12857 {
12858   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12859      .cplocal is ignored.  */
12860   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12861     {
12862       s_ignore (0);
12863       return;
12864     }
12865
12866   mips_gp_register = tc_get_register (0);
12867   demand_empty_rest_of_line ();
12868 }
12869
12870 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
12871    offset from $sp.  The offset is remembered, and after making a PIC
12872    call $gp is restored from that location.  */
12873
12874 static void
12875 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12876 {
12877   expressionS ex;
12878
12879   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12880      .cprestore is ignored.  */
12881   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12882     {
12883       s_ignore (0);
12884       return;
12885     }
12886
12887   mips_cprestore_offset = get_absolute_expression ();
12888   mips_cprestore_valid = 1;
12889
12890   ex.X_op = O_constant;
12891   ex.X_add_symbol = NULL;
12892   ex.X_op_symbol = NULL;
12893   ex.X_add_number = mips_cprestore_offset;
12894
12895   macro_start ();
12896   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12897                                 SP, HAVE_64BIT_ADDRESSES);
12898   macro_end ();
12899
12900   demand_empty_rest_of_line ();
12901 }
12902
12903 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12904    was given in the preceding .cpsetup, it results in:
12905      ld         $gp, offset($sp)
12906
12907    If a register $reg2 was given there, it results in:
12908      daddu      $gp, $reg2, $0  */
12909
12910 static void
12911 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12912 {
12913   expressionS ex;
12914
12915   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12916      We also need NewABI support.  */
12917   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12918     {
12919       s_ignore (0);
12920       return;
12921     }
12922
12923   macro_start ();
12924   if (mips_cpreturn_register == -1)
12925     {
12926       ex.X_op = O_constant;
12927       ex.X_add_symbol = NULL;
12928       ex.X_op_symbol = NULL;
12929       ex.X_add_number = mips_cpreturn_offset;
12930
12931       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12932     }
12933   else
12934     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12935                  mips_cpreturn_register, 0);
12936   macro_end ();
12937
12938   demand_empty_rest_of_line ();
12939 }
12940
12941 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
12942    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
12943    use in DWARF debug information.  */
12944
12945 static void
12946 s_dtprel_internal (size_t bytes)
12947 {
12948   expressionS ex;
12949   char *p;
12950
12951   expression (&ex);
12952
12953   if (ex.X_op != O_symbol)
12954     {
12955       as_bad (_("Unsupported use of %s"), (bytes == 8
12956                                            ? ".dtpreldword"
12957                                            : ".dtprelword"));
12958       ignore_rest_of_line ();
12959     }
12960
12961   p = frag_more (bytes);
12962   md_number_to_chars (p, 0, bytes);
12963   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
12964                (bytes == 8
12965                 ? BFD_RELOC_MIPS_TLS_DTPREL64
12966                 : BFD_RELOC_MIPS_TLS_DTPREL32));
12967
12968   demand_empty_rest_of_line ();
12969 }
12970
12971 /* Handle .dtprelword.  */
12972
12973 static void
12974 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
12975 {
12976   s_dtprel_internal (4);
12977 }
12978
12979 /* Handle .dtpreldword.  */
12980
12981 static void
12982 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
12983 {
12984   s_dtprel_internal (8);
12985 }
12986
12987 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12988    code.  It sets the offset to use in gp_rel relocations.  */
12989
12990 static void
12991 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12992 {
12993   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12994      We also need NewABI support.  */
12995   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12996     {
12997       s_ignore (0);
12998       return;
12999     }
13000
13001   mips_gprel_offset = get_absolute_expression ();
13002
13003   demand_empty_rest_of_line ();
13004 }
13005
13006 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13007    code.  It generates a 32 bit GP relative reloc.  */
13008
13009 static void
13010 s_gpword (int ignore ATTRIBUTE_UNUSED)
13011 {
13012   segment_info_type *si;
13013   struct insn_label_list *l;
13014   symbolS *label;
13015   expressionS ex;
13016   char *p;
13017
13018   /* When not generating PIC code, this is treated as .word.  */
13019   if (mips_pic != SVR4_PIC)
13020     {
13021       s_cons (2);
13022       return;
13023     }
13024
13025   si = seg_info (now_seg);
13026   l = si->label_list;
13027   label = l != NULL ? l->label : NULL;
13028   mips_emit_delays ();
13029   if (auto_align)
13030     mips_align (2, 0, label);
13031   mips_clear_insn_labels ();
13032
13033   expression (&ex);
13034
13035   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13036     {
13037       as_bad (_("Unsupported use of .gpword"));
13038       ignore_rest_of_line ();
13039     }
13040
13041   p = frag_more (4);
13042   md_number_to_chars (p, 0, 4);
13043   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13044                BFD_RELOC_GPREL32);
13045
13046   demand_empty_rest_of_line ();
13047 }
13048
13049 static void
13050 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13051 {
13052   segment_info_type *si;
13053   struct insn_label_list *l;
13054   symbolS *label;
13055   expressionS ex;
13056   char *p;
13057
13058   /* When not generating PIC code, this is treated as .dword.  */
13059   if (mips_pic != SVR4_PIC)
13060     {
13061       s_cons (3);
13062       return;
13063     }
13064
13065   si = seg_info (now_seg);
13066   l = si->label_list;
13067   label = l != NULL ? l->label : NULL;
13068   mips_emit_delays ();
13069   if (auto_align)
13070     mips_align (3, 0, label);
13071   mips_clear_insn_labels ();
13072
13073   expression (&ex);
13074
13075   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13076     {
13077       as_bad (_("Unsupported use of .gpdword"));
13078       ignore_rest_of_line ();
13079     }
13080
13081   p = frag_more (8);
13082   md_number_to_chars (p, 0, 8);
13083   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13084                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13085
13086   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13087   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13088            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13089
13090   demand_empty_rest_of_line ();
13091 }
13092
13093 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13094    tables in SVR4 PIC code.  */
13095
13096 static void
13097 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13098 {
13099   int reg;
13100
13101   /* This is ignored when not generating SVR4 PIC code.  */
13102   if (mips_pic != SVR4_PIC)
13103     {
13104       s_ignore (0);
13105       return;
13106     }
13107
13108   /* Add $gp to the register named as an argument.  */
13109   macro_start ();
13110   reg = tc_get_register (0);
13111   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13112   macro_end ();
13113
13114   demand_empty_rest_of_line ();
13115 }
13116
13117 /* Handle the .insn pseudo-op.  This marks instruction labels in
13118    mips16 mode.  This permits the linker to handle them specially,
13119    such as generating jalx instructions when needed.  We also make
13120    them odd for the duration of the assembly, in order to generate the
13121    right sort of code.  We will make them even in the adjust_symtab
13122    routine, while leaving them marked.  This is convenient for the
13123    debugger and the disassembler.  The linker knows to make them odd
13124    again.  */
13125
13126 static void
13127 s_insn (int ignore ATTRIBUTE_UNUSED)
13128 {
13129   mips16_mark_labels ();
13130
13131   demand_empty_rest_of_line ();
13132 }
13133
13134 /* Handle a .stabn directive.  We need these in order to mark a label
13135    as being a mips16 text label correctly.  Sometimes the compiler
13136    will emit a label, followed by a .stabn, and then switch sections.
13137    If the label and .stabn are in mips16 mode, then the label is
13138    really a mips16 text label.  */
13139
13140 static void
13141 s_mips_stab (int type)
13142 {
13143   if (type == 'n')
13144     mips16_mark_labels ();
13145
13146   s_stab (type);
13147 }
13148
13149 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13150
13151 static void
13152 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13153 {
13154   char *name;
13155   int c;
13156   symbolS *symbolP;
13157   expressionS exp;
13158
13159   name = input_line_pointer;
13160   c = get_symbol_end ();
13161   symbolP = symbol_find_or_make (name);
13162   S_SET_WEAK (symbolP);
13163   *input_line_pointer = c;
13164
13165   SKIP_WHITESPACE ();
13166
13167   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13168     {
13169       if (S_IS_DEFINED (symbolP))
13170         {
13171           as_bad ("ignoring attempt to redefine symbol %s",
13172                   S_GET_NAME (symbolP));
13173           ignore_rest_of_line ();
13174           return;
13175         }
13176
13177       if (*input_line_pointer == ',')
13178         {
13179           ++input_line_pointer;
13180           SKIP_WHITESPACE ();
13181         }
13182
13183       expression (&exp);
13184       if (exp.X_op != O_symbol)
13185         {
13186           as_bad ("bad .weakext directive");
13187           ignore_rest_of_line ();
13188           return;
13189         }
13190       symbol_set_value_expression (symbolP, &exp);
13191     }
13192
13193   demand_empty_rest_of_line ();
13194 }
13195
13196 /* Parse a register string into a number.  Called from the ECOFF code
13197    to parse .frame.  The argument is non-zero if this is the frame
13198    register, so that we can record it in mips_frame_reg.  */
13199
13200 int
13201 tc_get_register (int frame)
13202 {
13203   unsigned int reg;
13204
13205   SKIP_WHITESPACE ();
13206   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13207     reg = 0;
13208   if (frame)
13209     {
13210       mips_frame_reg = reg != 0 ? reg : SP;
13211       mips_frame_reg_valid = 1;
13212       mips_cprestore_valid = 0;
13213     }
13214   return reg;
13215 }
13216
13217 valueT
13218 md_section_align (asection *seg, valueT addr)
13219 {
13220   int align = bfd_get_section_alignment (stdoutput, seg);
13221
13222   if (IS_ELF)
13223     {
13224       /* We don't need to align ELF sections to the full alignment.
13225          However, Irix 5 may prefer that we align them at least to a 16
13226          byte boundary.  We don't bother to align the sections if we
13227          are targeted for an embedded system.  */
13228       if (strcmp (TARGET_OS, "elf") == 0)
13229         return addr;
13230       if (align > 4)
13231         align = 4;
13232     }
13233
13234   return ((addr + (1 << align) - 1) & (-1 << align));
13235 }
13236
13237 /* Utility routine, called from above as well.  If called while the
13238    input file is still being read, it's only an approximation.  (For
13239    example, a symbol may later become defined which appeared to be
13240    undefined earlier.)  */
13241
13242 static int
13243 nopic_need_relax (symbolS *sym, int before_relaxing)
13244 {
13245   if (sym == 0)
13246     return 0;
13247
13248   if (g_switch_value > 0)
13249     {
13250       const char *symname;
13251       int change;
13252
13253       /* Find out whether this symbol can be referenced off the $gp
13254          register.  It can be if it is smaller than the -G size or if
13255          it is in the .sdata or .sbss section.  Certain symbols can
13256          not be referenced off the $gp, although it appears as though
13257          they can.  */
13258       symname = S_GET_NAME (sym);
13259       if (symname != (const char *) NULL
13260           && (strcmp (symname, "eprol") == 0
13261               || strcmp (symname, "etext") == 0
13262               || strcmp (symname, "_gp") == 0
13263               || strcmp (symname, "edata") == 0
13264               || strcmp (symname, "_fbss") == 0
13265               || strcmp (symname, "_fdata") == 0
13266               || strcmp (symname, "_ftext") == 0
13267               || strcmp (symname, "end") == 0
13268               || strcmp (symname, "_gp_disp") == 0))
13269         change = 1;
13270       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13271                && (0
13272 #ifndef NO_ECOFF_DEBUGGING
13273                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13274                        && (symbol_get_obj (sym)->ecoff_extern_size
13275                            <= g_switch_value))
13276 #endif
13277                    /* We must defer this decision until after the whole
13278                       file has been read, since there might be a .extern
13279                       after the first use of this symbol.  */
13280                    || (before_relaxing
13281 #ifndef NO_ECOFF_DEBUGGING
13282                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13283 #endif
13284                        && S_GET_VALUE (sym) == 0)
13285                    || (S_GET_VALUE (sym) != 0
13286                        && S_GET_VALUE (sym) <= g_switch_value)))
13287         change = 0;
13288       else
13289         {
13290           const char *segname;
13291
13292           segname = segment_name (S_GET_SEGMENT (sym));
13293           assert (strcmp (segname, ".lit8") != 0
13294                   && strcmp (segname, ".lit4") != 0);
13295           change = (strcmp (segname, ".sdata") != 0
13296                     && strcmp (segname, ".sbss") != 0
13297                     && strncmp (segname, ".sdata.", 7) != 0
13298                     && strncmp (segname, ".sbss.", 6) != 0
13299                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13300                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13301         }
13302       return change;
13303     }
13304   else
13305     /* We are not optimizing for the $gp register.  */
13306     return 1;
13307 }
13308
13309
13310 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13311
13312 static bfd_boolean
13313 pic_need_relax (symbolS *sym, asection *segtype)
13314 {
13315   asection *symsec;
13316
13317   /* Handle the case of a symbol equated to another symbol.  */
13318   while (symbol_equated_reloc_p (sym))
13319     {
13320       symbolS *n;
13321
13322       /* It's possible to get a loop here in a badly written program.  */
13323       n = symbol_get_value_expression (sym)->X_add_symbol;
13324       if (n == sym)
13325         break;
13326       sym = n;
13327     }
13328
13329   if (symbol_section_p (sym))
13330     return TRUE;
13331
13332   symsec = S_GET_SEGMENT (sym);
13333
13334   /* This must duplicate the test in adjust_reloc_syms.  */
13335   return (symsec != &bfd_und_section
13336           && symsec != &bfd_abs_section
13337           && !bfd_is_com_section (symsec)
13338           && !s_is_linkonce (sym, segtype)
13339 #ifdef OBJ_ELF
13340           /* A global or weak symbol is treated as external.  */
13341           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13342 #endif
13343           );
13344 }
13345
13346
13347 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13348    extended opcode.  SEC is the section the frag is in.  */
13349
13350 static int
13351 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13352 {
13353   int type;
13354   const struct mips16_immed_operand *op;
13355   offsetT val;
13356   int mintiny, maxtiny;
13357   segT symsec;
13358   fragS *sym_frag;
13359
13360   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13361     return 0;
13362   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13363     return 1;
13364
13365   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13366   op = mips16_immed_operands;
13367   while (op->type != type)
13368     {
13369       ++op;
13370       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13371     }
13372
13373   if (op->unsp)
13374     {
13375       if (type == '<' || type == '>' || type == '[' || type == ']')
13376         {
13377           mintiny = 1;
13378           maxtiny = 1 << op->nbits;
13379         }
13380       else
13381         {
13382           mintiny = 0;
13383           maxtiny = (1 << op->nbits) - 1;
13384         }
13385     }
13386   else
13387     {
13388       mintiny = - (1 << (op->nbits - 1));
13389       maxtiny = (1 << (op->nbits - 1)) - 1;
13390     }
13391
13392   sym_frag = symbol_get_frag (fragp->fr_symbol);
13393   val = S_GET_VALUE (fragp->fr_symbol);
13394   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13395
13396   if (op->pcrel)
13397     {
13398       addressT addr;
13399
13400       /* We won't have the section when we are called from
13401          mips_relax_frag.  However, we will always have been called
13402          from md_estimate_size_before_relax first.  If this is a
13403          branch to a different section, we mark it as such.  If SEC is
13404          NULL, and the frag is not marked, then it must be a branch to
13405          the same section.  */
13406       if (sec == NULL)
13407         {
13408           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13409             return 1;
13410         }
13411       else
13412         {
13413           /* Must have been called from md_estimate_size_before_relax.  */
13414           if (symsec != sec)
13415             {
13416               fragp->fr_subtype =
13417                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13418
13419               /* FIXME: We should support this, and let the linker
13420                  catch branches and loads that are out of range.  */
13421               as_bad_where (fragp->fr_file, fragp->fr_line,
13422                             _("unsupported PC relative reference to different section"));
13423
13424               return 1;
13425             }
13426           if (fragp != sym_frag && sym_frag->fr_address == 0)
13427             /* Assume non-extended on the first relaxation pass.
13428                The address we have calculated will be bogus if this is
13429                a forward branch to another frag, as the forward frag
13430                will have fr_address == 0.  */
13431             return 0;
13432         }
13433
13434       /* In this case, we know for sure that the symbol fragment is in
13435          the same section.  If the relax_marker of the symbol fragment
13436          differs from the relax_marker of this fragment, we have not
13437          yet adjusted the symbol fragment fr_address.  We want to add
13438          in STRETCH in order to get a better estimate of the address.
13439          This particularly matters because of the shift bits.  */
13440       if (stretch != 0
13441           && sym_frag->relax_marker != fragp->relax_marker)
13442         {
13443           fragS *f;
13444
13445           /* Adjust stretch for any alignment frag.  Note that if have
13446              been expanding the earlier code, the symbol may be
13447              defined in what appears to be an earlier frag.  FIXME:
13448              This doesn't handle the fr_subtype field, which specifies
13449              a maximum number of bytes to skip when doing an
13450              alignment.  */
13451           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13452             {
13453               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13454                 {
13455                   if (stretch < 0)
13456                     stretch = - ((- stretch)
13457                                  & ~ ((1 << (int) f->fr_offset) - 1));
13458                   else
13459                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13460                   if (stretch == 0)
13461                     break;
13462                 }
13463             }
13464           if (f != NULL)
13465             val += stretch;
13466         }
13467
13468       addr = fragp->fr_address + fragp->fr_fix;
13469
13470       /* The base address rules are complicated.  The base address of
13471          a branch is the following instruction.  The base address of a
13472          PC relative load or add is the instruction itself, but if it
13473          is in a delay slot (in which case it can not be extended) use
13474          the address of the instruction whose delay slot it is in.  */
13475       if (type == 'p' || type == 'q')
13476         {
13477           addr += 2;
13478
13479           /* If we are currently assuming that this frag should be
13480              extended, then, the current address is two bytes
13481              higher.  */
13482           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13483             addr += 2;
13484
13485           /* Ignore the low bit in the target, since it will be set
13486              for a text label.  */
13487           if ((val & 1) != 0)
13488             --val;
13489         }
13490       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13491         addr -= 4;
13492       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13493         addr -= 2;
13494
13495       val -= addr & ~ ((1 << op->shift) - 1);
13496
13497       /* Branch offsets have an implicit 0 in the lowest bit.  */
13498       if (type == 'p' || type == 'q')
13499         val /= 2;
13500
13501       /* If any of the shifted bits are set, we must use an extended
13502          opcode.  If the address depends on the size of this
13503          instruction, this can lead to a loop, so we arrange to always
13504          use an extended opcode.  We only check this when we are in
13505          the main relaxation loop, when SEC is NULL.  */
13506       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13507         {
13508           fragp->fr_subtype =
13509             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13510           return 1;
13511         }
13512
13513       /* If we are about to mark a frag as extended because the value
13514          is precisely maxtiny + 1, then there is a chance of an
13515          infinite loop as in the following code:
13516              la $4,foo
13517              .skip      1020
13518              .align     2
13519            foo:
13520          In this case when the la is extended, foo is 0x3fc bytes
13521          away, so the la can be shrunk, but then foo is 0x400 away, so
13522          the la must be extended.  To avoid this loop, we mark the
13523          frag as extended if it was small, and is about to become
13524          extended with a value of maxtiny + 1.  */
13525       if (val == ((maxtiny + 1) << op->shift)
13526           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13527           && sec == NULL)
13528         {
13529           fragp->fr_subtype =
13530             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13531           return 1;
13532         }
13533     }
13534   else if (symsec != absolute_section && sec != NULL)
13535     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13536
13537   if ((val & ((1 << op->shift) - 1)) != 0
13538       || val < (mintiny << op->shift)
13539       || val > (maxtiny << op->shift))
13540     return 1;
13541   else
13542     return 0;
13543 }
13544
13545 /* Compute the length of a branch sequence, and adjust the
13546    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13547    worst-case length is computed, with UPDATE being used to indicate
13548    whether an unconditional (-1), branch-likely (+1) or regular (0)
13549    branch is to be computed.  */
13550 static int
13551 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13552 {
13553   bfd_boolean toofar;
13554   int length;
13555
13556   if (fragp
13557       && S_IS_DEFINED (fragp->fr_symbol)
13558       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13559     {
13560       addressT addr;
13561       offsetT val;
13562
13563       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13564
13565       addr = fragp->fr_address + fragp->fr_fix + 4;
13566
13567       val -= addr;
13568
13569       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13570     }
13571   else if (fragp)
13572     /* If the symbol is not defined or it's in a different segment,
13573        assume the user knows what's going on and emit a short
13574        branch.  */
13575     toofar = FALSE;
13576   else
13577     toofar = TRUE;
13578
13579   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13580     fragp->fr_subtype
13581       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13582                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13583                              RELAX_BRANCH_LINK (fragp->fr_subtype),
13584                              toofar);
13585
13586   length = 4;
13587   if (toofar)
13588     {
13589       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13590         length += 8;
13591
13592       if (mips_pic != NO_PIC)
13593         {
13594           /* Additional space for PIC loading of target address.  */
13595           length += 8;
13596           if (mips_opts.isa == ISA_MIPS1)
13597             /* Additional space for $at-stabilizing nop.  */
13598             length += 4;
13599         }
13600
13601       /* If branch is conditional.  */
13602       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13603         length += 8;
13604     }
13605
13606   return length;
13607 }
13608
13609 /* Estimate the size of a frag before relaxing.  Unless this is the
13610    mips16, we are not really relaxing here, and the final size is
13611    encoded in the subtype information.  For the mips16, we have to
13612    decide whether we are using an extended opcode or not.  */
13613
13614 int
13615 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13616 {
13617   int change;
13618
13619   if (RELAX_BRANCH_P (fragp->fr_subtype))
13620     {
13621
13622       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13623
13624       return fragp->fr_var;
13625     }
13626
13627   if (RELAX_MIPS16_P (fragp->fr_subtype))
13628     /* We don't want to modify the EXTENDED bit here; it might get us
13629        into infinite loops.  We change it only in mips_relax_frag().  */
13630     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13631
13632   if (mips_pic == NO_PIC)
13633     change = nopic_need_relax (fragp->fr_symbol, 0);
13634   else if (mips_pic == SVR4_PIC)
13635     change = pic_need_relax (fragp->fr_symbol, segtype);
13636   else if (mips_pic == VXWORKS_PIC)
13637     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
13638     change = 0;
13639   else
13640     abort ();
13641
13642   if (change)
13643     {
13644       fragp->fr_subtype |= RELAX_USE_SECOND;
13645       return -RELAX_FIRST (fragp->fr_subtype);
13646     }
13647   else
13648     return -RELAX_SECOND (fragp->fr_subtype);
13649 }
13650
13651 /* This is called to see whether a reloc against a defined symbol
13652    should be converted into a reloc against a section.  */
13653
13654 int
13655 mips_fix_adjustable (fixS *fixp)
13656 {
13657   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13658       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13659     return 0;
13660
13661   if (fixp->fx_addsy == NULL)
13662     return 1;
13663
13664   /* If symbol SYM is in a mergeable section, relocations of the form
13665      SYM + 0 can usually be made section-relative.  The mergeable data
13666      is then identified by the section offset rather than by the symbol.
13667
13668      However, if we're generating REL LO16 relocations, the offset is split
13669      between the LO16 and parterning high part relocation.  The linker will
13670      need to recalculate the complete offset in order to correctly identify
13671      the merge data.
13672
13673      The linker has traditionally not looked for the parterning high part
13674      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13675      placed anywhere.  Rather than break backwards compatibility by changing
13676      this, it seems better not to force the issue, and instead keep the
13677      original symbol.  This will work with either linker behavior.  */
13678   if ((fixp->fx_r_type == BFD_RELOC_LO16
13679        || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
13680        || reloc_needs_lo_p (fixp->fx_r_type))
13681       && HAVE_IN_PLACE_ADDENDS
13682       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13683     return 0;
13684
13685 #ifdef OBJ_ELF
13686   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
13687      to a floating-point stub.  The same is true for non-R_MIPS16_26
13688      relocations against MIPS16 functions; in this case, the stub becomes
13689      the function's canonical address.
13690
13691      Floating-point stubs are stored in unique .mips16.call.* or
13692      .mips16.fn.* sections.  If a stub T for function F is in section S,
13693      the first relocation in section S must be against F; this is how the
13694      linker determines the target function.  All relocations that might
13695      resolve to T must also be against F.  We therefore have the following
13696      restrictions, which are given in an intentionally-redundant way:
13697
13698        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
13699           symbols.
13700
13701        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
13702           if that stub might be used.
13703
13704        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
13705           symbols.
13706
13707        4. We cannot reduce a stub's relocations against MIPS16 symbols if
13708           that stub might be used.
13709
13710      There is a further restriction:
13711
13712        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
13713           on targets with in-place addends; the relocation field cannot
13714           encode the low bit.
13715
13716      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
13717      against a MIPS16 symbol.
13718
13719      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
13720      relocation against some symbol R, no relocation against R may be
13721      reduced.  (Note that this deals with (2) as well as (1) because
13722      relocations against global symbols will never be reduced on ELF
13723      targets.)  This approach is a little simpler than trying to detect
13724      stub sections, and gives the "all or nothing" per-symbol consistency
13725      that we have for MIPS16 symbols.  */
13726   if (IS_ELF
13727       && fixp->fx_subsy == NULL
13728       && (S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13729           || *symbol_get_tc (fixp->fx_addsy)))
13730     return 0;
13731 #endif
13732
13733   return 1;
13734 }
13735
13736 /* Translate internal representation of relocation info to BFD target
13737    format.  */
13738
13739 arelent **
13740 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13741 {
13742   static arelent *retval[4];
13743   arelent *reloc;
13744   bfd_reloc_code_real_type code;
13745
13746   memset (retval, 0, sizeof(retval));
13747   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13748   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13749   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13750   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13751
13752   if (fixp->fx_pcrel)
13753     {
13754       assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
13755
13756       /* At this point, fx_addnumber is "symbol offset - pcrel address".
13757          Relocations want only the symbol offset.  */
13758       reloc->addend = fixp->fx_addnumber + reloc->address;
13759       if (!IS_ELF)
13760         {
13761           /* A gruesome hack which is a result of the gruesome gas
13762              reloc handling.  What's worse, for COFF (as opposed to
13763              ECOFF), we might need yet another copy of reloc->address.
13764              See bfd_install_relocation.  */
13765           reloc->addend += reloc->address;
13766         }
13767     }
13768   else
13769     reloc->addend = fixp->fx_addnumber;
13770
13771   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13772      entry to be used in the relocation's section offset.  */
13773   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13774     {
13775       reloc->address = reloc->addend;
13776       reloc->addend = 0;
13777     }
13778
13779   code = fixp->fx_r_type;
13780
13781   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13782   if (reloc->howto == NULL)
13783     {
13784       as_bad_where (fixp->fx_file, fixp->fx_line,
13785                     _("Can not represent %s relocation in this object file format"),
13786                     bfd_get_reloc_code_name (code));
13787       retval[0] = NULL;
13788     }
13789
13790   return retval;
13791 }
13792
13793 /* Relax a machine dependent frag.  This returns the amount by which
13794    the current size of the frag should change.  */
13795
13796 int
13797 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13798 {
13799   if (RELAX_BRANCH_P (fragp->fr_subtype))
13800     {
13801       offsetT old_var = fragp->fr_var;
13802
13803       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13804
13805       return fragp->fr_var - old_var;
13806     }
13807
13808   if (! RELAX_MIPS16_P (fragp->fr_subtype))
13809     return 0;
13810
13811   if (mips16_extended_frag (fragp, NULL, stretch))
13812     {
13813       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13814         return 0;
13815       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13816       return 2;
13817     }
13818   else
13819     {
13820       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13821         return 0;
13822       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13823       return -2;
13824     }
13825
13826   return 0;
13827 }
13828
13829 /* Convert a machine dependent frag.  */
13830
13831 void
13832 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13833 {
13834   if (RELAX_BRANCH_P (fragp->fr_subtype))
13835     {
13836       bfd_byte *buf;
13837       unsigned long insn;
13838       expressionS exp;
13839       fixS *fixp;
13840
13841       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13842
13843       if (target_big_endian)
13844         insn = bfd_getb32 (buf);
13845       else
13846         insn = bfd_getl32 (buf);
13847
13848       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13849         {
13850           /* We generate a fixup instead of applying it right now
13851              because, if there are linker relaxations, we're going to
13852              need the relocations.  */
13853           exp.X_op = O_symbol;
13854           exp.X_add_symbol = fragp->fr_symbol;
13855           exp.X_add_number = fragp->fr_offset;
13856
13857           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13858                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
13859           fixp->fx_file = fragp->fr_file;
13860           fixp->fx_line = fragp->fr_line;
13861
13862           md_number_to_chars ((char *) buf, insn, 4);
13863           buf += 4;
13864         }
13865       else
13866         {
13867           int i;
13868
13869           as_warn_where (fragp->fr_file, fragp->fr_line,
13870                          _("relaxed out-of-range branch into a jump"));
13871
13872           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13873             goto uncond;
13874
13875           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13876             {
13877               /* Reverse the branch.  */
13878               switch ((insn >> 28) & 0xf)
13879                 {
13880                 case 4:
13881                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13882                      have the condition reversed by tweaking a single
13883                      bit, and their opcodes all have 0x4???????.  */
13884                   assert ((insn & 0xf1000000) == 0x41000000);
13885                   insn ^= 0x00010000;
13886                   break;
13887
13888                 case 0:
13889                   /* bltz       0x04000000      bgez    0x04010000
13890                      bltzal     0x04100000      bgezal  0x04110000  */
13891                   assert ((insn & 0xfc0e0000) == 0x04000000);
13892                   insn ^= 0x00010000;
13893                   break;
13894
13895                 case 1:
13896                   /* beq        0x10000000      bne     0x14000000
13897                      blez       0x18000000      bgtz    0x1c000000  */
13898                   insn ^= 0x04000000;
13899                   break;
13900
13901                 default:
13902                   abort ();
13903                 }
13904             }
13905
13906           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13907             {
13908               /* Clear the and-link bit.  */
13909               assert ((insn & 0xfc1c0000) == 0x04100000);
13910
13911               /* bltzal         0x04100000      bgezal  0x04110000
13912                  bltzall        0x04120000      bgezall 0x04130000  */
13913               insn &= ~0x00100000;
13914             }
13915
13916           /* Branch over the branch (if the branch was likely) or the
13917              full jump (not likely case).  Compute the offset from the
13918              current instruction to branch to.  */
13919           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13920             i = 16;
13921           else
13922             {
13923               /* How many bytes in instructions we've already emitted?  */
13924               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13925               /* How many bytes in instructions from here to the end?  */
13926               i = fragp->fr_var - i;
13927             }
13928           /* Convert to instruction count.  */
13929           i >>= 2;
13930           /* Branch counts from the next instruction.  */
13931           i--;
13932           insn |= i;
13933           /* Branch over the jump.  */
13934           md_number_to_chars ((char *) buf, insn, 4);
13935           buf += 4;
13936
13937           /* nop */
13938           md_number_to_chars ((char *) buf, 0, 4);
13939           buf += 4;
13940
13941           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13942             {
13943               /* beql $0, $0, 2f */
13944               insn = 0x50000000;
13945               /* Compute the PC offset from the current instruction to
13946                  the end of the variable frag.  */
13947               /* How many bytes in instructions we've already emitted?  */
13948               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13949               /* How many bytes in instructions from here to the end?  */
13950               i = fragp->fr_var - i;
13951               /* Convert to instruction count.  */
13952               i >>= 2;
13953               /* Don't decrement i, because we want to branch over the
13954                  delay slot.  */
13955
13956               insn |= i;
13957               md_number_to_chars ((char *) buf, insn, 4);
13958               buf += 4;
13959
13960               md_number_to_chars ((char *) buf, 0, 4);
13961               buf += 4;
13962             }
13963
13964         uncond:
13965           if (mips_pic == NO_PIC)
13966             {
13967               /* j or jal.  */
13968               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13969                       ? 0x0c000000 : 0x08000000);
13970               exp.X_op = O_symbol;
13971               exp.X_add_symbol = fragp->fr_symbol;
13972               exp.X_add_number = fragp->fr_offset;
13973
13974               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13975                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
13976               fixp->fx_file = fragp->fr_file;
13977               fixp->fx_line = fragp->fr_line;
13978
13979               md_number_to_chars ((char *) buf, insn, 4);
13980               buf += 4;
13981             }
13982           else
13983             {
13984               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13985               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13986               exp.X_op = O_symbol;
13987               exp.X_add_symbol = fragp->fr_symbol;
13988               exp.X_add_number = fragp->fr_offset;
13989
13990               if (fragp->fr_offset)
13991                 {
13992                   exp.X_add_symbol = make_expr_symbol (&exp);
13993                   exp.X_add_number = 0;
13994                 }
13995
13996               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13997                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
13998               fixp->fx_file = fragp->fr_file;
13999               fixp->fx_line = fragp->fr_line;
14000
14001               md_number_to_chars ((char *) buf, insn, 4);
14002               buf += 4;
14003
14004               if (mips_opts.isa == ISA_MIPS1)
14005                 {
14006                   /* nop */
14007                   md_number_to_chars ((char *) buf, 0, 4);
14008                   buf += 4;
14009                 }
14010
14011               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14012               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14013
14014               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14015                                   4, &exp, FALSE, BFD_RELOC_LO16);
14016               fixp->fx_file = fragp->fr_file;
14017               fixp->fx_line = fragp->fr_line;
14018
14019               md_number_to_chars ((char *) buf, insn, 4);
14020               buf += 4;
14021
14022               /* j(al)r $at.  */
14023               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14024                 insn = 0x0020f809;
14025               else
14026                 insn = 0x00200008;
14027
14028               md_number_to_chars ((char *) buf, insn, 4);
14029               buf += 4;
14030             }
14031         }
14032
14033       assert (buf == (bfd_byte *)fragp->fr_literal
14034               + fragp->fr_fix + fragp->fr_var);
14035
14036       fragp->fr_fix += fragp->fr_var;
14037
14038       return;
14039     }
14040
14041   if (RELAX_MIPS16_P (fragp->fr_subtype))
14042     {
14043       int type;
14044       const struct mips16_immed_operand *op;
14045       bfd_boolean small, ext;
14046       offsetT val;
14047       bfd_byte *buf;
14048       unsigned long insn;
14049       bfd_boolean use_extend;
14050       unsigned short extend;
14051
14052       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14053       op = mips16_immed_operands;
14054       while (op->type != type)
14055         ++op;
14056
14057       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14058         {
14059           small = FALSE;
14060           ext = TRUE;
14061         }
14062       else
14063         {
14064           small = TRUE;
14065           ext = FALSE;
14066         }
14067
14068       resolve_symbol_value (fragp->fr_symbol);
14069       val = S_GET_VALUE (fragp->fr_symbol);
14070       if (op->pcrel)
14071         {
14072           addressT addr;
14073
14074           addr = fragp->fr_address + fragp->fr_fix;
14075
14076           /* The rules for the base address of a PC relative reloc are
14077              complicated; see mips16_extended_frag.  */
14078           if (type == 'p' || type == 'q')
14079             {
14080               addr += 2;
14081               if (ext)
14082                 addr += 2;
14083               /* Ignore the low bit in the target, since it will be
14084                  set for a text label.  */
14085               if ((val & 1) != 0)
14086                 --val;
14087             }
14088           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14089             addr -= 4;
14090           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14091             addr -= 2;
14092
14093           addr &= ~ (addressT) ((1 << op->shift) - 1);
14094           val -= addr;
14095
14096           /* Make sure the section winds up with the alignment we have
14097              assumed.  */
14098           if (op->shift > 0)
14099             record_alignment (asec, op->shift);
14100         }
14101
14102       if (ext
14103           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14104               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14105         as_warn_where (fragp->fr_file, fragp->fr_line,
14106                        _("extended instruction in delay slot"));
14107
14108       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14109
14110       if (target_big_endian)
14111         insn = bfd_getb16 (buf);
14112       else
14113         insn = bfd_getl16 (buf);
14114
14115       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14116                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14117                     small, ext, &insn, &use_extend, &extend);
14118
14119       if (use_extend)
14120         {
14121           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14122           fragp->fr_fix += 2;
14123           buf += 2;
14124         }
14125
14126       md_number_to_chars ((char *) buf, insn, 2);
14127       fragp->fr_fix += 2;
14128       buf += 2;
14129     }
14130   else
14131     {
14132       int first, second;
14133       fixS *fixp;
14134
14135       first = RELAX_FIRST (fragp->fr_subtype);
14136       second = RELAX_SECOND (fragp->fr_subtype);
14137       fixp = (fixS *) fragp->fr_opcode;
14138
14139       /* Possibly emit a warning if we've chosen the longer option.  */
14140       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14141           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14142         {
14143           const char *msg = macro_warning (fragp->fr_subtype);
14144           if (msg != 0)
14145             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
14146         }
14147
14148       /* Go through all the fixups for the first sequence.  Disable them
14149          (by marking them as done) if we're going to use the second
14150          sequence instead.  */
14151       while (fixp
14152              && fixp->fx_frag == fragp
14153              && fixp->fx_where < fragp->fr_fix - second)
14154         {
14155           if (fragp->fr_subtype & RELAX_USE_SECOND)
14156             fixp->fx_done = 1;
14157           fixp = fixp->fx_next;
14158         }
14159
14160       /* Go through the fixups for the second sequence.  Disable them if
14161          we're going to use the first sequence, otherwise adjust their
14162          addresses to account for the relaxation.  */
14163       while (fixp && fixp->fx_frag == fragp)
14164         {
14165           if (fragp->fr_subtype & RELAX_USE_SECOND)
14166             fixp->fx_where -= first;
14167           else
14168             fixp->fx_done = 1;
14169           fixp = fixp->fx_next;
14170         }
14171
14172       /* Now modify the frag contents.  */
14173       if (fragp->fr_subtype & RELAX_USE_SECOND)
14174         {
14175           char *start;
14176
14177           start = fragp->fr_literal + fragp->fr_fix - first - second;
14178           memmove (start, start + first, second);
14179           fragp->fr_fix -= first;
14180         }
14181       else
14182         fragp->fr_fix -= second;
14183     }
14184 }
14185
14186 #ifdef OBJ_ELF
14187
14188 /* This function is called after the relocs have been generated.
14189    We've been storing mips16 text labels as odd.  Here we convert them
14190    back to even for the convenience of the debugger.  */
14191
14192 void
14193 mips_frob_file_after_relocs (void)
14194 {
14195   asymbol **syms;
14196   unsigned int count, i;
14197
14198   if (!IS_ELF)
14199     return;
14200
14201   syms = bfd_get_outsymbols (stdoutput);
14202   count = bfd_get_symcount (stdoutput);
14203   for (i = 0; i < count; i++, syms++)
14204     {
14205       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
14206           && ((*syms)->value & 1) != 0)
14207         {
14208           (*syms)->value &= ~1;
14209           /* If the symbol has an odd size, it was probably computed
14210              incorrectly, so adjust that as well.  */
14211           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14212             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14213         }
14214     }
14215 }
14216
14217 #endif
14218
14219 /* This function is called whenever a label is defined.  It is used
14220    when handling branch delays; if a branch has a label, we assume we
14221    can not move it.  */
14222
14223 void
14224 mips_define_label (symbolS *sym)
14225 {
14226   segment_info_type *si = seg_info (now_seg);
14227   struct insn_label_list *l;
14228
14229   if (free_insn_labels == NULL)
14230     l = (struct insn_label_list *) xmalloc (sizeof *l);
14231   else
14232     {
14233       l = free_insn_labels;
14234       free_insn_labels = l->next;
14235     }
14236
14237   l->label = sym;
14238   l->next = si->label_list;
14239   si->label_list = l;
14240
14241 #ifdef OBJ_ELF
14242   dwarf2_emit_label (sym);
14243 #endif
14244 }
14245 \f
14246 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14247
14248 /* Some special processing for a MIPS ELF file.  */
14249
14250 void
14251 mips_elf_final_processing (void)
14252 {
14253   /* Write out the register information.  */
14254   if (mips_abi != N64_ABI)
14255     {
14256       Elf32_RegInfo s;
14257
14258       s.ri_gprmask = mips_gprmask;
14259       s.ri_cprmask[0] = mips_cprmask[0];
14260       s.ri_cprmask[1] = mips_cprmask[1];
14261       s.ri_cprmask[2] = mips_cprmask[2];
14262       s.ri_cprmask[3] = mips_cprmask[3];
14263       /* The gp_value field is set by the MIPS ELF backend.  */
14264
14265       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14266                                        ((Elf32_External_RegInfo *)
14267                                         mips_regmask_frag));
14268     }
14269   else
14270     {
14271       Elf64_Internal_RegInfo s;
14272
14273       s.ri_gprmask = mips_gprmask;
14274       s.ri_pad = 0;
14275       s.ri_cprmask[0] = mips_cprmask[0];
14276       s.ri_cprmask[1] = mips_cprmask[1];
14277       s.ri_cprmask[2] = mips_cprmask[2];
14278       s.ri_cprmask[3] = mips_cprmask[3];
14279       /* The gp_value field is set by the MIPS ELF backend.  */
14280
14281       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14282                                        ((Elf64_External_RegInfo *)
14283                                         mips_regmask_frag));
14284     }
14285
14286   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14287      sort of BFD interface for this.  */
14288   if (mips_any_noreorder)
14289     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14290   if (mips_pic != NO_PIC)
14291     {
14292     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14293       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14294     }
14295   if (mips_abicalls)
14296     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14297
14298   /* Set MIPS ELF flags for ASEs.  */
14299   /* We may need to define a new flag for DSP ASE, and set this flag when
14300      file_ase_dsp is true.  */
14301   /* Same for DSP R2.  */
14302   /* We may need to define a new flag for MT ASE, and set this flag when
14303      file_ase_mt is true.  */
14304   if (file_ase_mips16)
14305     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14306 #if 0 /* XXX FIXME */
14307   if (file_ase_mips3d)
14308     elf_elfheader (stdoutput)->e_flags |= ???;
14309 #endif
14310   if (file_ase_mdmx)
14311     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14312
14313   /* Set the MIPS ELF ABI flags.  */
14314   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14315     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14316   else if (mips_abi == O64_ABI)
14317     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14318   else if (mips_abi == EABI_ABI)
14319     {
14320       if (!file_mips_gp32)
14321         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14322       else
14323         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14324     }
14325   else if (mips_abi == N32_ABI)
14326     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14327
14328   /* Nothing to do for N64_ABI.  */
14329
14330   if (mips_32bitmode)
14331     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14332
14333 #if 0 /* XXX FIXME */
14334   /* 32 bit code with 64 bit FP registers.  */
14335   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14336     elf_elfheader (stdoutput)->e_flags |= ???;
14337 #endif
14338 }
14339
14340 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14341 \f
14342 typedef struct proc {
14343   symbolS *func_sym;
14344   symbolS *func_end_sym;
14345   unsigned long reg_mask;
14346   unsigned long reg_offset;
14347   unsigned long fpreg_mask;
14348   unsigned long fpreg_offset;
14349   unsigned long frame_offset;
14350   unsigned long frame_reg;
14351   unsigned long pc_reg;
14352 } procS;
14353
14354 static procS cur_proc;
14355 static procS *cur_proc_ptr;
14356 static int numprocs;
14357
14358 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14359    nop as "0".  */
14360
14361 char
14362 mips_nop_opcode (void)
14363 {
14364   return seg_info (now_seg)->tc_segment_info_data.mips16;
14365 }
14366
14367 /* Fill in an rs_align_code fragment.  This only needs to do something
14368    for MIPS16 code, where 0 is not a nop.  */
14369
14370 void
14371 mips_handle_align (fragS *fragp)
14372 {
14373   char *p;
14374
14375   if (fragp->fr_type != rs_align_code)
14376     return;
14377
14378   p = fragp->fr_literal + fragp->fr_fix;
14379   if (*p)
14380     {
14381       int bytes;
14382
14383       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14384       if (bytes & 1)
14385         {
14386           *p++ = 0;
14387           fragp->fr_fix++;
14388         }
14389       md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
14390       fragp->fr_var = 2;
14391     }
14392 }
14393
14394 static void
14395 md_obj_begin (void)
14396 {
14397 }
14398
14399 static void
14400 md_obj_end (void)
14401 {
14402   /* Check for premature end, nesting errors, etc.  */
14403   if (cur_proc_ptr)
14404     as_warn (_("missing .end at end of assembly"));
14405 }
14406
14407 static long
14408 get_number (void)
14409 {
14410   int negative = 0;
14411   long val = 0;
14412
14413   if (*input_line_pointer == '-')
14414     {
14415       ++input_line_pointer;
14416       negative = 1;
14417     }
14418   if (!ISDIGIT (*input_line_pointer))
14419     as_bad (_("expected simple number"));
14420   if (input_line_pointer[0] == '0')
14421     {
14422       if (input_line_pointer[1] == 'x')
14423         {
14424           input_line_pointer += 2;
14425           while (ISXDIGIT (*input_line_pointer))
14426             {
14427               val <<= 4;
14428               val |= hex_value (*input_line_pointer++);
14429             }
14430           return negative ? -val : val;
14431         }
14432       else
14433         {
14434           ++input_line_pointer;
14435           while (ISDIGIT (*input_line_pointer))
14436             {
14437               val <<= 3;
14438               val |= *input_line_pointer++ - '0';
14439             }
14440           return negative ? -val : val;
14441         }
14442     }
14443   if (!ISDIGIT (*input_line_pointer))
14444     {
14445       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14446               *input_line_pointer, *input_line_pointer);
14447       as_warn (_("invalid number"));
14448       return -1;
14449     }
14450   while (ISDIGIT (*input_line_pointer))
14451     {
14452       val *= 10;
14453       val += *input_line_pointer++ - '0';
14454     }
14455   return negative ? -val : val;
14456 }
14457
14458 /* The .file directive; just like the usual .file directive, but there
14459    is an initial number which is the ECOFF file index.  In the non-ECOFF
14460    case .file implies DWARF-2.  */
14461
14462 static void
14463 s_mips_file (int x ATTRIBUTE_UNUSED)
14464 {
14465   static int first_file_directive = 0;
14466
14467   if (ECOFF_DEBUGGING)
14468     {
14469       get_number ();
14470       s_app_file (0);
14471     }
14472   else
14473     {
14474       char *filename;
14475
14476       filename = dwarf2_directive_file (0);
14477
14478       /* Versions of GCC up to 3.1 start files with a ".file"
14479          directive even for stabs output.  Make sure that this
14480          ".file" is handled.  Note that you need a version of GCC
14481          after 3.1 in order to support DWARF-2 on MIPS.  */
14482       if (filename != NULL && ! first_file_directive)
14483         {
14484           (void) new_logical_line (filename, -1);
14485           s_app_file_string (filename, 0);
14486         }
14487       first_file_directive = 1;
14488     }
14489 }
14490
14491 /* The .loc directive, implying DWARF-2.  */
14492
14493 static void
14494 s_mips_loc (int x ATTRIBUTE_UNUSED)
14495 {
14496   if (!ECOFF_DEBUGGING)
14497     dwarf2_directive_loc (0);
14498 }
14499
14500 /* The .end directive.  */
14501
14502 static void
14503 s_mips_end (int x ATTRIBUTE_UNUSED)
14504 {
14505   symbolS *p;
14506
14507   /* Following functions need their own .frame and .cprestore directives.  */
14508   mips_frame_reg_valid = 0;
14509   mips_cprestore_valid = 0;
14510
14511   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14512     {
14513       p = get_symbol ();
14514       demand_empty_rest_of_line ();
14515     }
14516   else
14517     p = NULL;
14518
14519   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14520     as_warn (_(".end not in text section"));
14521
14522   if (!cur_proc_ptr)
14523     {
14524       as_warn (_(".end directive without a preceding .ent directive."));
14525       demand_empty_rest_of_line ();
14526       return;
14527     }
14528
14529   if (p != NULL)
14530     {
14531       assert (S_GET_NAME (p));
14532       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14533         as_warn (_(".end symbol does not match .ent symbol."));
14534
14535       if (debug_type == DEBUG_STABS)
14536         stabs_generate_asm_endfunc (S_GET_NAME (p),
14537                                     S_GET_NAME (p));
14538     }
14539   else
14540     as_warn (_(".end directive missing or unknown symbol"));
14541
14542 #ifdef OBJ_ELF
14543   /* Create an expression to calculate the size of the function.  */
14544   if (p && cur_proc_ptr)
14545     {
14546       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14547       expressionS *exp = xmalloc (sizeof (expressionS));
14548
14549       obj->size = exp;
14550       exp->X_op = O_subtract;
14551       exp->X_add_symbol = symbol_temp_new_now ();
14552       exp->X_op_symbol = p;
14553       exp->X_add_number = 0;
14554
14555       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14556     }
14557
14558   /* Generate a .pdr section.  */
14559   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14560     {
14561       segT saved_seg = now_seg;
14562       subsegT saved_subseg = now_subseg;
14563       valueT dot;
14564       expressionS exp;
14565       char *fragp;
14566
14567       dot = frag_now_fix ();
14568
14569 #ifdef md_flush_pending_output
14570       md_flush_pending_output ();
14571 #endif
14572
14573       assert (pdr_seg);
14574       subseg_set (pdr_seg, 0);
14575
14576       /* Write the symbol.  */
14577       exp.X_op = O_symbol;
14578       exp.X_add_symbol = p;
14579       exp.X_add_number = 0;
14580       emit_expr (&exp, 4);
14581
14582       fragp = frag_more (7 * 4);
14583
14584       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14585       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14586       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14587       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14588       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14589       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14590       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14591
14592       subseg_set (saved_seg, saved_subseg);
14593     }
14594 #endif /* OBJ_ELF */
14595
14596   cur_proc_ptr = NULL;
14597 }
14598
14599 /* The .aent and .ent directives.  */
14600
14601 static void
14602 s_mips_ent (int aent)
14603 {
14604   symbolS *symbolP;
14605
14606   symbolP = get_symbol ();
14607   if (*input_line_pointer == ',')
14608     ++input_line_pointer;
14609   SKIP_WHITESPACE ();
14610   if (ISDIGIT (*input_line_pointer)
14611       || *input_line_pointer == '-')
14612     get_number ();
14613
14614   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14615     as_warn (_(".ent or .aent not in text section."));
14616
14617   if (!aent && cur_proc_ptr)
14618     as_warn (_("missing .end"));
14619
14620   if (!aent)
14621     {
14622       /* This function needs its own .frame and .cprestore directives.  */
14623       mips_frame_reg_valid = 0;
14624       mips_cprestore_valid = 0;
14625
14626       cur_proc_ptr = &cur_proc;
14627       memset (cur_proc_ptr, '\0', sizeof (procS));
14628
14629       cur_proc_ptr->func_sym = symbolP;
14630
14631       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14632
14633       ++numprocs;
14634
14635       if (debug_type == DEBUG_STABS)
14636         stabs_generate_asm_func (S_GET_NAME (symbolP),
14637                                  S_GET_NAME (symbolP));
14638     }
14639
14640   demand_empty_rest_of_line ();
14641 }
14642
14643 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14644    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14645    s_mips_frame is used so that we can set the PDR information correctly.
14646    We can't use the ecoff routines because they make reference to the ecoff
14647    symbol table (in the mdebug section).  */
14648
14649 static void
14650 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14651 {
14652 #ifdef OBJ_ELF
14653   if (IS_ELF && !ECOFF_DEBUGGING)
14654     {
14655       long val;
14656
14657       if (cur_proc_ptr == (procS *) NULL)
14658         {
14659           as_warn (_(".frame outside of .ent"));
14660           demand_empty_rest_of_line ();
14661           return;
14662         }
14663
14664       cur_proc_ptr->frame_reg = tc_get_register (1);
14665
14666       SKIP_WHITESPACE ();
14667       if (*input_line_pointer++ != ','
14668           || get_absolute_expression_and_terminator (&val) != ',')
14669         {
14670           as_warn (_("Bad .frame directive"));
14671           --input_line_pointer;
14672           demand_empty_rest_of_line ();
14673           return;
14674         }
14675
14676       cur_proc_ptr->frame_offset = val;
14677       cur_proc_ptr->pc_reg = tc_get_register (0);
14678
14679       demand_empty_rest_of_line ();
14680     }
14681   else
14682 #endif /* OBJ_ELF */
14683     s_ignore (ignore);
14684 }
14685
14686 /* The .fmask and .mask directives. If the mdebug section is present
14687    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14688    embedded targets, s_mips_mask is used so that we can set the PDR
14689    information correctly. We can't use the ecoff routines because they
14690    make reference to the ecoff symbol table (in the mdebug section).  */
14691
14692 static void
14693 s_mips_mask (int reg_type)
14694 {
14695 #ifdef OBJ_ELF
14696   if (IS_ELF && !ECOFF_DEBUGGING)
14697     {
14698       long mask, off;
14699
14700       if (cur_proc_ptr == (procS *) NULL)
14701         {
14702           as_warn (_(".mask/.fmask outside of .ent"));
14703           demand_empty_rest_of_line ();
14704           return;
14705         }
14706
14707       if (get_absolute_expression_and_terminator (&mask) != ',')
14708         {
14709           as_warn (_("Bad .mask/.fmask directive"));
14710           --input_line_pointer;
14711           demand_empty_rest_of_line ();
14712           return;
14713         }
14714
14715       off = get_absolute_expression ();
14716
14717       if (reg_type == 'F')
14718         {
14719           cur_proc_ptr->fpreg_mask = mask;
14720           cur_proc_ptr->fpreg_offset = off;
14721         }
14722       else
14723         {
14724           cur_proc_ptr->reg_mask = mask;
14725           cur_proc_ptr->reg_offset = off;
14726         }
14727
14728       demand_empty_rest_of_line ();
14729     }
14730   else
14731 #endif /* OBJ_ELF */
14732     s_ignore (reg_type);
14733 }
14734
14735 /* A table describing all the processors gas knows about.  Names are
14736    matched in the order listed.
14737
14738    To ease comparison, please keep this table in the same order as
14739    gcc's mips_cpu_info_table[].  */
14740 static const struct mips_cpu_info mips_cpu_info_table[] =
14741 {
14742   /* Entries for generic ISAs */
14743   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
14744   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
14745   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
14746   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
14747   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
14748   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
14749   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
14750   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
14751   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
14752
14753   /* MIPS I */
14754   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
14755   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
14756   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
14757
14758   /* MIPS II */
14759   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
14760
14761   /* MIPS III */
14762   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
14763   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
14764   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
14765   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
14766   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
14767   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
14768   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
14769   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
14770   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
14771   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
14772   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
14773   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
14774
14775   /* MIPS IV */
14776   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
14777   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
14778   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
14779   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
14780   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
14781   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
14782   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
14783   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
14784   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
14785   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
14786   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
14787   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
14788   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
14789
14790   /* MIPS 32 */
14791   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14792   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14793   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14794   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
14795
14796   /* MIPS 32 Release 2 */
14797   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14798   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14799   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14800   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
14801   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14802   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14803   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14804   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14805   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14806   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14807   /* Deprecated forms of the above.  */
14808   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14809   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14810   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
14811   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14812   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14813   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14814   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14815   /* Deprecated forms of the above.  */
14816   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14817   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14818   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
14819   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14820                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14821   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14822                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14823   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14824                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14825   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14826                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14827   /* Deprecated forms of the above.  */
14828   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14829                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14830   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14831                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14832   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
14833   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14834                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14835   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14836                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14837   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14838                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14839   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14840                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14841   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14842                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14843   /* Deprecated forms of the above.  */
14844   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14845                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14846   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14847                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14848
14849   /* MIPS 64 */
14850   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
14851   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
14852   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
14853   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
14854
14855   /* MIPS 64 Release 2 */
14856
14857   /* Broadcom SB-1 CPU core */
14858   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14859                                                 ISA_MIPS64,     CPU_SB1 },
14860   /* Broadcom SB-1A CPU core */
14861   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14862                                                 ISA_MIPS64,     CPU_SB1 },
14863
14864   /* ST Microelectronics Loongson 2E and 2F cores */
14865   { "loongson2e",     0,      ISA_MIPS3,      CPU_LOONGSON_2E },
14866   { "loongson2f",     0,      ISA_MIPS3,      CPU_LOONGSON_2F },
14867
14868   /* End marker */
14869   { NULL, 0, 0, 0 }
14870 };
14871
14872
14873 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14874    with a final "000" replaced by "k".  Ignore case.
14875
14876    Note: this function is shared between GCC and GAS.  */
14877
14878 static bfd_boolean
14879 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14880 {
14881   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14882     given++, canonical++;
14883
14884   return ((*given == 0 && *canonical == 0)
14885           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14886 }
14887
14888
14889 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14890    CPU name.  We've traditionally allowed a lot of variation here.
14891
14892    Note: this function is shared between GCC and GAS.  */
14893
14894 static bfd_boolean
14895 mips_matching_cpu_name_p (const char *canonical, const char *given)
14896 {
14897   /* First see if the name matches exactly, or with a final "000"
14898      turned into "k".  */
14899   if (mips_strict_matching_cpu_name_p (canonical, given))
14900     return TRUE;
14901
14902   /* If not, try comparing based on numerical designation alone.
14903      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14904   if (TOLOWER (*given) == 'r')
14905     given++;
14906   if (!ISDIGIT (*given))
14907     return FALSE;
14908
14909   /* Skip over some well-known prefixes in the canonical name,
14910      hoping to find a number there too.  */
14911   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14912     canonical += 2;
14913   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14914     canonical += 2;
14915   else if (TOLOWER (canonical[0]) == 'r')
14916     canonical += 1;
14917
14918   return mips_strict_matching_cpu_name_p (canonical, given);
14919 }
14920
14921
14922 /* Parse an option that takes the name of a processor as its argument.
14923    OPTION is the name of the option and CPU_STRING is the argument.
14924    Return the corresponding processor enumeration if the CPU_STRING is
14925    recognized, otherwise report an error and return null.
14926
14927    A similar function exists in GCC.  */
14928
14929 static const struct mips_cpu_info *
14930 mips_parse_cpu (const char *option, const char *cpu_string)
14931 {
14932   const struct mips_cpu_info *p;
14933
14934   /* 'from-abi' selects the most compatible architecture for the given
14935      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14936      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14937      version.  Look first at the -mgp options, if given, otherwise base
14938      the choice on MIPS_DEFAULT_64BIT.
14939
14940      Treat NO_ABI like the EABIs.  One reason to do this is that the
14941      plain 'mips' and 'mips64' configs have 'from-abi' as their default
14942      architecture.  This code picks MIPS I for 'mips' and MIPS III for
14943      'mips64', just as we did in the days before 'from-abi'.  */
14944   if (strcasecmp (cpu_string, "from-abi") == 0)
14945     {
14946       if (ABI_NEEDS_32BIT_REGS (mips_abi))
14947         return mips_cpu_info_from_isa (ISA_MIPS1);
14948
14949       if (ABI_NEEDS_64BIT_REGS (mips_abi))
14950         return mips_cpu_info_from_isa (ISA_MIPS3);
14951
14952       if (file_mips_gp32 >= 0)
14953         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14954
14955       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14956                                      ? ISA_MIPS3
14957                                      : ISA_MIPS1);
14958     }
14959
14960   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14961   if (strcasecmp (cpu_string, "default") == 0)
14962     return 0;
14963
14964   for (p = mips_cpu_info_table; p->name != 0; p++)
14965     if (mips_matching_cpu_name_p (p->name, cpu_string))
14966       return p;
14967
14968   as_bad ("Bad value (%s) for %s", cpu_string, option);
14969   return 0;
14970 }
14971
14972 /* Return the canonical processor information for ISA (a member of the
14973    ISA_MIPS* enumeration).  */
14974
14975 static const struct mips_cpu_info *
14976 mips_cpu_info_from_isa (int isa)
14977 {
14978   int i;
14979
14980   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14981     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
14982         && isa == mips_cpu_info_table[i].isa)
14983       return (&mips_cpu_info_table[i]);
14984
14985   return NULL;
14986 }
14987
14988 static const struct mips_cpu_info *
14989 mips_cpu_info_from_arch (int arch)
14990 {
14991   int i;
14992
14993   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14994     if (arch == mips_cpu_info_table[i].cpu)
14995       return (&mips_cpu_info_table[i]);
14996
14997   return NULL;
14998 }
14999 \f
15000 static void
15001 show (FILE *stream, const char *string, int *col_p, int *first_p)
15002 {
15003   if (*first_p)
15004     {
15005       fprintf (stream, "%24s", "");
15006       *col_p = 24;
15007     }
15008   else
15009     {
15010       fprintf (stream, ", ");
15011       *col_p += 2;
15012     }
15013
15014   if (*col_p + strlen (string) > 72)
15015     {
15016       fprintf (stream, "\n%24s", "");
15017       *col_p = 24;
15018     }
15019
15020   fprintf (stream, "%s", string);
15021   *col_p += strlen (string);
15022
15023   *first_p = 0;
15024 }
15025
15026 void
15027 md_show_usage (FILE *stream)
15028 {
15029   int column, first;
15030   size_t i;
15031
15032   fprintf (stream, _("\
15033 MIPS options:\n\
15034 -EB                     generate big endian output\n\
15035 -EL                     generate little endian output\n\
15036 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15037 -G NUM                  allow referencing objects up to NUM bytes\n\
15038                         implicitly with the gp register [default 8]\n"));
15039   fprintf (stream, _("\
15040 -mips1                  generate MIPS ISA I instructions\n\
15041 -mips2                  generate MIPS ISA II instructions\n\
15042 -mips3                  generate MIPS ISA III instructions\n\
15043 -mips4                  generate MIPS ISA IV instructions\n\
15044 -mips5                  generate MIPS ISA V instructions\n\
15045 -mips32                 generate MIPS32 ISA instructions\n\
15046 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15047 -mips64                 generate MIPS64 ISA instructions\n\
15048 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15049 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15050
15051   first = 1;
15052
15053   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15054     show (stream, mips_cpu_info_table[i].name, &column, &first);
15055   show (stream, "from-abi", &column, &first);
15056   fputc ('\n', stream);
15057
15058   fprintf (stream, _("\
15059 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15060 -no-mCPU                don't generate code specific to CPU.\n\
15061                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15062
15063   first = 1;
15064
15065   show (stream, "3900", &column, &first);
15066   show (stream, "4010", &column, &first);
15067   show (stream, "4100", &column, &first);
15068   show (stream, "4650", &column, &first);
15069   fputc ('\n', stream);
15070
15071   fprintf (stream, _("\
15072 -mips16                 generate mips16 instructions\n\
15073 -no-mips16              do not generate mips16 instructions\n"));
15074   fprintf (stream, _("\
15075 -msmartmips             generate smartmips instructions\n\
15076 -mno-smartmips          do not generate smartmips instructions\n"));  
15077   fprintf (stream, _("\
15078 -mdsp                   generate DSP instructions\n\
15079 -mno-dsp                do not generate DSP instructions\n"));
15080   fprintf (stream, _("\
15081 -mdspr2                 generate DSP R2 instructions\n\
15082 -mno-dspr2              do not generate DSP R2 instructions\n"));
15083   fprintf (stream, _("\
15084 -mmt                    generate MT instructions\n\
15085 -mno-mt                 do not generate MT instructions\n"));
15086   fprintf (stream, _("\
15087 -mfix-vr4120            work around certain VR4120 errata\n\
15088 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15089 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15090 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15091 -msym32                 assume all symbols have 32-bit values\n\
15092 -O0                     remove unneeded NOPs, do not swap branches\n\
15093 -O                      remove unneeded NOPs and swap branches\n\
15094 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15095 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15096 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15097 #ifdef OBJ_ELF
15098   fprintf (stream, _("\
15099 -KPIC, -call_shared     generate SVR4 position independent code\n\
15100 -mvxworks-pic           generate VxWorks position independent code\n\
15101 -non_shared             do not generate position independent code\n\
15102 -xgot                   assume a 32 bit GOT\n\
15103 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15104 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15105                         position dependent (non shared) code\n\
15106 -mabi=ABI               create ABI conformant object file for:\n"));
15107
15108   first = 1;
15109
15110   show (stream, "32", &column, &first);
15111   show (stream, "o64", &column, &first);
15112   show (stream, "n32", &column, &first);
15113   show (stream, "64", &column, &first);
15114   show (stream, "eabi", &column, &first);
15115
15116   fputc ('\n', stream);
15117
15118   fprintf (stream, _("\
15119 -32                     create o32 ABI object file (default)\n\
15120 -n32                    create n32 ABI object file\n\
15121 -64                     create 64 ABI object file\n"));
15122 #endif
15123 }
15124
15125 enum dwarf2_format
15126 mips_dwarf2_format (void)
15127 {
15128   if (HAVE_64BIT_SYMBOLS)
15129     {
15130 #ifdef TE_IRIX
15131       return dwarf2_format_64bit_irix;
15132 #else
15133       return dwarf2_format_64bit;
15134 #endif
15135     }
15136   else
15137     return dwarf2_format_32bit;
15138 }
15139
15140 int
15141 mips_dwarf2_addr_size (void)
15142 {
15143   if (HAVE_64BIT_SYMBOLS)
15144     return 8;
15145   else
15146     return 4;
15147 }
15148
15149 /* Standard calling conventions leave the CFA at SP on entry.  */
15150 void
15151 mips_cfi_frame_initial_instructions (void)
15152 {
15153   cfi_add_CFA_def_cfa_register (SP);
15154 }
15155
15156 int
15157 tc_mips_regname_to_dw2regnum (char *regname)
15158 {
15159   unsigned int regnum = -1;
15160   unsigned int reg;
15161
15162   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15163     regnum = reg;
15164
15165   return regnum;
15166 }