6c6baf0ba3abef1f9307924143433f0f073bd589
[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 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 AT  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 /* Allow override of standard little-endian ECOFF format.  */
105
106 #ifndef ECOFF_LITTLE_FORMAT
107 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
108 #endif
109
110 extern int target_big_endian;
111
112 /* The name of the readonly data section.  */
113 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
114                             ? ".rdata" \
115                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
116                             ? ".rdata" \
117                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
118                             ? ".rodata" \
119                             : (abort (), ""))
120
121 /* Information about an instruction, including its format, operands
122    and fixups.  */
123 struct mips_cl_insn
124 {
125   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
126   const struct mips_opcode *insn_mo;
127
128   /* True if this is a mips16 instruction and if we want the extended
129      form of INSN_MO.  */
130   bfd_boolean use_extend;
131
132   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
133   unsigned short extend;
134
135   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
136      a copy of INSN_MO->match with the operands filled in.  */
137   unsigned long insn_opcode;
138
139   /* The frag that contains the instruction.  */
140   struct frag *frag;
141
142   /* The offset into FRAG of the first instruction byte.  */
143   long where;
144
145   /* The relocs associated with the instruction, if any.  */
146   fixS *fixp[3];
147
148   /* True if this entry cannot be moved from its current position.  */
149   unsigned int fixed_p : 1;
150
151   /* True if this instruction occurred in a .set noreorder block.  */
152   unsigned int noreorder_p : 1;
153
154   /* True for mips16 instructions that jump to an absolute address.  */
155   unsigned int mips16_absolute_jump_p : 1;
156 };
157
158 /* The ABI to use.  */
159 enum mips_abi_level
160 {
161   NO_ABI = 0,
162   O32_ABI,
163   O64_ABI,
164   N32_ABI,
165   N64_ABI,
166   EABI_ABI
167 };
168
169 /* MIPS ABI we are using for this output file.  */
170 static enum mips_abi_level mips_abi = NO_ABI;
171
172 /* Whether or not we have code that can call pic code.  */
173 int mips_abicalls = FALSE;
174
175 /* Whether or not we have code which can be put into a shared
176    library.  */
177 static bfd_boolean mips_in_shared = TRUE;
178
179 /* This is the set of options which may be modified by the .set
180    pseudo-op.  We use a struct so that .set push and .set pop are more
181    reliable.  */
182
183 struct mips_set_options
184 {
185   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
186      if it has not been initialized.  Changed by `.set mipsN', and the
187      -mipsN command line option, and the default CPU.  */
188   int isa;
189   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
190      if they have not been initialized.  Changed by `.set <asename>', by
191      command line options, and based on the default architecture.  */
192   int ase_mips3d;
193   int ase_mdmx;
194   int ase_smartmips;
195   int ase_dsp;
196   int ase_dspr2;
197   int ase_mt;
198   /* Whether we are assembling for the mips16 processor.  0 if we are
199      not, 1 if we are, and -1 if the value has not been initialized.
200      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
201      -nomips16 command line options, and the default CPU.  */
202   int mips16;
203   /* Non-zero if we should not reorder instructions.  Changed by `.set
204      reorder' and `.set noreorder'.  */
205   int noreorder;
206   /* Non-zero if we should not permit the $at ($1) register to be used
207      in instructions.  Changed by `.set at' and `.set noat'.  */
208   int noat;
209   /* Non-zero if we should warn when a macro instruction expands into
210      more than one machine instruction.  Changed by `.set nomacro' and
211      `.set macro'.  */
212   int warn_about_macros;
213   /* Non-zero if we should not move instructions.  Changed by `.set
214      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
215   int nomove;
216   /* Non-zero if we should not optimize branches by moving the target
217      of the branch into the delay slot.  Actually, we don't perform
218      this optimization anyhow.  Changed by `.set bopt' and `.set
219      nobopt'.  */
220   int nobopt;
221   /* Non-zero if we should not autoextend mips16 instructions.
222      Changed by `.set autoextend' and `.set noautoextend'.  */
223   int noautoextend;
224   /* Restrict general purpose registers and floating point registers
225      to 32 bit.  This is initially determined when -mgp32 or -mfp32
226      is passed but can changed if the assembler code uses .set mipsN.  */
227   int gp32;
228   int fp32;
229   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
230      command line option, and the default CPU.  */
231   int arch;
232   /* True if ".set sym32" is in effect.  */
233   bfd_boolean sym32;
234 };
235
236 /* True if -mgp32 was passed.  */
237 static int file_mips_gp32 = -1;
238
239 /* True if -mfp32 was passed.  */
240 static int file_mips_fp32 = -1;
241
242 /* This is the struct we use to hold the current set of options.  Note
243    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
244    -1 to indicate that they have not been initialized.  */
245
246 static struct mips_set_options mips_opts =
247 {
248   ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
249 };
250
251 /* These variables are filled in with the masks of registers used.
252    The object format code reads them and puts them in the appropriate
253    place.  */
254 unsigned long mips_gprmask;
255 unsigned long mips_cprmask[4];
256
257 /* MIPS ISA we are using for this output file.  */
258 static int file_mips_isa = ISA_UNKNOWN;
259
260 /* True if -mips16 was passed or implied by arguments passed on the
261    command line (e.g., by -march).  */
262 static int file_ase_mips16;
263
264 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
265                               || mips_opts.isa == ISA_MIPS32R2          \
266                               || mips_opts.isa == ISA_MIPS64            \
267                               || mips_opts.isa == ISA_MIPS64R2)
268
269 /* True if -mips3d was passed or implied by arguments passed on the
270    command line (e.g., by -march).  */
271 static int file_ase_mips3d;
272
273 /* True if -mdmx was passed or implied by arguments passed on the
274    command line (e.g., by -march).  */
275 static int file_ase_mdmx;
276
277 /* True if -msmartmips was passed or implied by arguments passed on the
278    command line (e.g., by -march).  */
279 static int file_ase_smartmips;
280
281 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
282                                 || mips_opts.isa == ISA_MIPS32R2)
283
284 /* True if -mdsp was passed or implied by arguments passed on the
285    command line (e.g., by -march).  */
286 static int file_ase_dsp;
287
288 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
289                               || mips_opts.isa == ISA_MIPS64R2)
290
291 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
292
293 /* True if -mdspr2 was passed or implied by arguments passed on the
294    command line (e.g., by -march).  */
295 static int file_ase_dspr2;
296
297 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
298                                 || mips_opts.isa == ISA_MIPS64R2)
299
300 /* True if -mmt was passed or implied by arguments passed on the
301    command line (e.g., by -march).  */
302 static int file_ase_mt;
303
304 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
305                              || mips_opts.isa == ISA_MIPS64R2)
306
307 /* The argument of the -march= flag.  The architecture we are assembling.  */
308 static int file_mips_arch = CPU_UNKNOWN;
309 static const char *mips_arch_string;
310
311 /* The argument of the -mtune= flag.  The architecture for which we
312    are optimizing.  */
313 static int mips_tune = CPU_UNKNOWN;
314 static const char *mips_tune_string;
315
316 /* True when generating 32-bit code for a 64-bit processor.  */
317 static int mips_32bitmode = 0;
318
319 /* True if the given ABI requires 32-bit registers.  */
320 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
321
322 /* Likewise 64-bit registers.  */
323 #define ABI_NEEDS_64BIT_REGS(ABI)       \
324   ((ABI) == N32_ABI                     \
325    || (ABI) == N64_ABI                  \
326    || (ABI) == O64_ABI)
327
328 /*  Return true if ISA supports 64 bit wide gp registers.  */
329 #define ISA_HAS_64BIT_REGS(ISA)         \
330   ((ISA) == ISA_MIPS3                   \
331    || (ISA) == ISA_MIPS4                \
332    || (ISA) == ISA_MIPS5                \
333    || (ISA) == ISA_MIPS64               \
334    || (ISA) == ISA_MIPS64R2)
335
336 /*  Return true if ISA supports 64 bit wide float registers.  */
337 #define ISA_HAS_64BIT_FPRS(ISA)         \
338   ((ISA) == ISA_MIPS3                   \
339    || (ISA) == ISA_MIPS4                \
340    || (ISA) == ISA_MIPS5                \
341    || (ISA) == ISA_MIPS32R2             \
342    || (ISA) == ISA_MIPS64               \
343    || (ISA) == ISA_MIPS64R2)
344
345 /* Return true if ISA supports 64-bit right rotate (dror et al.)
346    instructions.  */
347 #define ISA_HAS_DROR(ISA)               \
348   ((ISA) == ISA_MIPS64R2)
349
350 /* Return true if ISA supports 32-bit right rotate (ror et al.)
351    instructions.  */
352 #define ISA_HAS_ROR(ISA)                \
353   ((ISA) == ISA_MIPS32R2                \
354    || (ISA) == ISA_MIPS64R2             \
355    || mips_opts.ase_smartmips)
356
357 /* Return true if ISA supports single-precision floats in odd registers.  */
358 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
359   ((ISA) == ISA_MIPS32                  \
360    || (ISA) == ISA_MIPS32R2             \
361    || (ISA) == ISA_MIPS64               \
362    || (ISA) == ISA_MIPS64R2)
363
364 /* Return true if ISA supports move to/from high part of a 64-bit
365    floating-point register. */
366 #define ISA_HAS_MXHC1(ISA)              \
367   ((ISA) == ISA_MIPS32R2                \
368    || (ISA) == ISA_MIPS64R2)
369
370 #define HAVE_32BIT_GPRS                            \
371     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
372
373 #define HAVE_32BIT_FPRS                            \
374     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
375
376 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
377 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
378
379 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
380
381 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
382
383 /* True if relocations are stored in-place.  */
384 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
385
386 /* The ABI-derived address size.  */
387 #define HAVE_64BIT_ADDRESSES \
388   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
389 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
390
391 /* The size of symbolic constants (i.e., expressions of the form
392    "SYMBOL" or "SYMBOL + OFFSET").  */
393 #define HAVE_32BIT_SYMBOLS \
394   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
395 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
396
397 /* Addresses are loaded in different ways, depending on the address size
398    in use.  The n32 ABI Documentation also mandates the use of additions
399    with overflow checking, but existing implementations don't follow it.  */
400 #define ADDRESS_ADD_INSN                                                \
401    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
402
403 #define ADDRESS_ADDI_INSN                                               \
404    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
405
406 #define ADDRESS_LOAD_INSN                                               \
407    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
408
409 #define ADDRESS_STORE_INSN                                              \
410    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
411
412 /* Return true if the given CPU supports the MIPS16 ASE.  */
413 #define CPU_HAS_MIPS16(cpu)                                             \
414    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
415     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
416
417 /* True if CPU has a dror instruction.  */
418 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
419
420 /* True if CPU has a ror instruction.  */
421 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
422
423 /* True if mflo and mfhi can be immediately followed by instructions
424    which write to the HI and LO registers.
425
426    According to MIPS specifications, MIPS ISAs I, II, and III need
427    (at least) two instructions between the reads of HI/LO and
428    instructions which write them, and later ISAs do not.  Contradicting
429    the MIPS specifications, some MIPS IV processor user manuals (e.g.
430    the UM for the NEC Vr5000) document needing the instructions between
431    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
432    MIPS64 and later ISAs to have the interlocks, plus any specific
433    earlier-ISA CPUs for which CPU documentation declares that the
434    instructions are really interlocked.  */
435 #define hilo_interlocks \
436   (mips_opts.isa == ISA_MIPS32                        \
437    || mips_opts.isa == ISA_MIPS32R2                   \
438    || mips_opts.isa == ISA_MIPS64                     \
439    || mips_opts.isa == ISA_MIPS64R2                   \
440    || mips_opts.arch == CPU_R4010                     \
441    || mips_opts.arch == CPU_R10000                    \
442    || mips_opts.arch == CPU_R12000                    \
443    || mips_opts.arch == CPU_RM7000                    \
444    || mips_opts.arch == CPU_VR5500                    \
445    )
446
447 /* Whether the processor uses hardware interlocks to protect reads
448    from the GPRs after they are loaded from memory, and thus does not
449    require nops to be inserted.  This applies to instructions marked
450    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
451    level I.  */
452 #define gpr_interlocks \
453   (mips_opts.isa != ISA_MIPS1  \
454    || mips_opts.arch == CPU_R3900)
455
456 /* Whether the processor uses hardware interlocks to avoid delays
457    required by coprocessor instructions, and thus does not require
458    nops to be inserted.  This applies to instructions marked
459    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
460    between instructions marked INSN_WRITE_COND_CODE and ones marked
461    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
462    levels I, II, and III.  */
463 /* Itbl support may require additional care here.  */
464 #define cop_interlocks                                \
465   ((mips_opts.isa != ISA_MIPS1                        \
466     && mips_opts.isa != ISA_MIPS2                     \
467     && mips_opts.isa != ISA_MIPS3)                    \
468    || mips_opts.arch == CPU_R4300                     \
469    )
470
471 /* Whether the processor uses hardware interlocks to protect reads
472    from coprocessor registers after they are loaded from memory, and
473    thus does not require nops to be inserted.  This applies to
474    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
475    requires at MIPS ISA level I.  */
476 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
477
478 /* Is this a mfhi or mflo instruction?  */
479 #define MF_HILO_INSN(PINFO) \
480           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
481
482 /* MIPS PIC level.  */
483
484 enum mips_pic_level mips_pic;
485
486 /* 1 if we should generate 32 bit offsets from the $gp register in
487    SVR4_PIC mode.  Currently has no meaning in other modes.  */
488 static int mips_big_got = 0;
489
490 /* 1 if trap instructions should used for overflow rather than break
491    instructions.  */
492 static int mips_trap = 0;
493
494 /* 1 if double width floating point constants should not be constructed
495    by assembling two single width halves into two single width floating
496    point registers which just happen to alias the double width destination
497    register.  On some architectures this aliasing can be disabled by a bit
498    in the status register, and the setting of this bit cannot be determined
499    automatically at assemble time.  */
500 static int mips_disable_float_construction;
501
502 /* Non-zero if any .set noreorder directives were used.  */
503
504 static int mips_any_noreorder;
505
506 /* Non-zero if nops should be inserted when the register referenced in
507    an mfhi/mflo instruction is read in the next two instructions.  */
508 static int mips_7000_hilo_fix;
509
510 /* The size of objects in the small data section.  */
511 static unsigned int g_switch_value = 8;
512 /* Whether the -G option was used.  */
513 static int g_switch_seen = 0;
514
515 #define N_RMASK 0xc4
516 #define N_VFP   0xd4
517
518 /* If we can determine in advance that GP optimization won't be
519    possible, we can skip the relaxation stuff that tries to produce
520    GP-relative references.  This makes delay slot optimization work
521    better.
522
523    This function can only provide a guess, but it seems to work for
524    gcc output.  It needs to guess right for gcc, otherwise gcc
525    will put what it thinks is a GP-relative instruction in a branch
526    delay slot.
527
528    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
529    fixed it for the non-PIC mode.  KR 95/04/07  */
530 static int nopic_need_relax (symbolS *, int);
531
532 /* handle of the OPCODE hash table */
533 static struct hash_control *op_hash = NULL;
534
535 /* The opcode hash table we use for the mips16.  */
536 static struct hash_control *mips16_op_hash = NULL;
537
538 /* This array holds the chars that always start a comment.  If the
539     pre-processor is disabled, these aren't very useful */
540 const char comment_chars[] = "#";
541
542 /* This array holds the chars that only start a comment at the beginning of
543    a line.  If the line seems to have the form '# 123 filename'
544    .line and .file directives will appear in the pre-processed output */
545 /* Note that input_file.c hand checks for '#' at the beginning of the
546    first line of the input file.  This is because the compiler outputs
547    #NO_APP at the beginning of its output.  */
548 /* Also note that C style comments are always supported.  */
549 const char line_comment_chars[] = "#";
550
551 /* This array holds machine specific line separator characters.  */
552 const char line_separator_chars[] = ";";
553
554 /* Chars that can be used to separate mant from exp in floating point nums */
555 const char EXP_CHARS[] = "eE";
556
557 /* Chars that mean this number is a floating point constant */
558 /* As in 0f12.456 */
559 /* or    0d1.2345e12 */
560 const char FLT_CHARS[] = "rRsSfFdDxXpP";
561
562 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
563    changed in read.c .  Ideally it shouldn't have to know about it at all,
564    but nothing is ideal around here.
565  */
566
567 static char *insn_error;
568
569 static int auto_align = 1;
570
571 /* When outputting SVR4 PIC code, the assembler needs to know the
572    offset in the stack frame from which to restore the $gp register.
573    This is set by the .cprestore pseudo-op, and saved in this
574    variable.  */
575 static offsetT mips_cprestore_offset = -1;
576
577 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
578    more optimizations, it can use a register value instead of a memory-saved
579    offset and even an other register than $gp as global pointer.  */
580 static offsetT mips_cpreturn_offset = -1;
581 static int mips_cpreturn_register = -1;
582 static int mips_gp_register = GP;
583 static int mips_gprel_offset = 0;
584
585 /* Whether mips_cprestore_offset has been set in the current function
586    (or whether it has already been warned about, if not).  */
587 static int mips_cprestore_valid = 0;
588
589 /* This is the register which holds the stack frame, as set by the
590    .frame pseudo-op.  This is needed to implement .cprestore.  */
591 static int mips_frame_reg = SP;
592
593 /* Whether mips_frame_reg has been set in the current function
594    (or whether it has already been warned about, if not).  */
595 static int mips_frame_reg_valid = 0;
596
597 /* To output NOP instructions correctly, we need to keep information
598    about the previous two instructions.  */
599
600 /* Whether we are optimizing.  The default value of 2 means to remove
601    unneeded NOPs and swap branch instructions when possible.  A value
602    of 1 means to not swap branches.  A value of 0 means to always
603    insert NOPs.  */
604 static int mips_optimize = 2;
605
606 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
607    equivalent to seeing no -g option at all.  */
608 static int mips_debug = 0;
609
610 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
611 #define MAX_VR4130_NOPS 4
612
613 /* The maximum number of NOPs needed to fill delay slots.  */
614 #define MAX_DELAY_NOPS 2
615
616 /* The maximum number of NOPs needed for any purpose.  */
617 #define MAX_NOPS 4
618
619 /* A list of previous instructions, with index 0 being the most recent.
620    We need to look back MAX_NOPS instructions when filling delay slots
621    or working around processor errata.  We need to look back one
622    instruction further if we're thinking about using history[0] to
623    fill a branch delay slot.  */
624 static struct mips_cl_insn history[1 + MAX_NOPS];
625
626 /* Nop instructions used by emit_nop.  */
627 static struct mips_cl_insn nop_insn, mips16_nop_insn;
628
629 /* The appropriate nop for the current mode.  */
630 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
631
632 /* If this is set, it points to a frag holding nop instructions which
633    were inserted before the start of a noreorder section.  If those
634    nops turn out to be unnecessary, the size of the frag can be
635    decreased.  */
636 static fragS *prev_nop_frag;
637
638 /* The number of nop instructions we created in prev_nop_frag.  */
639 static int prev_nop_frag_holds;
640
641 /* The number of nop instructions that we know we need in
642    prev_nop_frag.  */
643 static int prev_nop_frag_required;
644
645 /* The number of instructions we've seen since prev_nop_frag.  */
646 static int prev_nop_frag_since;
647
648 /* For ECOFF and ELF, relocations against symbols are done in two
649    parts, with a HI relocation and a LO relocation.  Each relocation
650    has only 16 bits of space to store an addend.  This means that in
651    order for the linker to handle carries correctly, it must be able
652    to locate both the HI and the LO relocation.  This means that the
653    relocations must appear in order in the relocation table.
654
655    In order to implement this, we keep track of each unmatched HI
656    relocation.  We then sort them so that they immediately precede the
657    corresponding LO relocation.  */
658
659 struct mips_hi_fixup
660 {
661   /* Next HI fixup.  */
662   struct mips_hi_fixup *next;
663   /* This fixup.  */
664   fixS *fixp;
665   /* The section this fixup is in.  */
666   segT seg;
667 };
668
669 /* The list of unmatched HI relocs.  */
670
671 static struct mips_hi_fixup *mips_hi_fixup_list;
672
673 /* The frag containing the last explicit relocation operator.
674    Null if explicit relocations have not been used.  */
675
676 static fragS *prev_reloc_op_frag;
677
678 /* Map normal MIPS register numbers to mips16 register numbers.  */
679
680 #define X ILLEGAL_REG
681 static const int mips32_to_16_reg_map[] =
682 {
683   X, X, 2, 3, 4, 5, 6, 7,
684   X, X, X, X, X, X, X, X,
685   0, 1, X, X, X, X, X, X,
686   X, X, X, X, X, X, X, X
687 };
688 #undef X
689
690 /* Map mips16 register numbers to normal MIPS register numbers.  */
691
692 static const unsigned int mips16_to_32_reg_map[] =
693 {
694   16, 17, 2, 3, 4, 5, 6, 7
695 };
696
697 /* Classifies the kind of instructions we're interested in when
698    implementing -mfix-vr4120.  */
699 enum fix_vr4120_class {
700   FIX_VR4120_MACC,
701   FIX_VR4120_DMACC,
702   FIX_VR4120_MULT,
703   FIX_VR4120_DMULT,
704   FIX_VR4120_DIV,
705   FIX_VR4120_MTHILO,
706   NUM_FIX_VR4120_CLASSES
707 };
708
709 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
710    there must be at least one other instruction between an instruction
711    of type X and an instruction of type Y.  */
712 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
713
714 /* True if -mfix-vr4120 is in force.  */
715 static int mips_fix_vr4120;
716
717 /* ...likewise -mfix-vr4130.  */
718 static int mips_fix_vr4130;
719
720 /* We don't relax branches by default, since this causes us to expand
721    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
722    fail to compute the offset before expanding the macro to the most
723    efficient expansion.  */
724
725 static int mips_relax_branch;
726 \f
727 /* The expansion of many macros depends on the type of symbol that
728    they refer to.  For example, when generating position-dependent code,
729    a macro that refers to a symbol may have two different expansions,
730    one which uses GP-relative addresses and one which uses absolute
731    addresses.  When generating SVR4-style PIC, a macro may have
732    different expansions for local and global symbols.
733
734    We handle these situations by generating both sequences and putting
735    them in variant frags.  In position-dependent code, the first sequence
736    will be the GP-relative one and the second sequence will be the
737    absolute one.  In SVR4 PIC, the first sequence will be for global
738    symbols and the second will be for local symbols.
739
740    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
741    SECOND are the lengths of the two sequences in bytes.  These fields
742    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
743    the subtype has the following flags:
744
745    RELAX_USE_SECOND
746         Set if it has been decided that we should use the second
747         sequence instead of the first.
748
749    RELAX_SECOND_LONGER
750         Set in the first variant frag if the macro's second implementation
751         is longer than its first.  This refers to the macro as a whole,
752         not an individual relaxation.
753
754    RELAX_NOMACRO
755         Set in the first variant frag if the macro appeared in a .set nomacro
756         block and if one alternative requires a warning but the other does not.
757
758    RELAX_DELAY_SLOT
759         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
760         delay slot.
761
762    The frag's "opcode" points to the first fixup for relaxable code.
763
764    Relaxable macros are generated using a sequence such as:
765
766       relax_start (SYMBOL);
767       ... generate first expansion ...
768       relax_switch ();
769       ... generate second expansion ...
770       relax_end ();
771
772    The code and fixups for the unwanted alternative are discarded
773    by md_convert_frag.  */
774 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
775
776 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
777 #define RELAX_SECOND(X) ((X) & 0xff)
778 #define RELAX_USE_SECOND 0x10000
779 #define RELAX_SECOND_LONGER 0x20000
780 #define RELAX_NOMACRO 0x40000
781 #define RELAX_DELAY_SLOT 0x80000
782
783 /* Branch without likely bit.  If label is out of range, we turn:
784
785         beq reg1, reg2, label
786         delay slot
787
788    into
789
790         bne reg1, reg2, 0f
791         nop
792         j label
793      0: delay slot
794
795    with the following opcode replacements:
796
797         beq <-> bne
798         blez <-> bgtz
799         bltz <-> bgez
800         bc1f <-> bc1t
801
802         bltzal <-> bgezal  (with jal label instead of j label)
803
804    Even though keeping the delay slot instruction in the delay slot of
805    the branch would be more efficient, it would be very tricky to do
806    correctly, because we'd have to introduce a variable frag *after*
807    the delay slot instruction, and expand that instead.  Let's do it
808    the easy way for now, even if the branch-not-taken case now costs
809    one additional instruction.  Out-of-range branches are not supposed
810    to be common, anyway.
811
812    Branch likely.  If label is out of range, we turn:
813
814         beql reg1, reg2, label
815         delay slot (annulled if branch not taken)
816
817    into
818
819         beql reg1, reg2, 1f
820         nop
821         beql $0, $0, 2f
822         nop
823      1: j[al] label
824         delay slot (executed only if branch taken)
825      2:
826
827    It would be possible to generate a shorter sequence by losing the
828    likely bit, generating something like:
829
830         bne reg1, reg2, 0f
831         nop
832         j[al] label
833         delay slot (executed only if branch taken)
834      0:
835
836         beql -> bne
837         bnel -> beq
838         blezl -> bgtz
839         bgtzl -> blez
840         bltzl -> bgez
841         bgezl -> bltz
842         bc1fl -> bc1t
843         bc1tl -> bc1f
844
845         bltzall -> bgezal  (with jal label instead of j label)
846         bgezall -> bltzal  (ditto)
847
848
849    but it's not clear that it would actually improve performance.  */
850 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
851   ((relax_substateT) \
852    (0xc0000000 \
853     | ((toofar) ? 1 : 0) \
854     | ((link) ? 2 : 0) \
855     | ((likely) ? 4 : 0) \
856     | ((uncond) ? 8 : 0)))
857 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
858 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
859 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
860 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
861 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
862
863 /* For mips16 code, we use an entirely different form of relaxation.
864    mips16 supports two versions of most instructions which take
865    immediate values: a small one which takes some small value, and a
866    larger one which takes a 16 bit value.  Since branches also follow
867    this pattern, relaxing these values is required.
868
869    We can assemble both mips16 and normal MIPS code in a single
870    object.  Therefore, we need to support this type of relaxation at
871    the same time that we support the relaxation described above.  We
872    use the high bit of the subtype field to distinguish these cases.
873
874    The information we store for this type of relaxation is the
875    argument code found in the opcode file for this relocation, whether
876    the user explicitly requested a small or extended form, and whether
877    the relocation is in a jump or jal delay slot.  That tells us the
878    size of the value, and how it should be stored.  We also store
879    whether the fragment is considered to be extended or not.  We also
880    store whether this is known to be a branch to a different section,
881    whether we have tried to relax this frag yet, and whether we have
882    ever extended a PC relative fragment because of a shift count.  */
883 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
884   (0x80000000                                                   \
885    | ((type) & 0xff)                                            \
886    | ((small) ? 0x100 : 0)                                      \
887    | ((ext) ? 0x200 : 0)                                        \
888    | ((dslot) ? 0x400 : 0)                                      \
889    | ((jal_dslot) ? 0x800 : 0))
890 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
891 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
892 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
893 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
894 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
895 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
896 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
897 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
898 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
899 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
900 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
901 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
902
903 /* Is the given value a sign-extended 32-bit value?  */
904 #define IS_SEXT_32BIT_NUM(x)                                            \
905   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
906    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
907
908 /* Is the given value a sign-extended 16-bit value?  */
909 #define IS_SEXT_16BIT_NUM(x)                                            \
910   (((x) &~ (offsetT) 0x7fff) == 0                                       \
911    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
912
913 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
914 #define IS_ZEXT_32BIT_NUM(x)                                            \
915   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
916    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
917
918 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
919    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
920 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
921   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
922               | (((VALUE) & (MASK)) << (SHIFT)))
923
924 /* Extract bits MASK << SHIFT from STRUCT and shift them right
925    SHIFT places.  */
926 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
927   (((STRUCT) >> (SHIFT)) & (MASK))
928
929 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
930    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
931
932    include/opcode/mips.h specifies operand fields using the macros
933    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
934    with "MIPS16OP" instead of "OP".  */
935 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
936   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
937 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
938   INSERT_BITS ((INSN).insn_opcode, VALUE, \
939                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
940
941 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
942 #define EXTRACT_OPERAND(FIELD, INSN) \
943   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
944 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
945   EXTRACT_BITS ((INSN).insn_opcode, \
946                 MIPS16OP_MASK_##FIELD, \
947                 MIPS16OP_SH_##FIELD)
948 \f
949 /* Global variables used when generating relaxable macros.  See the
950    comment above RELAX_ENCODE for more details about how relaxation
951    is used.  */
952 static struct {
953   /* 0 if we're not emitting a relaxable macro.
954      1 if we're emitting the first of the two relaxation alternatives.
955      2 if we're emitting the second alternative.  */
956   int sequence;
957
958   /* The first relaxable fixup in the current frag.  (In other words,
959      the first fixup that refers to relaxable code.)  */
960   fixS *first_fixup;
961
962   /* sizes[0] says how many bytes of the first alternative are stored in
963      the current frag.  Likewise sizes[1] for the second alternative.  */
964   unsigned int sizes[2];
965
966   /* The symbol on which the choice of sequence depends.  */
967   symbolS *symbol;
968 } mips_relax;
969 \f
970 /* Global variables used to decide whether a macro needs a warning.  */
971 static struct {
972   /* True if the macro is in a branch delay slot.  */
973   bfd_boolean delay_slot_p;
974
975   /* For relaxable macros, sizes[0] is the length of the first alternative
976      in bytes and sizes[1] is the length of the second alternative.
977      For non-relaxable macros, both elements give the length of the
978      macro in bytes.  */
979   unsigned int sizes[2];
980
981   /* The first variant frag for this macro.  */
982   fragS *first_frag;
983 } mips_macro_warning;
984 \f
985 /* Prototypes for static functions.  */
986
987 #define internalError()                                                 \
988     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
989
990 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
991
992 static void append_insn
993   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
994 static void mips_no_prev_insn (void);
995 static void mips16_macro_build
996   (expressionS *, const char *, const char *, va_list);
997 static void load_register (int, expressionS *, int);
998 static void macro_start (void);
999 static void macro_end (void);
1000 static void macro (struct mips_cl_insn * ip);
1001 static void mips16_macro (struct mips_cl_insn * ip);
1002 #ifdef LOSING_COMPILER
1003 static void macro2 (struct mips_cl_insn * ip);
1004 #endif
1005 static void mips_ip (char *str, struct mips_cl_insn * ip);
1006 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1007 static void mips16_immed
1008   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1009    unsigned long *, bfd_boolean *, unsigned short *);
1010 static size_t my_getSmallExpression
1011   (expressionS *, bfd_reloc_code_real_type *, char *);
1012 static void my_getExpression (expressionS *, char *);
1013 static void s_align (int);
1014 static void s_change_sec (int);
1015 static void s_change_section (int);
1016 static void s_cons (int);
1017 static void s_float_cons (int);
1018 static void s_mips_globl (int);
1019 static void s_option (int);
1020 static void s_mipsset (int);
1021 static void s_abicalls (int);
1022 static void s_cpload (int);
1023 static void s_cpsetup (int);
1024 static void s_cplocal (int);
1025 static void s_cprestore (int);
1026 static void s_cpreturn (int);
1027 static void s_dtprelword (int);
1028 static void s_dtpreldword (int);
1029 static void s_gpvalue (int);
1030 static void s_gpword (int);
1031 static void s_gpdword (int);
1032 static void s_cpadd (int);
1033 static void s_insn (int);
1034 static void md_obj_begin (void);
1035 static void md_obj_end (void);
1036 static void s_mips_ent (int);
1037 static void s_mips_end (int);
1038 static void s_mips_frame (int);
1039 static void s_mips_mask (int reg_type);
1040 static void s_mips_stab (int);
1041 static void s_mips_weakext (int);
1042 static void s_mips_file (int);
1043 static void s_mips_loc (int);
1044 static bfd_boolean pic_need_relax (symbolS *, asection *);
1045 static int relaxed_branch_length (fragS *, asection *, int);
1046 static int validate_mips_insn (const struct mips_opcode *);
1047
1048 /* Table and functions used to map between CPU/ISA names, and
1049    ISA levels, and CPU numbers.  */
1050
1051 struct mips_cpu_info
1052 {
1053   const char *name;           /* CPU or ISA name.  */
1054   int flags;                  /* ASEs available, or ISA flag.  */
1055   int isa;                    /* ISA level.  */
1056   int cpu;                    /* CPU number (default CPU if ISA).  */
1057 };
1058
1059 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1060 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1061 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1062 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1063 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1064 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1065 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1066
1067 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1068 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1069 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1070 \f
1071 /* Pseudo-op table.
1072
1073    The following pseudo-ops from the Kane and Heinrich MIPS book
1074    should be defined here, but are currently unsupported: .alias,
1075    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1076
1077    The following pseudo-ops from the Kane and Heinrich MIPS book are
1078    specific to the type of debugging information being generated, and
1079    should be defined by the object format: .aent, .begin, .bend,
1080    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1081    .vreg.
1082
1083    The following pseudo-ops from the Kane and Heinrich MIPS book are
1084    not MIPS CPU specific, but are also not specific to the object file
1085    format.  This file is probably the best place to define them, but
1086    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1087
1088 static const pseudo_typeS mips_pseudo_table[] =
1089 {
1090   /* MIPS specific pseudo-ops.  */
1091   {"option", s_option, 0},
1092   {"set", s_mipsset, 0},
1093   {"rdata", s_change_sec, 'r'},
1094   {"sdata", s_change_sec, 's'},
1095   {"livereg", s_ignore, 0},
1096   {"abicalls", s_abicalls, 0},
1097   {"cpload", s_cpload, 0},
1098   {"cpsetup", s_cpsetup, 0},
1099   {"cplocal", s_cplocal, 0},
1100   {"cprestore", s_cprestore, 0},
1101   {"cpreturn", s_cpreturn, 0},
1102   {"dtprelword", s_dtprelword, 0},
1103   {"dtpreldword", s_dtpreldword, 0},
1104   {"gpvalue", s_gpvalue, 0},
1105   {"gpword", s_gpword, 0},
1106   {"gpdword", s_gpdword, 0},
1107   {"cpadd", s_cpadd, 0},
1108   {"insn", s_insn, 0},
1109
1110   /* Relatively generic pseudo-ops that happen to be used on MIPS
1111      chips.  */
1112   {"asciiz", stringer, 8 + 1},
1113   {"bss", s_change_sec, 'b'},
1114   {"err", s_err, 0},
1115   {"half", s_cons, 1},
1116   {"dword", s_cons, 3},
1117   {"weakext", s_mips_weakext, 0},
1118   {"origin", s_org, 0},
1119   {"repeat", s_rept, 0},
1120
1121   /* These pseudo-ops are defined in read.c, but must be overridden
1122      here for one reason or another.  */
1123   {"align", s_align, 0},
1124   {"byte", s_cons, 0},
1125   {"data", s_change_sec, 'd'},
1126   {"double", s_float_cons, 'd'},
1127   {"float", s_float_cons, 'f'},
1128   {"globl", s_mips_globl, 0},
1129   {"global", s_mips_globl, 0},
1130   {"hword", s_cons, 1},
1131   {"int", s_cons, 2},
1132   {"long", s_cons, 2},
1133   {"octa", s_cons, 4},
1134   {"quad", s_cons, 3},
1135   {"section", s_change_section, 0},
1136   {"short", s_cons, 1},
1137   {"single", s_float_cons, 'f'},
1138   {"stabn", s_mips_stab, 'n'},
1139   {"text", s_change_sec, 't'},
1140   {"word", s_cons, 2},
1141
1142   { "extern", ecoff_directive_extern, 0},
1143
1144   { NULL, NULL, 0 },
1145 };
1146
1147 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1148 {
1149   /* These pseudo-ops should be defined by the object file format.
1150      However, a.out doesn't support them, so we have versions here.  */
1151   {"aent", s_mips_ent, 1},
1152   {"bgnb", s_ignore, 0},
1153   {"end", s_mips_end, 0},
1154   {"endb", s_ignore, 0},
1155   {"ent", s_mips_ent, 0},
1156   {"file", s_mips_file, 0},
1157   {"fmask", s_mips_mask, 'F'},
1158   {"frame", s_mips_frame, 0},
1159   {"loc", s_mips_loc, 0},
1160   {"mask", s_mips_mask, 'R'},
1161   {"verstamp", s_ignore, 0},
1162   { NULL, NULL, 0 },
1163 };
1164
1165 extern void pop_insert (const pseudo_typeS *);
1166
1167 void
1168 mips_pop_insert (void)
1169 {
1170   pop_insert (mips_pseudo_table);
1171   if (! ECOFF_DEBUGGING)
1172     pop_insert (mips_nonecoff_pseudo_table);
1173 }
1174 \f
1175 /* Symbols labelling the current insn.  */
1176
1177 struct insn_label_list
1178 {
1179   struct insn_label_list *next;
1180   symbolS *label;
1181 };
1182
1183 static struct insn_label_list *free_insn_labels;
1184 #define label_list tc_segment_info_data
1185
1186 static void mips_clear_insn_labels (void);
1187
1188 static inline void
1189 mips_clear_insn_labels (void)
1190 {
1191   register struct insn_label_list **pl;
1192   segment_info_type *si;
1193
1194   if (now_seg)
1195     {
1196       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1197         ;
1198       
1199       si = seg_info (now_seg);
1200       *pl = si->label_list;
1201       si->label_list = NULL;
1202     }
1203 }
1204
1205 \f
1206 static char *expr_end;
1207
1208 /* Expressions which appear in instructions.  These are set by
1209    mips_ip.  */
1210
1211 static expressionS imm_expr;
1212 static expressionS imm2_expr;
1213 static expressionS offset_expr;
1214
1215 /* Relocs associated with imm_expr and offset_expr.  */
1216
1217 static bfd_reloc_code_real_type imm_reloc[3]
1218   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1219 static bfd_reloc_code_real_type offset_reloc[3]
1220   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1221
1222 /* These are set by mips16_ip if an explicit extension is used.  */
1223
1224 static bfd_boolean mips16_small, mips16_ext;
1225
1226 #ifdef OBJ_ELF
1227 /* The pdr segment for per procedure frame/regmask info.  Not used for
1228    ECOFF debugging.  */
1229
1230 static segT pdr_seg;
1231 #endif
1232
1233 /* The default target format to use.  */
1234
1235 const char *
1236 mips_target_format (void)
1237 {
1238   switch (OUTPUT_FLAVOR)
1239     {
1240     case bfd_target_ecoff_flavour:
1241       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1242     case bfd_target_coff_flavour:
1243       return "pe-mips";
1244     case bfd_target_elf_flavour:
1245 #ifdef TE_VXWORKS
1246       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1247         return (target_big_endian
1248                 ? "elf32-bigmips-vxworks"
1249                 : "elf32-littlemips-vxworks");
1250 #endif
1251 #ifdef TE_TMIPS
1252       /* This is traditional mips.  */
1253       return (target_big_endian
1254               ? (HAVE_64BIT_OBJECTS
1255                  ? "elf64-tradbigmips"
1256                  : (HAVE_NEWABI
1257                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1258               : (HAVE_64BIT_OBJECTS
1259                  ? "elf64-tradlittlemips"
1260                  : (HAVE_NEWABI
1261                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1262 #else
1263       return (target_big_endian
1264               ? (HAVE_64BIT_OBJECTS
1265                  ? "elf64-bigmips"
1266                  : (HAVE_NEWABI
1267                     ? "elf32-nbigmips" : "elf32-bigmips"))
1268               : (HAVE_64BIT_OBJECTS
1269                  ? "elf64-littlemips"
1270                  : (HAVE_NEWABI
1271                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1272 #endif
1273     default:
1274       abort ();
1275       return NULL;
1276     }
1277 }
1278
1279 /* Return the length of instruction INSN.  */
1280
1281 static inline unsigned int
1282 insn_length (const struct mips_cl_insn *insn)
1283 {
1284   if (!mips_opts.mips16)
1285     return 4;
1286   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1287 }
1288
1289 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1290
1291 static void
1292 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1293 {
1294   size_t i;
1295
1296   insn->insn_mo = mo;
1297   insn->use_extend = FALSE;
1298   insn->extend = 0;
1299   insn->insn_opcode = mo->match;
1300   insn->frag = NULL;
1301   insn->where = 0;
1302   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1303     insn->fixp[i] = NULL;
1304   insn->fixed_p = (mips_opts.noreorder > 0);
1305   insn->noreorder_p = (mips_opts.noreorder > 0);
1306   insn->mips16_absolute_jump_p = 0;
1307 }
1308
1309 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1310
1311 static void
1312 install_insn (const struct mips_cl_insn *insn)
1313 {
1314   char *f = insn->frag->fr_literal + insn->where;
1315   if (!mips_opts.mips16)
1316     md_number_to_chars (f, insn->insn_opcode, 4);
1317   else if (insn->mips16_absolute_jump_p)
1318     {
1319       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1320       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1321     }
1322   else
1323     {
1324       if (insn->use_extend)
1325         {
1326           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1327           f += 2;
1328         }
1329       md_number_to_chars (f, insn->insn_opcode, 2);
1330     }
1331 }
1332
1333 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1334    and install the opcode in the new location.  */
1335
1336 static void
1337 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1338 {
1339   size_t i;
1340
1341   insn->frag = frag;
1342   insn->where = where;
1343   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1344     if (insn->fixp[i] != NULL)
1345       {
1346         insn->fixp[i]->fx_frag = frag;
1347         insn->fixp[i]->fx_where = where;
1348       }
1349   install_insn (insn);
1350 }
1351
1352 /* Add INSN to the end of the output.  */
1353
1354 static void
1355 add_fixed_insn (struct mips_cl_insn *insn)
1356 {
1357   char *f = frag_more (insn_length (insn));
1358   move_insn (insn, frag_now, f - frag_now->fr_literal);
1359 }
1360
1361 /* Start a variant frag and move INSN to the start of the variant part,
1362    marking it as fixed.  The other arguments are as for frag_var.  */
1363
1364 static void
1365 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1366                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1367 {
1368   frag_grow (max_chars);
1369   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1370   insn->fixed_p = 1;
1371   frag_var (rs_machine_dependent, max_chars, var,
1372             subtype, symbol, offset, NULL);
1373 }
1374
1375 /* Insert N copies of INSN into the history buffer, starting at
1376    position FIRST.  Neither FIRST nor N need to be clipped.  */
1377
1378 static void
1379 insert_into_history (unsigned int first, unsigned int n,
1380                      const struct mips_cl_insn *insn)
1381 {
1382   if (mips_relax.sequence != 2)
1383     {
1384       unsigned int i;
1385
1386       for (i = ARRAY_SIZE (history); i-- > first;)
1387         if (i >= first + n)
1388           history[i] = history[i - n];
1389         else
1390           history[i] = *insn;
1391     }
1392 }
1393
1394 /* Emit a nop instruction, recording it in the history buffer.  */
1395
1396 static void
1397 emit_nop (void)
1398 {
1399   add_fixed_insn (NOP_INSN);
1400   insert_into_history (0, 1, NOP_INSN);
1401 }
1402
1403 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1404    the idea is to make it obvious at a glance that each errata is
1405    included.  */
1406
1407 static void
1408 init_vr4120_conflicts (void)
1409 {
1410 #define CONFLICT(FIRST, SECOND) \
1411     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1412
1413   /* Errata 21 - [D]DIV[U] after [D]MACC */
1414   CONFLICT (MACC, DIV);
1415   CONFLICT (DMACC, DIV);
1416
1417   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1418   CONFLICT (DMULT, DMULT);
1419   CONFLICT (DMULT, DMACC);
1420   CONFLICT (DMACC, DMULT);
1421   CONFLICT (DMACC, DMACC);
1422
1423   /* Errata 24 - MT{LO,HI} after [D]MACC */
1424   CONFLICT (MACC, MTHILO);
1425   CONFLICT (DMACC, MTHILO);
1426
1427   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1428      instruction is executed immediately after a MACC or DMACC
1429      instruction, the result of [either instruction] is incorrect."  */
1430   CONFLICT (MACC, MULT);
1431   CONFLICT (MACC, DMULT);
1432   CONFLICT (DMACC, MULT);
1433   CONFLICT (DMACC, DMULT);
1434
1435   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1436      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1437      DDIV or DDIVU instruction, the result of the MACC or
1438      DMACC instruction is incorrect.".  */
1439   CONFLICT (DMULT, MACC);
1440   CONFLICT (DMULT, DMACC);
1441   CONFLICT (DIV, MACC);
1442   CONFLICT (DIV, DMACC);
1443
1444 #undef CONFLICT
1445 }
1446
1447 struct regname {
1448   const char *name;
1449   unsigned int num;
1450 };
1451
1452 #define RTYPE_MASK      0x1ff00
1453 #define RTYPE_NUM       0x00100
1454 #define RTYPE_FPU       0x00200
1455 #define RTYPE_FCC       0x00400
1456 #define RTYPE_VEC       0x00800
1457 #define RTYPE_GP        0x01000
1458 #define RTYPE_CP0       0x02000
1459 #define RTYPE_PC        0x04000
1460 #define RTYPE_ACC       0x08000
1461 #define RTYPE_CCC       0x10000
1462 #define RNUM_MASK       0x000ff
1463 #define RWARN           0x80000
1464
1465 #define GENERIC_REGISTER_NUMBERS \
1466     {"$0",      RTYPE_NUM | 0},  \
1467     {"$1",      RTYPE_NUM | 1},  \
1468     {"$2",      RTYPE_NUM | 2},  \
1469     {"$3",      RTYPE_NUM | 3},  \
1470     {"$4",      RTYPE_NUM | 4},  \
1471     {"$5",      RTYPE_NUM | 5},  \
1472     {"$6",      RTYPE_NUM | 6},  \
1473     {"$7",      RTYPE_NUM | 7},  \
1474     {"$8",      RTYPE_NUM | 8},  \
1475     {"$9",      RTYPE_NUM | 9},  \
1476     {"$10",     RTYPE_NUM | 10}, \
1477     {"$11",     RTYPE_NUM | 11}, \
1478     {"$12",     RTYPE_NUM | 12}, \
1479     {"$13",     RTYPE_NUM | 13}, \
1480     {"$14",     RTYPE_NUM | 14}, \
1481     {"$15",     RTYPE_NUM | 15}, \
1482     {"$16",     RTYPE_NUM | 16}, \
1483     {"$17",     RTYPE_NUM | 17}, \
1484     {"$18",     RTYPE_NUM | 18}, \
1485     {"$19",     RTYPE_NUM | 19}, \
1486     {"$20",     RTYPE_NUM | 20}, \
1487     {"$21",     RTYPE_NUM | 21}, \
1488     {"$22",     RTYPE_NUM | 22}, \
1489     {"$23",     RTYPE_NUM | 23}, \
1490     {"$24",     RTYPE_NUM | 24}, \
1491     {"$25",     RTYPE_NUM | 25}, \
1492     {"$26",     RTYPE_NUM | 26}, \
1493     {"$27",     RTYPE_NUM | 27}, \
1494     {"$28",     RTYPE_NUM | 28}, \
1495     {"$29",     RTYPE_NUM | 29}, \
1496     {"$30",     RTYPE_NUM | 30}, \
1497     {"$31",     RTYPE_NUM | 31} 
1498
1499 #define FPU_REGISTER_NAMES       \
1500     {"$f0",     RTYPE_FPU | 0},  \
1501     {"$f1",     RTYPE_FPU | 1},  \
1502     {"$f2",     RTYPE_FPU | 2},  \
1503     {"$f3",     RTYPE_FPU | 3},  \
1504     {"$f4",     RTYPE_FPU | 4},  \
1505     {"$f5",     RTYPE_FPU | 5},  \
1506     {"$f6",     RTYPE_FPU | 6},  \
1507     {"$f7",     RTYPE_FPU | 7},  \
1508     {"$f8",     RTYPE_FPU | 8},  \
1509     {"$f9",     RTYPE_FPU | 9},  \
1510     {"$f10",    RTYPE_FPU | 10}, \
1511     {"$f11",    RTYPE_FPU | 11}, \
1512     {"$f12",    RTYPE_FPU | 12}, \
1513     {"$f13",    RTYPE_FPU | 13}, \
1514     {"$f14",    RTYPE_FPU | 14}, \
1515     {"$f15",    RTYPE_FPU | 15}, \
1516     {"$f16",    RTYPE_FPU | 16}, \
1517     {"$f17",    RTYPE_FPU | 17}, \
1518     {"$f18",    RTYPE_FPU | 18}, \
1519     {"$f19",    RTYPE_FPU | 19}, \
1520     {"$f20",    RTYPE_FPU | 20}, \
1521     {"$f21",    RTYPE_FPU | 21}, \
1522     {"$f22",    RTYPE_FPU | 22}, \
1523     {"$f23",    RTYPE_FPU | 23}, \
1524     {"$f24",    RTYPE_FPU | 24}, \
1525     {"$f25",    RTYPE_FPU | 25}, \
1526     {"$f26",    RTYPE_FPU | 26}, \
1527     {"$f27",    RTYPE_FPU | 27}, \
1528     {"$f28",    RTYPE_FPU | 28}, \
1529     {"$f29",    RTYPE_FPU | 29}, \
1530     {"$f30",    RTYPE_FPU | 30}, \
1531     {"$f31",    RTYPE_FPU | 31}
1532
1533 #define FPU_CONDITION_CODE_NAMES \
1534     {"$fcc0",   RTYPE_FCC | 0},  \
1535     {"$fcc1",   RTYPE_FCC | 1},  \
1536     {"$fcc2",   RTYPE_FCC | 2},  \
1537     {"$fcc3",   RTYPE_FCC | 3},  \
1538     {"$fcc4",   RTYPE_FCC | 4},  \
1539     {"$fcc5",   RTYPE_FCC | 5},  \
1540     {"$fcc6",   RTYPE_FCC | 6},  \
1541     {"$fcc7",   RTYPE_FCC | 7}
1542
1543 #define COPROC_CONDITION_CODE_NAMES         \
1544     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1545     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1546     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1547     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1548     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1549     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1550     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1551     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1552
1553 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1554     {"$a4",     RTYPE_GP | 8},  \
1555     {"$a5",     RTYPE_GP | 9},  \
1556     {"$a6",     RTYPE_GP | 10}, \
1557     {"$a7",     RTYPE_GP | 11}, \
1558     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1559     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1560     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1561     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1562     {"$t0",     RTYPE_GP | 12}, \
1563     {"$t1",     RTYPE_GP | 13}, \
1564     {"$t2",     RTYPE_GP | 14}, \
1565     {"$t3",     RTYPE_GP | 15}
1566
1567 #define O32_SYMBOLIC_REGISTER_NAMES \
1568     {"$t0",     RTYPE_GP | 8},  \
1569     {"$t1",     RTYPE_GP | 9},  \
1570     {"$t2",     RTYPE_GP | 10}, \
1571     {"$t3",     RTYPE_GP | 11}, \
1572     {"$t4",     RTYPE_GP | 12}, \
1573     {"$t5",     RTYPE_GP | 13}, \
1574     {"$t6",     RTYPE_GP | 14}, \
1575     {"$t7",     RTYPE_GP | 15}, \
1576     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1577     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1578     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1579     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1580
1581 /* Remaining symbolic register names */
1582 #define SYMBOLIC_REGISTER_NAMES \
1583     {"$zero",   RTYPE_GP | 0},  \
1584     {"$at",     RTYPE_GP | 1},  \
1585     {"$AT",     RTYPE_GP | 1},  \
1586     {"$v0",     RTYPE_GP | 2},  \
1587     {"$v1",     RTYPE_GP | 3},  \
1588     {"$a0",     RTYPE_GP | 4},  \
1589     {"$a1",     RTYPE_GP | 5},  \
1590     {"$a2",     RTYPE_GP | 6},  \
1591     {"$a3",     RTYPE_GP | 7},  \
1592     {"$s0",     RTYPE_GP | 16}, \
1593     {"$s1",     RTYPE_GP | 17}, \
1594     {"$s2",     RTYPE_GP | 18}, \
1595     {"$s3",     RTYPE_GP | 19}, \
1596     {"$s4",     RTYPE_GP | 20}, \
1597     {"$s5",     RTYPE_GP | 21}, \
1598     {"$s6",     RTYPE_GP | 22}, \
1599     {"$s7",     RTYPE_GP | 23}, \
1600     {"$t8",     RTYPE_GP | 24}, \
1601     {"$t9",     RTYPE_GP | 25}, \
1602     {"$k0",     RTYPE_GP | 26}, \
1603     {"$kt0",    RTYPE_GP | 26}, \
1604     {"$k1",     RTYPE_GP | 27}, \
1605     {"$kt1",    RTYPE_GP | 27}, \
1606     {"$gp",     RTYPE_GP | 28}, \
1607     {"$sp",     RTYPE_GP | 29}, \
1608     {"$s8",     RTYPE_GP | 30}, \
1609     {"$fp",     RTYPE_GP | 30}, \
1610     {"$ra",     RTYPE_GP | 31}
1611
1612 #define MIPS16_SPECIAL_REGISTER_NAMES \
1613     {"$pc",     RTYPE_PC | 0}
1614
1615 #define MDMX_VECTOR_REGISTER_NAMES \
1616     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1617     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1618     {"$v2",     RTYPE_VEC | 2},  \
1619     {"$v3",     RTYPE_VEC | 3},  \
1620     {"$v4",     RTYPE_VEC | 4},  \
1621     {"$v5",     RTYPE_VEC | 5},  \
1622     {"$v6",     RTYPE_VEC | 6},  \
1623     {"$v7",     RTYPE_VEC | 7},  \
1624     {"$v8",     RTYPE_VEC | 8},  \
1625     {"$v9",     RTYPE_VEC | 9},  \
1626     {"$v10",    RTYPE_VEC | 10}, \
1627     {"$v11",    RTYPE_VEC | 11}, \
1628     {"$v12",    RTYPE_VEC | 12}, \
1629     {"$v13",    RTYPE_VEC | 13}, \
1630     {"$v14",    RTYPE_VEC | 14}, \
1631     {"$v15",    RTYPE_VEC | 15}, \
1632     {"$v16",    RTYPE_VEC | 16}, \
1633     {"$v17",    RTYPE_VEC | 17}, \
1634     {"$v18",    RTYPE_VEC | 18}, \
1635     {"$v19",    RTYPE_VEC | 19}, \
1636     {"$v20",    RTYPE_VEC | 20}, \
1637     {"$v21",    RTYPE_VEC | 21}, \
1638     {"$v22",    RTYPE_VEC | 22}, \
1639     {"$v23",    RTYPE_VEC | 23}, \
1640     {"$v24",    RTYPE_VEC | 24}, \
1641     {"$v25",    RTYPE_VEC | 25}, \
1642     {"$v26",    RTYPE_VEC | 26}, \
1643     {"$v27",    RTYPE_VEC | 27}, \
1644     {"$v28",    RTYPE_VEC | 28}, \
1645     {"$v29",    RTYPE_VEC | 29}, \
1646     {"$v30",    RTYPE_VEC | 30}, \
1647     {"$v31",    RTYPE_VEC | 31}
1648
1649 #define MIPS_DSP_ACCUMULATOR_NAMES \
1650     {"$ac0",    RTYPE_ACC | 0}, \
1651     {"$ac1",    RTYPE_ACC | 1}, \
1652     {"$ac2",    RTYPE_ACC | 2}, \
1653     {"$ac3",    RTYPE_ACC | 3}
1654
1655 static const struct regname reg_names[] = {
1656   GENERIC_REGISTER_NUMBERS,
1657   FPU_REGISTER_NAMES,
1658   FPU_CONDITION_CODE_NAMES,
1659   COPROC_CONDITION_CODE_NAMES,
1660
1661   /* The $txx registers depends on the abi,
1662      these will be added later into the symbol table from
1663      one of the tables below once mips_abi is set after 
1664      parsing of arguments from the command line. */
1665   SYMBOLIC_REGISTER_NAMES,
1666
1667   MIPS16_SPECIAL_REGISTER_NAMES,
1668   MDMX_VECTOR_REGISTER_NAMES,
1669   MIPS_DSP_ACCUMULATOR_NAMES,
1670   {0, 0}
1671 };
1672
1673 static const struct regname reg_names_o32[] = {
1674   O32_SYMBOLIC_REGISTER_NAMES,
1675   {0, 0}
1676 };
1677
1678 static const struct regname reg_names_n32n64[] = {
1679   N32N64_SYMBOLIC_REGISTER_NAMES,
1680   {0, 0}
1681 };
1682
1683 static int
1684 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1685 {
1686   symbolS *symbolP;
1687   char *e;
1688   char save_c;
1689   int reg = -1;
1690
1691   /* Find end of name.  */
1692   e = *s;
1693   if (is_name_beginner (*e))
1694     ++e;
1695   while (is_part_of_name (*e))
1696     ++e;
1697
1698   /* Terminate name.  */
1699   save_c = *e;
1700   *e = '\0';
1701
1702   /* Look for a register symbol.  */
1703   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1704     {
1705       int r = S_GET_VALUE (symbolP);
1706       if (r & types)
1707         reg = r & RNUM_MASK;
1708       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1709         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1710         reg = (r & RNUM_MASK) - 2;
1711     }
1712   /* Else see if this is a register defined in an itbl entry.  */
1713   else if ((types & RTYPE_GP) && itbl_have_entries)
1714     {
1715       char *n = *s;
1716       unsigned long r;
1717
1718       if (*n == '$')
1719         ++n;
1720       if (itbl_get_reg_val (n, &r))
1721         reg = r & RNUM_MASK;
1722     }
1723
1724   /* Advance to next token if a register was recognised.  */
1725   if (reg >= 0)
1726     *s = e;
1727   else if (types & RWARN)
1728     as_warn ("Unrecognized register name `%s'", *s);
1729
1730   *e = save_c;
1731   if (regnop)
1732     *regnop = reg;
1733   return reg >= 0;
1734 }
1735
1736 /* This function is called once, at assembler startup time.  It should set up
1737    all the tables, etc. that the MD part of the assembler will need.  */
1738
1739 void
1740 md_begin (void)
1741 {
1742   const char *retval = NULL;
1743   int i = 0;
1744   int broken = 0;
1745
1746   if (mips_pic != NO_PIC)
1747     {
1748       if (g_switch_seen && g_switch_value != 0)
1749         as_bad (_("-G may not be used in position-independent code"));
1750       g_switch_value = 0;
1751     }
1752
1753   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1754     as_warn (_("Could not set architecture and machine"));
1755
1756   op_hash = hash_new ();
1757
1758   for (i = 0; i < NUMOPCODES;)
1759     {
1760       const char *name = mips_opcodes[i].name;
1761
1762       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1763       if (retval != NULL)
1764         {
1765           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1766                    mips_opcodes[i].name, retval);
1767           /* Probably a memory allocation problem?  Give up now.  */
1768           as_fatal (_("Broken assembler.  No assembly attempted."));
1769         }
1770       do
1771         {
1772           if (mips_opcodes[i].pinfo != INSN_MACRO)
1773             {
1774               if (!validate_mips_insn (&mips_opcodes[i]))
1775                 broken = 1;
1776               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1777                 {
1778                   create_insn (&nop_insn, mips_opcodes + i);
1779                   nop_insn.fixed_p = 1;
1780                 }
1781             }
1782           ++i;
1783         }
1784       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1785     }
1786
1787   mips16_op_hash = hash_new ();
1788
1789   i = 0;
1790   while (i < bfd_mips16_num_opcodes)
1791     {
1792       const char *name = mips16_opcodes[i].name;
1793
1794       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1795       if (retval != NULL)
1796         as_fatal (_("internal: can't hash `%s': %s"),
1797                   mips16_opcodes[i].name, retval);
1798       do
1799         {
1800           if (mips16_opcodes[i].pinfo != INSN_MACRO
1801               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1802                   != mips16_opcodes[i].match))
1803             {
1804               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1805                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1806               broken = 1;
1807             }
1808           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1809             {
1810               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1811               mips16_nop_insn.fixed_p = 1;
1812             }
1813           ++i;
1814         }
1815       while (i < bfd_mips16_num_opcodes
1816              && strcmp (mips16_opcodes[i].name, name) == 0);
1817     }
1818
1819   if (broken)
1820     as_fatal (_("Broken assembler.  No assembly attempted."));
1821
1822   /* We add all the general register names to the symbol table.  This
1823      helps us detect invalid uses of them.  */
1824   for (i = 0; reg_names[i].name; i++) 
1825     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1826                                      reg_names[i].num, // & RNUM_MASK,
1827                                      &zero_address_frag));
1828   if (HAVE_NEWABI)
1829     for (i = 0; reg_names_n32n64[i].name; i++) 
1830       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1831                                        reg_names_n32n64[i].num, // & RNUM_MASK,
1832                                        &zero_address_frag));
1833   else
1834     for (i = 0; reg_names_o32[i].name; i++) 
1835       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1836                                        reg_names_o32[i].num, // & RNUM_MASK,
1837                                        &zero_address_frag));
1838
1839   mips_no_prev_insn ();
1840
1841   mips_gprmask = 0;
1842   mips_cprmask[0] = 0;
1843   mips_cprmask[1] = 0;
1844   mips_cprmask[2] = 0;
1845   mips_cprmask[3] = 0;
1846
1847   /* set the default alignment for the text section (2**2) */
1848   record_alignment (text_section, 2);
1849
1850   bfd_set_gp_size (stdoutput, g_switch_value);
1851
1852 #ifdef OBJ_ELF
1853   if (IS_ELF)
1854     {
1855       /* On a native system other than VxWorks, sections must be aligned
1856          to 16 byte boundaries.  When configured for an embedded ELF
1857          target, we don't bother.  */
1858       if (strcmp (TARGET_OS, "elf") != 0
1859           && strcmp (TARGET_OS, "vxworks") != 0)
1860         {
1861           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1862           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1863           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1864         }
1865
1866       /* Create a .reginfo section for register masks and a .mdebug
1867          section for debugging information.  */
1868       {
1869         segT seg;
1870         subsegT subseg;
1871         flagword flags;
1872         segT sec;
1873
1874         seg = now_seg;
1875         subseg = now_subseg;
1876
1877         /* The ABI says this section should be loaded so that the
1878            running program can access it.  However, we don't load it
1879            if we are configured for an embedded target */
1880         flags = SEC_READONLY | SEC_DATA;
1881         if (strcmp (TARGET_OS, "elf") != 0)
1882           flags |= SEC_ALLOC | SEC_LOAD;
1883
1884         if (mips_abi != N64_ABI)
1885           {
1886             sec = subseg_new (".reginfo", (subsegT) 0);
1887
1888             bfd_set_section_flags (stdoutput, sec, flags);
1889             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1890
1891             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1892           }
1893         else
1894           {
1895             /* The 64-bit ABI uses a .MIPS.options section rather than
1896                .reginfo section.  */
1897             sec = subseg_new (".MIPS.options", (subsegT) 0);
1898             bfd_set_section_flags (stdoutput, sec, flags);
1899             bfd_set_section_alignment (stdoutput, sec, 3);
1900
1901             /* Set up the option header.  */
1902             {
1903               Elf_Internal_Options opthdr;
1904               char *f;
1905
1906               opthdr.kind = ODK_REGINFO;
1907               opthdr.size = (sizeof (Elf_External_Options)
1908                              + sizeof (Elf64_External_RegInfo));
1909               opthdr.section = 0;
1910               opthdr.info = 0;
1911               f = frag_more (sizeof (Elf_External_Options));
1912               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1913                                              (Elf_External_Options *) f);
1914
1915               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1916             }
1917           }
1918
1919         if (ECOFF_DEBUGGING)
1920           {
1921             sec = subseg_new (".mdebug", (subsegT) 0);
1922             (void) bfd_set_section_flags (stdoutput, sec,
1923                                           SEC_HAS_CONTENTS | SEC_READONLY);
1924             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1925           }
1926         else if (mips_flag_pdr)
1927           {
1928             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1929             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1930                                           SEC_READONLY | SEC_RELOC
1931                                           | SEC_DEBUGGING);
1932             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1933           }
1934
1935         subseg_set (seg, subseg);
1936       }
1937     }
1938 #endif /* OBJ_ELF */
1939
1940   if (! ECOFF_DEBUGGING)
1941     md_obj_begin ();
1942
1943   if (mips_fix_vr4120)
1944     init_vr4120_conflicts ();
1945 }
1946
1947 void
1948 md_mips_end (void)
1949 {
1950   if (! ECOFF_DEBUGGING)
1951     md_obj_end ();
1952 }
1953
1954 void
1955 md_assemble (char *str)
1956 {
1957   struct mips_cl_insn insn;
1958   bfd_reloc_code_real_type unused_reloc[3]
1959     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1960
1961   imm_expr.X_op = O_absent;
1962   imm2_expr.X_op = O_absent;
1963   offset_expr.X_op = O_absent;
1964   imm_reloc[0] = BFD_RELOC_UNUSED;
1965   imm_reloc[1] = BFD_RELOC_UNUSED;
1966   imm_reloc[2] = BFD_RELOC_UNUSED;
1967   offset_reloc[0] = BFD_RELOC_UNUSED;
1968   offset_reloc[1] = BFD_RELOC_UNUSED;
1969   offset_reloc[2] = BFD_RELOC_UNUSED;
1970
1971   if (mips_opts.mips16)
1972     mips16_ip (str, &insn);
1973   else
1974     {
1975       mips_ip (str, &insn);
1976       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1977             str, insn.insn_opcode));
1978     }
1979
1980   if (insn_error)
1981     {
1982       as_bad ("%s `%s'", insn_error, str);
1983       return;
1984     }
1985
1986   if (insn.insn_mo->pinfo == INSN_MACRO)
1987     {
1988       macro_start ();
1989       if (mips_opts.mips16)
1990         mips16_macro (&insn);
1991       else
1992         macro (&insn);
1993       macro_end ();
1994     }
1995   else
1996     {
1997       if (imm_expr.X_op != O_absent)
1998         append_insn (&insn, &imm_expr, imm_reloc);
1999       else if (offset_expr.X_op != O_absent)
2000         append_insn (&insn, &offset_expr, offset_reloc);
2001       else
2002         append_insn (&insn, NULL, unused_reloc);
2003     }
2004 }
2005
2006 /* Return true if the given relocation might need a matching %lo().
2007    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2008    need a matching %lo() when applied to local symbols.  */
2009
2010 static inline bfd_boolean
2011 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2012 {
2013   return (HAVE_IN_PLACE_ADDENDS
2014           && (reloc == BFD_RELOC_HI16_S
2015               || reloc == BFD_RELOC_MIPS16_HI16_S
2016               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2017                  all GOT16 relocations evaluate to "G".  */
2018               || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
2019 }
2020
2021 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2022    relocation.  */
2023
2024 static inline bfd_boolean
2025 fixup_has_matching_lo_p (fixS *fixp)
2026 {
2027   return (fixp->fx_next != NULL
2028           && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
2029              || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
2030           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2031           && fixp->fx_offset == fixp->fx_next->fx_offset);
2032 }
2033
2034 /* See whether instruction IP reads register REG.  CLASS is the type
2035    of register.  */
2036
2037 static int
2038 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2039                enum mips_regclass class)
2040 {
2041   if (class == MIPS16_REG)
2042     {
2043       assert (mips_opts.mips16);
2044       reg = mips16_to_32_reg_map[reg];
2045       class = MIPS_GR_REG;
2046     }
2047
2048   /* Don't report on general register ZERO, since it never changes.  */
2049   if (class == MIPS_GR_REG && reg == ZERO)
2050     return 0;
2051
2052   if (class == MIPS_FP_REG)
2053     {
2054       assert (! mips_opts.mips16);
2055       /* If we are called with either $f0 or $f1, we must check $f0.
2056          This is not optimal, because it will introduce an unnecessary
2057          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2058          need to distinguish reading both $f0 and $f1 or just one of
2059          them.  Note that we don't have to check the other way,
2060          because there is no instruction that sets both $f0 and $f1
2061          and requires a delay.  */
2062       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2063           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2064               == (reg &~ (unsigned) 1)))
2065         return 1;
2066       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2067           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2068               == (reg &~ (unsigned) 1)))
2069         return 1;
2070     }
2071   else if (! mips_opts.mips16)
2072     {
2073       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2074           && EXTRACT_OPERAND (RS, *ip) == reg)
2075         return 1;
2076       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2077           && EXTRACT_OPERAND (RT, *ip) == reg)
2078         return 1;
2079     }
2080   else
2081     {
2082       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2083           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2084         return 1;
2085       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2086           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2087         return 1;
2088       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2089           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2090               == reg))
2091         return 1;
2092       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2093         return 1;
2094       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2095         return 1;
2096       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2097         return 1;
2098       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2099           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2100         return 1;
2101     }
2102
2103   return 0;
2104 }
2105
2106 /* This function returns true if modifying a register requires a
2107    delay.  */
2108
2109 static int
2110 reg_needs_delay (unsigned int reg)
2111 {
2112   unsigned long prev_pinfo;
2113
2114   prev_pinfo = history[0].insn_mo->pinfo;
2115   if (! mips_opts.noreorder
2116       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2117            && ! gpr_interlocks)
2118           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2119               && ! cop_interlocks)))
2120     {
2121       /* A load from a coprocessor or from memory.  All load delays
2122          delay the use of general register rt for one instruction.  */
2123       /* Itbl support may require additional care here.  */
2124       know (prev_pinfo & INSN_WRITE_GPR_T);
2125       if (reg == EXTRACT_OPERAND (RT, history[0]))
2126         return 1;
2127     }
2128
2129   return 0;
2130 }
2131
2132 /* Move all labels in insn_labels to the current insertion point.  */
2133
2134 static void
2135 mips_move_labels (void)
2136 {
2137   segment_info_type *si = seg_info (now_seg);
2138   struct insn_label_list *l;
2139   valueT val;
2140
2141   for (l = si->label_list; l != NULL; l = l->next)
2142     {
2143       assert (S_GET_SEGMENT (l->label) == now_seg);
2144       symbol_set_frag (l->label, frag_now);
2145       val = (valueT) frag_now_fix ();
2146       /* mips16 text labels are stored as odd.  */
2147       if (mips_opts.mips16)
2148         ++val;
2149       S_SET_VALUE (l->label, val);
2150     }
2151 }
2152
2153 static bfd_boolean
2154 s_is_linkonce (symbolS *sym, segT from_seg)
2155 {
2156   bfd_boolean linkonce = FALSE;
2157   segT symseg = S_GET_SEGMENT (sym);
2158
2159   if (symseg != from_seg && !S_IS_LOCAL (sym))
2160     {
2161       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2162         linkonce = TRUE;
2163 #ifdef OBJ_ELF
2164       /* The GNU toolchain uses an extension for ELF: a section
2165          beginning with the magic string .gnu.linkonce is a
2166          linkonce section.  */
2167       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2168                    sizeof ".gnu.linkonce" - 1) == 0)
2169         linkonce = TRUE;
2170 #endif
2171     }
2172   return linkonce;
2173 }
2174
2175 /* Mark instruction labels in mips16 mode.  This permits the linker to
2176    handle them specially, such as generating jalx instructions when
2177    needed.  We also make them odd for the duration of the assembly, in
2178    order to generate the right sort of code.  We will make them even
2179    in the adjust_symtab routine, while leaving them marked.  This is
2180    convenient for the debugger and the disassembler.  The linker knows
2181    to make them odd again.  */
2182
2183 static void
2184 mips16_mark_labels (void)
2185 {
2186   segment_info_type *si = seg_info (now_seg);
2187   struct insn_label_list *l;
2188
2189   if (!mips_opts.mips16)
2190     return;
2191
2192   for (l = si->label_list; l != NULL; l = l->next)
2193    {
2194       symbolS *label = l->label;
2195
2196 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2197       if (IS_ELF)
2198         S_SET_OTHER (label, STO_MIPS16);
2199 #endif
2200       if ((S_GET_VALUE (label) & 1) == 0
2201         /* Don't adjust the address if the label is global or weak, or
2202            in a link-once section, since we'll be emitting symbol reloc
2203            references to it which will be patched up by the linker, and
2204            the final value of the symbol may or may not be MIPS16.  */
2205           && ! S_IS_WEAK (label)
2206           && ! S_IS_EXTERNAL (label)
2207           && ! s_is_linkonce (label, now_seg))
2208         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2209     }
2210 }
2211
2212 /* End the current frag.  Make it a variant frag and record the
2213    relaxation info.  */
2214
2215 static void
2216 relax_close_frag (void)
2217 {
2218   mips_macro_warning.first_frag = frag_now;
2219   frag_var (rs_machine_dependent, 0, 0,
2220             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2221             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2222
2223   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2224   mips_relax.first_fixup = 0;
2225 }
2226
2227 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2228    See the comment above RELAX_ENCODE for more details.  */
2229
2230 static void
2231 relax_start (symbolS *symbol)
2232 {
2233   assert (mips_relax.sequence == 0);
2234   mips_relax.sequence = 1;
2235   mips_relax.symbol = symbol;
2236 }
2237
2238 /* Start generating the second version of a relaxable sequence.
2239    See the comment above RELAX_ENCODE for more details.  */
2240
2241 static void
2242 relax_switch (void)
2243 {
2244   assert (mips_relax.sequence == 1);
2245   mips_relax.sequence = 2;
2246 }
2247
2248 /* End the current relaxable sequence.  */
2249
2250 static void
2251 relax_end (void)
2252 {
2253   assert (mips_relax.sequence == 2);
2254   relax_close_frag ();
2255   mips_relax.sequence = 0;
2256 }
2257
2258 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2259    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2260    by VR4120 errata.  */
2261
2262 static unsigned int
2263 classify_vr4120_insn (const char *name)
2264 {
2265   if (strncmp (name, "macc", 4) == 0)
2266     return FIX_VR4120_MACC;
2267   if (strncmp (name, "dmacc", 5) == 0)
2268     return FIX_VR4120_DMACC;
2269   if (strncmp (name, "mult", 4) == 0)
2270     return FIX_VR4120_MULT;
2271   if (strncmp (name, "dmult", 5) == 0)
2272     return FIX_VR4120_DMULT;
2273   if (strstr (name, "div"))
2274     return FIX_VR4120_DIV;
2275   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2276     return FIX_VR4120_MTHILO;
2277   return NUM_FIX_VR4120_CLASSES;
2278 }
2279
2280 /* Return the number of instructions that must separate INSN1 and INSN2,
2281    where INSN1 is the earlier instruction.  Return the worst-case value
2282    for any INSN2 if INSN2 is null.  */
2283
2284 static unsigned int
2285 insns_between (const struct mips_cl_insn *insn1,
2286                const struct mips_cl_insn *insn2)
2287 {
2288   unsigned long pinfo1, pinfo2;
2289
2290   /* This function needs to know which pinfo flags are set for INSN2
2291      and which registers INSN2 uses.  The former is stored in PINFO2 and
2292      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2293      will have every flag set and INSN2_USES_REG will always return true.  */
2294   pinfo1 = insn1->insn_mo->pinfo;
2295   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2296
2297 #define INSN2_USES_REG(REG, CLASS) \
2298    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2299
2300   /* For most targets, write-after-read dependencies on the HI and LO
2301      registers must be separated by at least two instructions.  */
2302   if (!hilo_interlocks)
2303     {
2304       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2305         return 2;
2306       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2307         return 2;
2308     }
2309
2310   /* If we're working around r7000 errata, there must be two instructions
2311      between an mfhi or mflo and any instruction that uses the result.  */
2312   if (mips_7000_hilo_fix
2313       && MF_HILO_INSN (pinfo1)
2314       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2315     return 2;
2316
2317   /* If working around VR4120 errata, check for combinations that need
2318      a single intervening instruction.  */
2319   if (mips_fix_vr4120)
2320     {
2321       unsigned int class1, class2;
2322
2323       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2324       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2325         {
2326           if (insn2 == NULL)
2327             return 1;
2328           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2329           if (vr4120_conflicts[class1] & (1 << class2))
2330             return 1;
2331         }
2332     }
2333
2334   if (!mips_opts.mips16)
2335     {
2336       /* Check for GPR or coprocessor load delays.  All such delays
2337          are on the RT register.  */
2338       /* Itbl support may require additional care here.  */
2339       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2340           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2341         {
2342           know (pinfo1 & INSN_WRITE_GPR_T);
2343           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2344             return 1;
2345         }
2346
2347       /* Check for generic coprocessor hazards.
2348
2349          This case is not handled very well.  There is no special
2350          knowledge of CP0 handling, and the coprocessors other than
2351          the floating point unit are not distinguished at all.  */
2352       /* Itbl support may require additional care here. FIXME!
2353          Need to modify this to include knowledge about
2354          user specified delays!  */
2355       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2356                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2357         {
2358           /* Handle cases where INSN1 writes to a known general coprocessor
2359              register.  There must be a one instruction delay before INSN2
2360              if INSN2 reads that register, otherwise no delay is needed.  */
2361           if (pinfo1 & INSN_WRITE_FPR_T)
2362             {
2363               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2364                 return 1;
2365             }
2366           else if (pinfo1 & INSN_WRITE_FPR_S)
2367             {
2368               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2369                 return 1;
2370             }
2371           else
2372             {
2373               /* Read-after-write dependencies on the control registers
2374                  require a two-instruction gap.  */
2375               if ((pinfo1 & INSN_WRITE_COND_CODE)
2376                   && (pinfo2 & INSN_READ_COND_CODE))
2377                 return 2;
2378
2379               /* We don't know exactly what INSN1 does.  If INSN2 is
2380                  also a coprocessor instruction, assume there must be
2381                  a one instruction gap.  */
2382               if (pinfo2 & INSN_COP)
2383                 return 1;
2384             }
2385         }
2386
2387       /* Check for read-after-write dependencies on the coprocessor
2388          control registers in cases where INSN1 does not need a general
2389          coprocessor delay.  This means that INSN1 is a floating point
2390          comparison instruction.  */
2391       /* Itbl support may require additional care here.  */
2392       else if (!cop_interlocks
2393                && (pinfo1 & INSN_WRITE_COND_CODE)
2394                && (pinfo2 & INSN_READ_COND_CODE))
2395         return 1;
2396     }
2397
2398 #undef INSN2_USES_REG
2399
2400   return 0;
2401 }
2402
2403 /* Return the number of nops that would be needed to work around the
2404    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2405    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2406
2407 static int
2408 nops_for_vr4130 (const struct mips_cl_insn *history,
2409                  const struct mips_cl_insn *insn)
2410 {
2411   int i, j, reg;
2412
2413   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2414      are not affected by the errata.  */
2415   if (insn != 0
2416       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2417           || strcmp (insn->insn_mo->name, "mtlo") == 0
2418           || strcmp (insn->insn_mo->name, "mthi") == 0))
2419     return 0;
2420
2421   /* Search for the first MFLO or MFHI.  */
2422   for (i = 0; i < MAX_VR4130_NOPS; i++)
2423     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2424       {
2425         /* Extract the destination register.  */
2426         if (mips_opts.mips16)
2427           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2428         else
2429           reg = EXTRACT_OPERAND (RD, history[i]);
2430
2431         /* No nops are needed if INSN reads that register.  */
2432         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2433           return 0;
2434
2435         /* ...or if any of the intervening instructions do.  */
2436         for (j = 0; j < i; j++)
2437           if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2438             return 0;
2439
2440         return MAX_VR4130_NOPS - i;
2441       }
2442   return 0;
2443 }
2444
2445 /* Return the number of nops that would be needed if instruction INSN
2446    immediately followed the MAX_NOPS instructions given by HISTORY,
2447    where HISTORY[0] is the most recent instruction.  If INSN is null,
2448    return the worse-case number of nops for any instruction.  */
2449
2450 static int
2451 nops_for_insn (const struct mips_cl_insn *history,
2452                const struct mips_cl_insn *insn)
2453 {
2454   int i, nops, tmp_nops;
2455
2456   nops = 0;
2457   for (i = 0; i < MAX_DELAY_NOPS; i++)
2458     if (!history[i].noreorder_p)
2459       {
2460         tmp_nops = insns_between (history + i, insn) - i;
2461         if (tmp_nops > nops)
2462           nops = tmp_nops;
2463       }
2464
2465   if (mips_fix_vr4130)
2466     {
2467       tmp_nops = nops_for_vr4130 (history, insn);
2468       if (tmp_nops > nops)
2469         nops = tmp_nops;
2470     }
2471
2472   return nops;
2473 }
2474
2475 /* The variable arguments provide NUM_INSNS extra instructions that
2476    might be added to HISTORY.  Return the largest number of nops that
2477    would be needed after the extended sequence.  */
2478
2479 static int
2480 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2481 {
2482   va_list args;
2483   struct mips_cl_insn buffer[MAX_NOPS];
2484   struct mips_cl_insn *cursor;
2485   int nops;
2486
2487   va_start (args, history);
2488   cursor = buffer + num_insns;
2489   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2490   while (cursor > buffer)
2491     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2492
2493   nops = nops_for_insn (buffer, NULL);
2494   va_end (args);
2495   return nops;
2496 }
2497
2498 /* Like nops_for_insn, but if INSN is a branch, take into account the
2499    worst-case delay for the branch target.  */
2500
2501 static int
2502 nops_for_insn_or_target (const struct mips_cl_insn *history,
2503                          const struct mips_cl_insn *insn)
2504 {
2505   int nops, tmp_nops;
2506
2507   nops = nops_for_insn (history, insn);
2508   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2509                               | INSN_COND_BRANCH_DELAY
2510                               | INSN_COND_BRANCH_LIKELY))
2511     {
2512       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2513       if (tmp_nops > nops)
2514         nops = tmp_nops;
2515     }
2516   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2517     {
2518       tmp_nops = nops_for_sequence (1, history, insn);
2519       if (tmp_nops > nops)
2520         nops = tmp_nops;
2521     }
2522   return nops;
2523 }
2524
2525 /* Output an instruction.  IP is the instruction information.
2526    ADDRESS_EXPR is an operand of the instruction to be used with
2527    RELOC_TYPE.  */
2528
2529 static void
2530 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2531              bfd_reloc_code_real_type *reloc_type)
2532 {
2533   unsigned long prev_pinfo, pinfo;
2534   relax_stateT prev_insn_frag_type = 0;
2535   bfd_boolean relaxed_branch = FALSE;
2536   segment_info_type *si = seg_info (now_seg);
2537
2538   /* Mark instruction labels in mips16 mode.  */
2539   mips16_mark_labels ();
2540
2541   prev_pinfo = history[0].insn_mo->pinfo;
2542   pinfo = ip->insn_mo->pinfo;
2543
2544   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2545     {
2546       /* There are a lot of optimizations we could do that we don't.
2547          In particular, we do not, in general, reorder instructions.
2548          If you use gcc with optimization, it will reorder
2549          instructions and generally do much more optimization then we
2550          do here; repeating all that work in the assembler would only
2551          benefit hand written assembly code, and does not seem worth
2552          it.  */
2553       int nops = (mips_optimize == 0
2554                   ? nops_for_insn (history, NULL)
2555                   : nops_for_insn_or_target (history, ip));
2556       if (nops > 0)
2557         {
2558           fragS *old_frag;
2559           unsigned long old_frag_offset;
2560           int i;
2561
2562           old_frag = frag_now;
2563           old_frag_offset = frag_now_fix ();
2564
2565           for (i = 0; i < nops; i++)
2566             emit_nop ();
2567
2568           if (listing)
2569             {
2570               listing_prev_line ();
2571               /* We may be at the start of a variant frag.  In case we
2572                  are, make sure there is enough space for the frag
2573                  after the frags created by listing_prev_line.  The
2574                  argument to frag_grow here must be at least as large
2575                  as the argument to all other calls to frag_grow in
2576                  this file.  We don't have to worry about being in the
2577                  middle of a variant frag, because the variants insert
2578                  all needed nop instructions themselves.  */
2579               frag_grow (40);
2580             }
2581
2582           mips_move_labels ();
2583
2584 #ifndef NO_ECOFF_DEBUGGING
2585           if (ECOFF_DEBUGGING)
2586             ecoff_fix_loc (old_frag, old_frag_offset);
2587 #endif
2588         }
2589     }
2590   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2591     {
2592       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2593       int nops = nops_for_insn_or_target (history, ip);
2594       assert (nops <= prev_nop_frag_holds);
2595
2596       /* Enforce NOPS as a minimum.  */
2597       if (nops > prev_nop_frag_required)
2598         prev_nop_frag_required = nops;
2599
2600       if (prev_nop_frag_holds == prev_nop_frag_required)
2601         {
2602           /* Settle for the current number of nops.  Update the history
2603              accordingly (for the benefit of any future .set reorder code).  */
2604           prev_nop_frag = NULL;
2605           insert_into_history (prev_nop_frag_since,
2606                                prev_nop_frag_holds, NOP_INSN);
2607         }
2608       else
2609         {
2610           /* Allow this instruction to replace one of the nops that was
2611              tentatively added to prev_nop_frag.  */
2612           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2613           prev_nop_frag_holds--;
2614           prev_nop_frag_since++;
2615         }
2616     }
2617
2618 #ifdef OBJ_ELF
2619   /* The value passed to dwarf2_emit_insn is the distance between
2620      the beginning of the current instruction and the address that
2621      should be recorded in the debug tables.  For MIPS16 debug info
2622      we want to use ISA-encoded addresses, so we pass -1 for an
2623      address higher by one than the current.  */
2624   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2625 #endif
2626
2627   /* Record the frag type before frag_var.  */
2628   if (history[0].frag)
2629     prev_insn_frag_type = history[0].frag->fr_type;
2630
2631   if (address_expr
2632       && *reloc_type == BFD_RELOC_16_PCREL_S2
2633       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2634           || pinfo & INSN_COND_BRANCH_LIKELY)
2635       && mips_relax_branch
2636       /* Don't try branch relaxation within .set nomacro, or within
2637          .set noat if we use $at for PIC computations.  If it turns
2638          out that the branch was out-of-range, we'll get an error.  */
2639       && !mips_opts.warn_about_macros
2640       && !(mips_opts.noat && mips_pic != NO_PIC)
2641       && !mips_opts.mips16)
2642     {
2643       relaxed_branch = TRUE;
2644       add_relaxed_insn (ip, (relaxed_branch_length
2645                              (NULL, NULL,
2646                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2647                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2648                               : 0)), 4,
2649                         RELAX_BRANCH_ENCODE
2650                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2651                          pinfo & INSN_COND_BRANCH_LIKELY,
2652                          pinfo & INSN_WRITE_GPR_31,
2653                          0),
2654                         address_expr->X_add_symbol,
2655                         address_expr->X_add_number);
2656       *reloc_type = BFD_RELOC_UNUSED;
2657     }
2658   else if (*reloc_type > BFD_RELOC_UNUSED)
2659     {
2660       /* We need to set up a variant frag.  */
2661       assert (mips_opts.mips16 && address_expr != NULL);
2662       add_relaxed_insn (ip, 4, 0,
2663                         RELAX_MIPS16_ENCODE
2664                         (*reloc_type - BFD_RELOC_UNUSED,
2665                          mips16_small, mips16_ext,
2666                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2667                          history[0].mips16_absolute_jump_p),
2668                         make_expr_symbol (address_expr), 0);
2669     }
2670   else if (mips_opts.mips16
2671            && ! ip->use_extend
2672            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2673     {
2674       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2675         /* Make sure there is enough room to swap this instruction with
2676            a following jump instruction.  */
2677         frag_grow (6);
2678       add_fixed_insn (ip);
2679     }
2680   else
2681     {
2682       if (mips_opts.mips16
2683           && mips_opts.noreorder
2684           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2685         as_warn (_("extended instruction in delay slot"));
2686
2687       if (mips_relax.sequence)
2688         {
2689           /* If we've reached the end of this frag, turn it into a variant
2690              frag and record the information for the instructions we've
2691              written so far.  */
2692           if (frag_room () < 4)
2693             relax_close_frag ();
2694           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2695         }
2696
2697       if (mips_relax.sequence != 2)
2698         mips_macro_warning.sizes[0] += 4;
2699       if (mips_relax.sequence != 1)
2700         mips_macro_warning.sizes[1] += 4;
2701
2702       if (mips_opts.mips16)
2703         {
2704           ip->fixed_p = 1;
2705           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2706         }
2707       add_fixed_insn (ip);
2708     }
2709
2710   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2711     {
2712       if (address_expr->X_op == O_constant)
2713         {
2714           unsigned int tmp;
2715
2716           switch (*reloc_type)
2717             {
2718             case BFD_RELOC_32:
2719               ip->insn_opcode |= address_expr->X_add_number;
2720               break;
2721
2722             case BFD_RELOC_MIPS_HIGHEST:
2723               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2724               ip->insn_opcode |= tmp & 0xffff;
2725               break;
2726
2727             case BFD_RELOC_MIPS_HIGHER:
2728               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2729               ip->insn_opcode |= tmp & 0xffff;
2730               break;
2731
2732             case BFD_RELOC_HI16_S:
2733               tmp = (address_expr->X_add_number + 0x8000) >> 16;
2734               ip->insn_opcode |= tmp & 0xffff;
2735               break;
2736
2737             case BFD_RELOC_HI16:
2738               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2739               break;
2740
2741             case BFD_RELOC_UNUSED:
2742             case BFD_RELOC_LO16:
2743             case BFD_RELOC_MIPS_GOT_DISP:
2744               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2745               break;
2746
2747             case BFD_RELOC_MIPS_JMP:
2748               if ((address_expr->X_add_number & 3) != 0)
2749                 as_bad (_("jump to misaligned address (0x%lx)"),
2750                         (unsigned long) address_expr->X_add_number);
2751               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2752               break;
2753
2754             case BFD_RELOC_MIPS16_JMP:
2755               if ((address_expr->X_add_number & 3) != 0)
2756                 as_bad (_("jump to misaligned address (0x%lx)"),
2757                         (unsigned long) address_expr->X_add_number);
2758               ip->insn_opcode |=
2759                 (((address_expr->X_add_number & 0x7c0000) << 3)
2760                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2761                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2762               break;
2763
2764             case BFD_RELOC_16_PCREL_S2:
2765               if ((address_expr->X_add_number & 3) != 0)
2766                 as_bad (_("branch to misaligned address (0x%lx)"),
2767                         (unsigned long) address_expr->X_add_number);
2768               if (mips_relax_branch)
2769                 goto need_reloc;
2770               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2771                 as_bad (_("branch address range overflow (0x%lx)"),
2772                         (unsigned long) address_expr->X_add_number);
2773               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2774               break;
2775
2776             default:
2777               internalError ();
2778             }
2779         }
2780       else if (*reloc_type < BFD_RELOC_UNUSED)
2781         need_reloc:
2782         {
2783           reloc_howto_type *howto;
2784           int i;
2785
2786           /* In a compound relocation, it is the final (outermost)
2787              operator that determines the relocated field.  */
2788           for (i = 1; i < 3; i++)
2789             if (reloc_type[i] == BFD_RELOC_UNUSED)
2790               break;
2791
2792           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2793           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2794                                      bfd_get_reloc_size (howto),
2795                                      address_expr,
2796                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2797                                      reloc_type[0]);
2798
2799           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
2800           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2801               && ip->fixp[0]->fx_addsy)
2802             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2803
2804           /* These relocations can have an addend that won't fit in
2805              4 octets for 64bit assembly.  */
2806           if (HAVE_64BIT_GPRS
2807               && ! howto->partial_inplace
2808               && (reloc_type[0] == BFD_RELOC_16
2809                   || reloc_type[0] == BFD_RELOC_32
2810                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2811                   || reloc_type[0] == BFD_RELOC_HI16_S
2812                   || reloc_type[0] == BFD_RELOC_LO16
2813                   || reloc_type[0] == BFD_RELOC_GPREL16
2814                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2815                   || reloc_type[0] == BFD_RELOC_GPREL32
2816                   || reloc_type[0] == BFD_RELOC_64
2817                   || reloc_type[0] == BFD_RELOC_CTOR
2818                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2819                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2820                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2821                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2822                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2823                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2824                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2825                   || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2826                   || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2827             ip->fixp[0]->fx_no_overflow = 1;
2828
2829           if (mips_relax.sequence)
2830             {
2831               if (mips_relax.first_fixup == 0)
2832                 mips_relax.first_fixup = ip->fixp[0];
2833             }
2834           else if (reloc_needs_lo_p (*reloc_type))
2835             {
2836               struct mips_hi_fixup *hi_fixup;
2837
2838               /* Reuse the last entry if it already has a matching %lo.  */
2839               hi_fixup = mips_hi_fixup_list;
2840               if (hi_fixup == 0
2841                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2842                 {
2843                   hi_fixup = ((struct mips_hi_fixup *)
2844                               xmalloc (sizeof (struct mips_hi_fixup)));
2845                   hi_fixup->next = mips_hi_fixup_list;
2846                   mips_hi_fixup_list = hi_fixup;
2847                 }
2848               hi_fixup->fixp = ip->fixp[0];
2849               hi_fixup->seg = now_seg;
2850             }
2851
2852           /* Add fixups for the second and third relocations, if given.
2853              Note that the ABI allows the second relocation to be
2854              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2855              moment we only use RSS_UNDEF, but we could add support
2856              for the others if it ever becomes necessary.  */
2857           for (i = 1; i < 3; i++)
2858             if (reloc_type[i] != BFD_RELOC_UNUSED)
2859               {
2860                 ip->fixp[i] = fix_new (ip->frag, ip->where,
2861                                        ip->fixp[0]->fx_size, NULL, 0,
2862                                        FALSE, reloc_type[i]);
2863
2864                 /* Use fx_tcbit to mark compound relocs.  */
2865                 ip->fixp[0]->fx_tcbit = 1;
2866                 ip->fixp[i]->fx_tcbit = 1;
2867               }
2868         }
2869     }
2870   install_insn (ip);
2871
2872   /* Update the register mask information.  */
2873   if (! mips_opts.mips16)
2874     {
2875       if (pinfo & INSN_WRITE_GPR_D)
2876         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2877       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2878         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2879       if (pinfo & INSN_READ_GPR_S)
2880         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2881       if (pinfo & INSN_WRITE_GPR_31)
2882         mips_gprmask |= 1 << RA;
2883       if (pinfo & INSN_WRITE_FPR_D)
2884         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2885       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2886         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2887       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2888         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2889       if ((pinfo & INSN_READ_FPR_R) != 0)
2890         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2891       if (pinfo & INSN_COP)
2892         {
2893           /* We don't keep enough information to sort these cases out.
2894              The itbl support does keep this information however, although
2895              we currently don't support itbl fprmats as part of the cop
2896              instruction.  May want to add this support in the future.  */
2897         }
2898       /* Never set the bit for $0, which is always zero.  */
2899       mips_gprmask &= ~1 << 0;
2900     }
2901   else
2902     {
2903       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2904         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2905       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2906         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2907       if (pinfo & MIPS16_INSN_WRITE_Z)
2908         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2909       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2910         mips_gprmask |= 1 << TREG;
2911       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2912         mips_gprmask |= 1 << SP;
2913       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2914         mips_gprmask |= 1 << RA;
2915       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2916         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2917       if (pinfo & MIPS16_INSN_READ_Z)
2918         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2919       if (pinfo & MIPS16_INSN_READ_GPR_X)
2920         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2921     }
2922
2923   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2924     {
2925       /* Filling the branch delay slot is more complex.  We try to
2926          switch the branch with the previous instruction, which we can
2927          do if the previous instruction does not set up a condition
2928          that the branch tests and if the branch is not itself the
2929          target of any branch.  */
2930       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2931           || (pinfo & INSN_COND_BRANCH_DELAY))
2932         {
2933           if (mips_optimize < 2
2934               /* If we have seen .set volatile or .set nomove, don't
2935                  optimize.  */
2936               || mips_opts.nomove != 0
2937               /* We can't swap if the previous instruction's position
2938                  is fixed.  */
2939               || history[0].fixed_p
2940               /* If the previous previous insn was in a .set
2941                  noreorder, we can't swap.  Actually, the MIPS
2942                  assembler will swap in this situation.  However, gcc
2943                  configured -with-gnu-as will generate code like
2944                    .set noreorder
2945                    lw   $4,XXX
2946                    .set reorder
2947                    INSN
2948                    bne  $4,$0,foo
2949                  in which we can not swap the bne and INSN.  If gcc is
2950                  not configured -with-gnu-as, it does not output the
2951                  .set pseudo-ops.  */
2952               || history[1].noreorder_p
2953               /* If the branch is itself the target of a branch, we
2954                  can not swap.  We cheat on this; all we check for is
2955                  whether there is a label on this instruction.  If
2956                  there are any branches to anything other than a
2957                  label, users must use .set noreorder.  */
2958               || si->label_list != NULL
2959               /* If the previous instruction is in a variant frag
2960                  other than this branch's one, we cannot do the swap.
2961                  This does not apply to the mips16, which uses variant
2962                  frags for different purposes.  */
2963               || (! mips_opts.mips16
2964                   && prev_insn_frag_type == rs_machine_dependent)
2965               /* Check for conflicts between the branch and the instructions
2966                  before the candidate delay slot.  */
2967               || nops_for_insn (history + 1, ip) > 0
2968               /* Check for conflicts between the swapped sequence and the
2969                  target of the branch.  */
2970               || nops_for_sequence (2, history + 1, ip, history) > 0
2971               /* We do not swap with a trap instruction, since it
2972                  complicates trap handlers to have the trap
2973                  instruction be in a delay slot.  */
2974               || (prev_pinfo & INSN_TRAP)
2975               /* If the branch reads a register that the previous
2976                  instruction sets, we can not swap.  */
2977               || (! mips_opts.mips16
2978                   && (prev_pinfo & INSN_WRITE_GPR_T)
2979                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
2980                                     MIPS_GR_REG))
2981               || (! mips_opts.mips16
2982                   && (prev_pinfo & INSN_WRITE_GPR_D)
2983                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
2984                                     MIPS_GR_REG))
2985               || (mips_opts.mips16
2986                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
2987                        && (insn_uses_reg
2988                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
2989                             MIPS16_REG)))
2990                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
2991                           && (insn_uses_reg
2992                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
2993                                MIPS16_REG)))
2994                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
2995                           && (insn_uses_reg
2996                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
2997                                MIPS16_REG)))
2998                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
2999                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3000                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3001                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3002                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3003                           && insn_uses_reg (ip,
3004                                             MIPS16OP_EXTRACT_REG32R
3005                                               (history[0].insn_opcode),
3006                                             MIPS_GR_REG))))
3007               /* If the branch writes a register that the previous
3008                  instruction sets, we can not swap (we know that
3009                  branches write only to RD or to $31).  */
3010               || (! mips_opts.mips16
3011                   && (prev_pinfo & INSN_WRITE_GPR_T)
3012                   && (((pinfo & INSN_WRITE_GPR_D)
3013                        && (EXTRACT_OPERAND (RT, history[0])
3014                            == EXTRACT_OPERAND (RD, *ip)))
3015                       || ((pinfo & INSN_WRITE_GPR_31)
3016                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3017               || (! mips_opts.mips16
3018                   && (prev_pinfo & INSN_WRITE_GPR_D)
3019                   && (((pinfo & INSN_WRITE_GPR_D)
3020                        && (EXTRACT_OPERAND (RD, history[0])
3021                            == EXTRACT_OPERAND (RD, *ip)))
3022                       || ((pinfo & INSN_WRITE_GPR_31)
3023                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3024               || (mips_opts.mips16
3025                   && (pinfo & MIPS16_INSN_WRITE_31)
3026                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3027                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3028                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3029                               == RA))))
3030               /* If the branch writes a register that the previous
3031                  instruction reads, we can not swap (we know that
3032                  branches only write to RD or to $31).  */
3033               || (! mips_opts.mips16
3034                   && (pinfo & INSN_WRITE_GPR_D)
3035                   && insn_uses_reg (&history[0],
3036                                     EXTRACT_OPERAND (RD, *ip),
3037                                     MIPS_GR_REG))
3038               || (! mips_opts.mips16
3039                   && (pinfo & INSN_WRITE_GPR_31)
3040                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3041               || (mips_opts.mips16
3042                   && (pinfo & MIPS16_INSN_WRITE_31)
3043                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3044               /* If one instruction sets a condition code and the
3045                  other one uses a condition code, we can not swap.  */
3046               || ((pinfo & INSN_READ_COND_CODE)
3047                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3048               || ((pinfo & INSN_WRITE_COND_CODE)
3049                   && (prev_pinfo & INSN_READ_COND_CODE))
3050               /* If the previous instruction uses the PC, we can not
3051                  swap.  */
3052               || (mips_opts.mips16
3053                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3054               /* If the previous instruction had a fixup in mips16
3055                  mode, we can not swap.  This normally means that the
3056                  previous instruction was a 4 byte branch anyhow.  */
3057               || (mips_opts.mips16 && history[0].fixp[0])
3058               /* If the previous instruction is a sync, sync.l, or
3059                  sync.p, we can not swap.  */
3060               || (prev_pinfo & INSN_SYNC))
3061             {
3062               if (mips_opts.mips16
3063                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3064                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3065                   && ISA_SUPPORTS_MIPS16E)
3066                 {
3067                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3068                   ip->insn_opcode |= 0x0080;
3069                   install_insn (ip);
3070                   insert_into_history (0, 1, ip);
3071                 } 
3072               else
3073                 {
3074                   /* We could do even better for unconditional branches to
3075                      portions of this object file; we could pick up the
3076                      instruction at the destination, put it in the delay
3077                      slot, and bump the destination address.  */
3078                   insert_into_history (0, 1, ip);
3079                   emit_nop ();
3080                 }
3081                 
3082               if (mips_relax.sequence)
3083                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3084             }
3085           else
3086             {
3087               /* It looks like we can actually do the swap.  */
3088               struct mips_cl_insn delay = history[0];
3089               if (mips_opts.mips16)
3090                 {
3091                   know (delay.frag == ip->frag);
3092                   move_insn (ip, delay.frag, delay.where);
3093                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3094                 }
3095               else if (relaxed_branch)
3096                 {
3097                   /* Add the delay slot instruction to the end of the
3098                      current frag and shrink the fixed part of the
3099                      original frag.  If the branch occupies the tail of
3100                      the latter, move it backwards to cover the gap.  */
3101                   delay.frag->fr_fix -= 4;
3102                   if (delay.frag == ip->frag)
3103                     move_insn (ip, ip->frag, ip->where - 4);
3104                   add_fixed_insn (&delay);
3105                 }
3106               else
3107                 {
3108                   move_insn (&delay, ip->frag, ip->where);
3109                   move_insn (ip, history[0].frag, history[0].where);
3110                 }
3111               history[0] = *ip;
3112               delay.fixed_p = 1;
3113               insert_into_history (0, 1, &delay);
3114             }
3115
3116           /* If that was an unconditional branch, forget the previous
3117              insn information.  */
3118           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3119             mips_no_prev_insn ();
3120         }
3121       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3122         {
3123           /* We don't yet optimize a branch likely.  What we should do
3124              is look at the target, copy the instruction found there
3125              into the delay slot, and increment the branch to jump to
3126              the next instruction.  */
3127           insert_into_history (0, 1, ip);
3128           emit_nop ();
3129         }
3130       else
3131         insert_into_history (0, 1, ip);
3132     }
3133   else
3134     insert_into_history (0, 1, ip);
3135
3136   /* We just output an insn, so the next one doesn't have a label.  */
3137   mips_clear_insn_labels ();
3138 }
3139
3140 /* Forget that there was any previous instruction or label.  */
3141
3142 static void
3143 mips_no_prev_insn (void)
3144 {
3145   prev_nop_frag = NULL;
3146   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3147   mips_clear_insn_labels ();
3148 }
3149
3150 /* This function must be called before we emit something other than
3151    instructions.  It is like mips_no_prev_insn except that it inserts
3152    any NOPS that might be needed by previous instructions.  */
3153
3154 void
3155 mips_emit_delays (void)
3156 {
3157   if (! mips_opts.noreorder)
3158     {
3159       int nops = nops_for_insn (history, NULL);
3160       if (nops > 0)
3161         {
3162           while (nops-- > 0)
3163             add_fixed_insn (NOP_INSN);
3164           mips_move_labels ();
3165         }
3166     }
3167   mips_no_prev_insn ();
3168 }
3169
3170 /* Start a (possibly nested) noreorder block.  */
3171
3172 static void
3173 start_noreorder (void)
3174 {
3175   if (mips_opts.noreorder == 0)
3176     {
3177       unsigned int i;
3178       int nops;
3179
3180       /* None of the instructions before the .set noreorder can be moved.  */
3181       for (i = 0; i < ARRAY_SIZE (history); i++)
3182         history[i].fixed_p = 1;
3183
3184       /* Insert any nops that might be needed between the .set noreorder
3185          block and the previous instructions.  We will later remove any
3186          nops that turn out not to be needed.  */
3187       nops = nops_for_insn (history, NULL);
3188       if (nops > 0)
3189         {
3190           if (mips_optimize != 0)
3191             {
3192               /* Record the frag which holds the nop instructions, so
3193                  that we can remove them if we don't need them.  */
3194               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3195               prev_nop_frag = frag_now;
3196               prev_nop_frag_holds = nops;
3197               prev_nop_frag_required = 0;
3198               prev_nop_frag_since = 0;
3199             }
3200
3201           for (; nops > 0; --nops)
3202             add_fixed_insn (NOP_INSN);
3203
3204           /* Move on to a new frag, so that it is safe to simply
3205              decrease the size of prev_nop_frag.  */
3206           frag_wane (frag_now);
3207           frag_new (0);
3208           mips_move_labels ();
3209         }
3210       mips16_mark_labels ();
3211       mips_clear_insn_labels ();
3212     }
3213   mips_opts.noreorder++;
3214   mips_any_noreorder = 1;
3215 }
3216
3217 /* End a nested noreorder block.  */
3218
3219 static void
3220 end_noreorder (void)
3221 {
3222   mips_opts.noreorder--;
3223   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3224     {
3225       /* Commit to inserting prev_nop_frag_required nops and go back to
3226          handling nop insertion the .set reorder way.  */
3227       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3228                                 * (mips_opts.mips16 ? 2 : 4));
3229       insert_into_history (prev_nop_frag_since,
3230                            prev_nop_frag_required, NOP_INSN);
3231       prev_nop_frag = NULL;
3232     }
3233 }
3234
3235 /* Set up global variables for the start of a new macro.  */
3236
3237 static void
3238 macro_start (void)
3239 {
3240   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3241   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3242                                      && (history[0].insn_mo->pinfo
3243                                          & (INSN_UNCOND_BRANCH_DELAY
3244                                             | INSN_COND_BRANCH_DELAY
3245                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3246 }
3247
3248 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3249    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3250    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3251
3252 static const char *
3253 macro_warning (relax_substateT subtype)
3254 {
3255   if (subtype & RELAX_DELAY_SLOT)
3256     return _("Macro instruction expanded into multiple instructions"
3257              " in a branch delay slot");
3258   else if (subtype & RELAX_NOMACRO)
3259     return _("Macro instruction expanded into multiple instructions");
3260   else
3261     return 0;
3262 }
3263
3264 /* Finish up a macro.  Emit warnings as appropriate.  */
3265
3266 static void
3267 macro_end (void)
3268 {
3269   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3270     {
3271       relax_substateT subtype;
3272
3273       /* Set up the relaxation warning flags.  */
3274       subtype = 0;
3275       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3276         subtype |= RELAX_SECOND_LONGER;
3277       if (mips_opts.warn_about_macros)
3278         subtype |= RELAX_NOMACRO;
3279       if (mips_macro_warning.delay_slot_p)
3280         subtype |= RELAX_DELAY_SLOT;
3281
3282       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3283         {
3284           /* Either the macro has a single implementation or both
3285              implementations are longer than 4 bytes.  Emit the
3286              warning now.  */
3287           const char *msg = macro_warning (subtype);
3288           if (msg != 0)
3289             as_warn (msg);
3290         }
3291       else
3292         {
3293           /* One implementation might need a warning but the other
3294              definitely doesn't.  */
3295           mips_macro_warning.first_frag->fr_subtype |= subtype;
3296         }
3297     }
3298 }
3299
3300 /* Read a macro's relocation codes from *ARGS and store them in *R.
3301    The first argument in *ARGS will be either the code for a single
3302    relocation or -1 followed by the three codes that make up a
3303    composite relocation.  */
3304
3305 static void
3306 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3307 {
3308   int i, next;
3309
3310   next = va_arg (*args, int);
3311   if (next >= 0)
3312     r[0] = (bfd_reloc_code_real_type) next;
3313   else
3314     for (i = 0; i < 3; i++)
3315       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3316 }
3317
3318 /* Build an instruction created by a macro expansion.  This is passed
3319    a pointer to the count of instructions created so far, an
3320    expression, the name of the instruction to build, an operand format
3321    string, and corresponding arguments.  */
3322
3323 static void
3324 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3325 {
3326   const struct mips_opcode *mo;
3327   struct mips_cl_insn insn;
3328   bfd_reloc_code_real_type r[3];
3329   va_list args;
3330
3331   va_start (args, fmt);
3332
3333   if (mips_opts.mips16)
3334     {
3335       mips16_macro_build (ep, name, fmt, args);
3336       va_end (args);
3337       return;
3338     }
3339
3340   r[0] = BFD_RELOC_UNUSED;
3341   r[1] = BFD_RELOC_UNUSED;
3342   r[2] = BFD_RELOC_UNUSED;
3343   mo = (struct mips_opcode *) hash_find (op_hash, name);
3344   assert (mo);
3345   assert (strcmp (name, mo->name) == 0);
3346
3347   while (1)
3348     {
3349       /* Search until we get a match for NAME.  It is assumed here that
3350          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3351       if (strcmp (fmt, mo->args) == 0
3352           && mo->pinfo != INSN_MACRO
3353           && OPCODE_IS_MEMBER (mo,
3354                                (mips_opts.isa
3355                                 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3356                                 | (mips_opts.ase_dsp ? INSN_DSP : 0)
3357                                 | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
3358                                    ? INSN_DSP64 : 0)
3359                                 | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
3360                                 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3361                                mips_opts.arch)
3362           && (mips_opts.arch != CPU_R4650 || (mo->pinfo & FP_D) == 0))
3363         break;
3364
3365       ++mo;
3366       assert (mo->name);
3367       assert (strcmp (name, mo->name) == 0);
3368     }
3369
3370   create_insn (&insn, mo);
3371   for (;;)
3372     {
3373       switch (*fmt++)
3374         {
3375         case '\0':
3376           break;
3377
3378         case ',':
3379         case '(':
3380         case ')':
3381           continue;
3382
3383         case '+':
3384           switch (*fmt++)
3385             {
3386             case 'A':
3387             case 'E':
3388               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3389               continue;
3390
3391             case 'B':
3392             case 'F':
3393               /* Note that in the macro case, these arguments are already
3394                  in MSB form.  (When handling the instruction in the
3395                  non-macro case, these arguments are sizes from which
3396                  MSB values must be calculated.)  */
3397               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3398               continue;
3399
3400             case 'C':
3401             case 'G':
3402             case 'H':
3403               /* Note that in the macro case, these arguments are already
3404                  in MSBD form.  (When handling the instruction in the
3405                  non-macro case, these arguments are sizes from which
3406                  MSBD values must be calculated.)  */
3407               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3408               continue;
3409
3410             default:
3411               internalError ();
3412             }
3413           continue;
3414
3415         case '2':
3416           INSERT_OPERAND (BP, insn, va_arg (args, int));
3417           continue;
3418
3419         case 't':
3420         case 'w':
3421         case 'E':
3422           INSERT_OPERAND (RT, insn, va_arg (args, int));
3423           continue;
3424
3425         case 'c':
3426           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3427           continue;
3428
3429         case 'T':
3430         case 'W':
3431           INSERT_OPERAND (FT, insn, va_arg (args, int));
3432           continue;
3433
3434         case 'd':
3435         case 'G':
3436         case 'K':
3437           INSERT_OPERAND (RD, insn, va_arg (args, int));
3438           continue;
3439
3440         case 'U':
3441           {
3442             int tmp = va_arg (args, int);
3443
3444             INSERT_OPERAND (RT, insn, tmp);
3445             INSERT_OPERAND (RD, insn, tmp);
3446             continue;
3447           }
3448
3449         case 'V':
3450         case 'S':
3451           INSERT_OPERAND (FS, insn, va_arg (args, int));
3452           continue;
3453
3454         case 'z':
3455           continue;
3456
3457         case '<':
3458           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3459           continue;
3460
3461         case 'D':
3462           INSERT_OPERAND (FD, insn, va_arg (args, int));
3463           continue;
3464
3465         case 'B':
3466           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3467           continue;
3468
3469         case 'J':
3470           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3471           continue;
3472
3473         case 'q':
3474           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3475           continue;
3476
3477         case 'b':
3478         case 's':
3479         case 'r':
3480         case 'v':
3481           INSERT_OPERAND (RS, insn, va_arg (args, int));
3482           continue;
3483
3484         case 'i':
3485         case 'j':
3486         case 'o':
3487           macro_read_relocs (&args, r);
3488           assert (*r == BFD_RELOC_GPREL16
3489                   || *r == BFD_RELOC_MIPS_LITERAL
3490                   || *r == BFD_RELOC_MIPS_HIGHER
3491                   || *r == BFD_RELOC_HI16_S
3492                   || *r == BFD_RELOC_LO16
3493                   || *r == BFD_RELOC_MIPS_GOT16
3494                   || *r == BFD_RELOC_MIPS_CALL16
3495                   || *r == BFD_RELOC_MIPS_GOT_DISP
3496                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3497                   || *r == BFD_RELOC_MIPS_GOT_OFST
3498                   || *r == BFD_RELOC_MIPS_GOT_LO16
3499                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3500           continue;
3501
3502         case 'u':
3503           macro_read_relocs (&args, r);
3504           assert (ep != NULL
3505                   && (ep->X_op == O_constant
3506                       || (ep->X_op == O_symbol
3507                           && (*r == BFD_RELOC_MIPS_HIGHEST
3508                               || *r == BFD_RELOC_HI16_S
3509                               || *r == BFD_RELOC_HI16
3510                               || *r == BFD_RELOC_GPREL16
3511                               || *r == BFD_RELOC_MIPS_GOT_HI16
3512                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3513           continue;
3514
3515         case 'p':
3516           assert (ep != NULL);
3517
3518           /*
3519            * This allows macro() to pass an immediate expression for
3520            * creating short branches without creating a symbol.
3521            *
3522            * We don't allow branch relaxation for these branches, as
3523            * they should only appear in ".set nomacro" anyway.
3524            */
3525           if (ep->X_op == O_constant)
3526             {
3527               if ((ep->X_add_number & 3) != 0)
3528                 as_bad (_("branch to misaligned address (0x%lx)"),
3529                         (unsigned long) ep->X_add_number);
3530               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3531                 as_bad (_("branch address range overflow (0x%lx)"),
3532                         (unsigned long) ep->X_add_number);
3533               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3534               ep = NULL;
3535             }
3536           else
3537             *r = BFD_RELOC_16_PCREL_S2;
3538           continue;
3539
3540         case 'a':
3541           assert (ep != NULL);
3542           *r = BFD_RELOC_MIPS_JMP;
3543           continue;
3544
3545         case 'C':
3546           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3547           continue;
3548
3549         case 'k':
3550           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3551           continue;
3552
3553         default:
3554           internalError ();
3555         }
3556       break;
3557     }
3558   va_end (args);
3559   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3560
3561   append_insn (&insn, ep, r);
3562 }
3563
3564 static void
3565 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3566                     va_list args)
3567 {
3568   struct mips_opcode *mo;
3569   struct mips_cl_insn insn;
3570   bfd_reloc_code_real_type r[3]
3571     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3572
3573   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3574   assert (mo);
3575   assert (strcmp (name, mo->name) == 0);
3576
3577   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3578     {
3579       ++mo;
3580       assert (mo->name);
3581       assert (strcmp (name, mo->name) == 0);
3582     }
3583
3584   create_insn (&insn, mo);
3585   for (;;)
3586     {
3587       int c;
3588
3589       c = *fmt++;
3590       switch (c)
3591         {
3592         case '\0':
3593           break;
3594
3595         case ',':
3596         case '(':
3597         case ')':
3598           continue;
3599
3600         case 'y':
3601         case 'w':
3602           MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3603           continue;
3604
3605         case 'x':
3606         case 'v':
3607           MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3608           continue;
3609
3610         case 'z':
3611           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3612           continue;
3613
3614         case 'Z':
3615           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3616           continue;
3617
3618         case '0':
3619         case 'S':
3620         case 'P':
3621         case 'R':
3622           continue;
3623
3624         case 'X':
3625           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3626           continue;
3627
3628         case 'Y':
3629           {
3630             int regno;
3631
3632             regno = va_arg (args, int);
3633             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3634             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3635           }
3636           continue;
3637
3638         case '<':
3639         case '>':
3640         case '4':
3641         case '5':
3642         case 'H':
3643         case 'W':
3644         case 'D':
3645         case 'j':
3646         case '8':
3647         case 'V':
3648         case 'C':
3649         case 'U':
3650         case 'k':
3651         case 'K':
3652         case 'p':
3653         case 'q':
3654           {
3655             assert (ep != NULL);
3656
3657             if (ep->X_op != O_constant)
3658               *r = (int) BFD_RELOC_UNUSED + c;
3659             else
3660               {
3661                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3662                               FALSE, &insn.insn_opcode, &insn.use_extend,
3663                               &insn.extend);
3664                 ep = NULL;
3665                 *r = BFD_RELOC_UNUSED;
3666               }
3667           }
3668           continue;
3669
3670         case '6':
3671           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3672           continue;
3673         }
3674
3675       break;
3676     }
3677
3678   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3679
3680   append_insn (&insn, ep, r);
3681 }
3682
3683 /*
3684  * Sign-extend 32-bit mode constants that have bit 31 set and all
3685  * higher bits unset.
3686  */
3687 static void
3688 normalize_constant_expr (expressionS *ex)
3689 {
3690   if (ex->X_op == O_constant
3691       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3692     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3693                         - 0x80000000);
3694 }
3695
3696 /*
3697  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3698  * all higher bits unset.
3699  */
3700 static void
3701 normalize_address_expr (expressionS *ex)
3702 {
3703   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3704         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3705       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3706     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3707                         - 0x80000000);
3708 }
3709
3710 /*
3711  * Generate a "jalr" instruction with a relocation hint to the called
3712  * function.  This occurs in NewABI PIC code.
3713  */
3714 static void
3715 macro_build_jalr (expressionS *ep)
3716 {
3717   char *f = NULL;
3718
3719   if (HAVE_NEWABI)
3720     {
3721       frag_grow (8);
3722       f = frag_more (0);
3723     }
3724   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3725   if (HAVE_NEWABI)
3726     fix_new_exp (frag_now, f - frag_now->fr_literal,
3727                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3728 }
3729
3730 /*
3731  * Generate a "lui" instruction.
3732  */
3733 static void
3734 macro_build_lui (expressionS *ep, int regnum)
3735 {
3736   expressionS high_expr;
3737   const struct mips_opcode *mo;
3738   struct mips_cl_insn insn;
3739   bfd_reloc_code_real_type r[3]
3740     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3741   const char *name = "lui";
3742   const char *fmt = "t,u";
3743
3744   assert (! mips_opts.mips16);
3745
3746   high_expr = *ep;
3747
3748   if (high_expr.X_op == O_constant)
3749     {
3750       /* We can compute the instruction now without a relocation entry.  */
3751       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3752                                 >> 16) & 0xffff;
3753       *r = BFD_RELOC_UNUSED;
3754     }
3755   else
3756     {
3757       assert (ep->X_op == O_symbol);
3758       /* _gp_disp is a special case, used from s_cpload.
3759          __gnu_local_gp is used if mips_no_shared.  */
3760       assert (mips_pic == NO_PIC
3761               || (! HAVE_NEWABI
3762                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3763               || (! mips_in_shared
3764                   && strcmp (S_GET_NAME (ep->X_add_symbol),
3765                              "__gnu_local_gp") == 0));
3766       *r = BFD_RELOC_HI16_S;
3767     }
3768
3769   mo = hash_find (op_hash, name);
3770   assert (strcmp (name, mo->name) == 0);
3771   assert (strcmp (fmt, mo->args) == 0);
3772   create_insn (&insn, mo);
3773
3774   insn.insn_opcode = insn.insn_mo->match;
3775   INSERT_OPERAND (RT, insn, regnum);
3776   if (*r == BFD_RELOC_UNUSED)
3777     {
3778       insn.insn_opcode |= high_expr.X_add_number;
3779       append_insn (&insn, NULL, r);
3780     }
3781   else
3782     append_insn (&insn, &high_expr, r);
3783 }
3784
3785 /* Generate a sequence of instructions to do a load or store from a constant
3786    offset off of a base register (breg) into/from a target register (treg),
3787    using AT if necessary.  */
3788 static void
3789 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3790                               int treg, int breg, int dbl)
3791 {
3792   assert (ep->X_op == O_constant);
3793
3794   /* Sign-extending 32-bit constants makes their handling easier.  */
3795   if (!dbl)
3796     normalize_constant_expr (ep);
3797
3798   /* Right now, this routine can only handle signed 32-bit constants.  */
3799   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3800     as_warn (_("operand overflow"));
3801
3802   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3803     {
3804       /* Signed 16-bit offset will fit in the op.  Easy!  */
3805       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3806     }
3807   else
3808     {
3809       /* 32-bit offset, need multiple instructions and AT, like:
3810            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3811            addu     $tempreg,$tempreg,$breg
3812            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3813          to handle the complete offset.  */
3814       macro_build_lui (ep, AT);
3815       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3816       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3817
3818       if (mips_opts.noat)
3819         as_bad (_("Macro used $at after \".set noat\""));
3820     }
3821 }
3822
3823 /*                      set_at()
3824  * Generates code to set the $at register to true (one)
3825  * if reg is less than the immediate expression.
3826  */
3827 static void
3828 set_at (int reg, int unsignedp)
3829 {
3830   if (imm_expr.X_op == O_constant
3831       && imm_expr.X_add_number >= -0x8000
3832       && imm_expr.X_add_number < 0x8000)
3833     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3834                  AT, reg, BFD_RELOC_LO16);
3835   else
3836     {
3837       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3838       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3839     }
3840 }
3841
3842 /* Warn if an expression is not a constant.  */
3843
3844 static void
3845 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3846 {
3847   if (ex->X_op == O_big)
3848     as_bad (_("unsupported large constant"));
3849   else if (ex->X_op != O_constant)
3850     as_bad (_("Instruction %s requires absolute expression"),
3851             ip->insn_mo->name);
3852
3853   if (HAVE_32BIT_GPRS)
3854     normalize_constant_expr (ex);
3855 }
3856
3857 /* Count the leading zeroes by performing a binary chop. This is a
3858    bulky bit of source, but performance is a LOT better for the
3859    majority of values than a simple loop to count the bits:
3860        for (lcnt = 0; (lcnt < 32); lcnt++)
3861          if ((v) & (1 << (31 - lcnt)))
3862            break;
3863   However it is not code size friendly, and the gain will drop a bit
3864   on certain cached systems.
3865 */
3866 #define COUNT_TOP_ZEROES(v)             \
3867   (((v) & ~0xffff) == 0                 \
3868    ? ((v) & ~0xff) == 0                 \
3869      ? ((v) & ~0xf) == 0                \
3870        ? ((v) & ~0x3) == 0              \
3871          ? ((v) & ~0x1) == 0            \
3872            ? !(v)                       \
3873              ? 32                       \
3874              : 31                       \
3875            : 30                         \
3876          : ((v) & ~0x7) == 0            \
3877            ? 29                         \
3878            : 28                         \
3879        : ((v) & ~0x3f) == 0             \
3880          ? ((v) & ~0x1f) == 0           \
3881            ? 27                         \
3882            : 26                         \
3883          : ((v) & ~0x7f) == 0           \
3884            ? 25                         \
3885            : 24                         \
3886      : ((v) & ~0xfff) == 0              \
3887        ? ((v) & ~0x3ff) == 0            \
3888          ? ((v) & ~0x1ff) == 0          \
3889            ? 23                         \
3890            : 22                         \
3891          : ((v) & ~0x7ff) == 0          \
3892            ? 21                         \
3893            : 20                         \
3894        : ((v) & ~0x3fff) == 0           \
3895          ? ((v) & ~0x1fff) == 0         \
3896            ? 19                         \
3897            : 18                         \
3898          : ((v) & ~0x7fff) == 0         \
3899            ? 17                         \
3900            : 16                         \
3901    : ((v) & ~0xffffff) == 0             \
3902      ? ((v) & ~0xfffff) == 0            \
3903        ? ((v) & ~0x3ffff) == 0          \
3904          ? ((v) & ~0x1ffff) == 0        \
3905            ? 15                         \
3906            : 14                         \
3907          : ((v) & ~0x7ffff) == 0        \
3908            ? 13                         \
3909            : 12                         \
3910        : ((v) & ~0x3fffff) == 0         \
3911          ? ((v) & ~0x1fffff) == 0       \
3912            ? 11                         \
3913            : 10                         \
3914          : ((v) & ~0x7fffff) == 0       \
3915            ? 9                          \
3916            : 8                          \
3917      : ((v) & ~0xfffffff) == 0          \
3918        ? ((v) & ~0x3ffffff) == 0        \
3919          ? ((v) & ~0x1ffffff) == 0      \
3920            ? 7                          \
3921            : 6                          \
3922          : ((v) & ~0x7ffffff) == 0      \
3923            ? 5                          \
3924            : 4                          \
3925        : ((v) & ~0x3fffffff) == 0       \
3926          ? ((v) & ~0x1fffffff) == 0     \
3927            ? 3                          \
3928            : 2                          \
3929          : ((v) & ~0x7fffffff) == 0     \
3930            ? 1                          \
3931            : 0)
3932
3933 /*                      load_register()
3934  *  This routine generates the least number of instructions necessary to load
3935  *  an absolute expression value into a register.
3936  */
3937 static void
3938 load_register (int reg, expressionS *ep, int dbl)
3939 {
3940   int freg;
3941   expressionS hi32, lo32;
3942
3943   if (ep->X_op != O_big)
3944     {
3945       assert (ep->X_op == O_constant);
3946
3947       /* Sign-extending 32-bit constants makes their handling easier.  */
3948       if (!dbl)
3949         normalize_constant_expr (ep);
3950
3951       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3952         {
3953           /* We can handle 16 bit signed values with an addiu to
3954              $zero.  No need to ever use daddiu here, since $zero and
3955              the result are always correct in 32 bit mode.  */
3956           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3957           return;
3958         }
3959       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3960         {
3961           /* We can handle 16 bit unsigned values with an ori to
3962              $zero.  */
3963           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3964           return;
3965         }
3966       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3967         {
3968           /* 32 bit values require an lui.  */
3969           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3970           if ((ep->X_add_number & 0xffff) != 0)
3971             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3972           return;
3973         }
3974     }
3975
3976   /* The value is larger than 32 bits.  */
3977
3978   if (!dbl || HAVE_32BIT_GPRS)
3979     {
3980       char value[32];
3981
3982       sprintf_vma (value, ep->X_add_number);
3983       as_bad (_("Number (0x%s) larger than 32 bits"), value);
3984       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3985       return;
3986     }
3987
3988   if (ep->X_op != O_big)
3989     {
3990       hi32 = *ep;
3991       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3992       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
3993       hi32.X_add_number &= 0xffffffff;
3994       lo32 = *ep;
3995       lo32.X_add_number &= 0xffffffff;
3996     }
3997   else
3998     {
3999       assert (ep->X_add_number > 2);
4000       if (ep->X_add_number == 3)
4001         generic_bignum[3] = 0;
4002       else if (ep->X_add_number > 4)
4003         as_bad (_("Number larger than 64 bits"));
4004       lo32.X_op = O_constant;
4005       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4006       hi32.X_op = O_constant;
4007       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4008     }
4009
4010   if (hi32.X_add_number == 0)
4011     freg = 0;
4012   else
4013     {
4014       int shift, bit;
4015       unsigned long hi, lo;
4016
4017       if (hi32.X_add_number == (offsetT) 0xffffffff)
4018         {
4019           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4020             {
4021               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4022               return;
4023             }
4024           if (lo32.X_add_number & 0x80000000)
4025             {
4026               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4027               if (lo32.X_add_number & 0xffff)
4028                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4029               return;
4030             }
4031         }
4032
4033       /* Check for 16bit shifted constant.  We know that hi32 is
4034          non-zero, so start the mask on the first bit of the hi32
4035          value.  */
4036       shift = 17;
4037       do
4038         {
4039           unsigned long himask, lomask;
4040
4041           if (shift < 32)
4042             {
4043               himask = 0xffff >> (32 - shift);
4044               lomask = (0xffff << shift) & 0xffffffff;
4045             }
4046           else
4047             {
4048               himask = 0xffff << (shift - 32);
4049               lomask = 0;
4050             }
4051           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4052               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4053             {
4054               expressionS tmp;
4055
4056               tmp.X_op = O_constant;
4057               if (shift < 32)
4058                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4059                                     | (lo32.X_add_number >> shift));
4060               else
4061                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4062               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4063               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4064                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4065               return;
4066             }
4067           ++shift;
4068         }
4069       while (shift <= (64 - 16));
4070
4071       /* Find the bit number of the lowest one bit, and store the
4072          shifted value in hi/lo.  */
4073       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4074       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4075       if (lo != 0)
4076         {
4077           bit = 0;
4078           while ((lo & 1) == 0)
4079             {
4080               lo >>= 1;
4081               ++bit;
4082             }
4083           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4084           hi >>= bit;
4085         }
4086       else
4087         {
4088           bit = 32;
4089           while ((hi & 1) == 0)
4090             {
4091               hi >>= 1;
4092               ++bit;
4093             }
4094           lo = hi;
4095           hi = 0;
4096         }
4097
4098       /* Optimize if the shifted value is a (power of 2) - 1.  */
4099       if ((hi == 0 && ((lo + 1) & lo) == 0)
4100           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4101         {
4102           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4103           if (shift != 0)
4104             {
4105               expressionS tmp;
4106
4107               /* This instruction will set the register to be all
4108                  ones.  */
4109               tmp.X_op = O_constant;
4110               tmp.X_add_number = (offsetT) -1;
4111               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4112               if (bit != 0)
4113                 {
4114                   bit += shift;
4115                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4116                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4117                 }
4118               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4119                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4120               return;
4121             }
4122         }
4123
4124       /* Sign extend hi32 before calling load_register, because we can
4125          generally get better code when we load a sign extended value.  */
4126       if ((hi32.X_add_number & 0x80000000) != 0)
4127         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4128       load_register (reg, &hi32, 0);
4129       freg = reg;
4130     }
4131   if ((lo32.X_add_number & 0xffff0000) == 0)
4132     {
4133       if (freg != 0)
4134         {
4135           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4136           freg = reg;
4137         }
4138     }
4139   else
4140     {
4141       expressionS mid16;
4142
4143       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4144         {
4145           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4146           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4147           return;
4148         }
4149
4150       if (freg != 0)
4151         {
4152           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4153           freg = reg;
4154         }
4155       mid16 = lo32;
4156       mid16.X_add_number >>= 16;
4157       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4158       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4159       freg = reg;
4160     }
4161   if ((lo32.X_add_number & 0xffff) != 0)
4162     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4163 }
4164
4165 static inline void
4166 load_delay_nop (void)
4167 {
4168   if (!gpr_interlocks)
4169     macro_build (NULL, "nop", "");
4170 }
4171
4172 /* Load an address into a register.  */
4173
4174 static void
4175 load_address (int reg, expressionS *ep, int *used_at)
4176 {
4177   if (ep->X_op != O_constant
4178       && ep->X_op != O_symbol)
4179     {
4180       as_bad (_("expression too complex"));
4181       ep->X_op = O_constant;
4182     }
4183
4184   if (ep->X_op == O_constant)
4185     {
4186       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4187       return;
4188     }
4189
4190   if (mips_pic == NO_PIC)
4191     {
4192       /* If this is a reference to a GP relative symbol, we want
4193            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4194          Otherwise we want
4195            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4196            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4197          If we have an addend, we always use the latter form.
4198
4199          With 64bit address space and a usable $at we want
4200            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4201            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4202            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4203            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4204            dsll32       $reg,0
4205            daddu        $reg,$reg,$at
4206
4207          If $at is already in use, we use a path which is suboptimal
4208          on superscalar processors.
4209            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4210            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4211            dsll         $reg,16
4212            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4213            dsll         $reg,16
4214            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4215
4216          For GP relative symbols in 64bit address space we can use
4217          the same sequence as in 32bit address space.  */
4218       if (HAVE_64BIT_SYMBOLS)
4219         {
4220           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4221               && !nopic_need_relax (ep->X_add_symbol, 1))
4222             {
4223               relax_start (ep->X_add_symbol);
4224               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4225                            mips_gp_register, BFD_RELOC_GPREL16);
4226               relax_switch ();
4227             }
4228
4229           if (*used_at == 0 && !mips_opts.noat)
4230             {
4231               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4232               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4233               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4234                            BFD_RELOC_MIPS_HIGHER);
4235               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4236               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4237               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4238               *used_at = 1;
4239             }
4240           else
4241             {
4242               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4243               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4244                            BFD_RELOC_MIPS_HIGHER);
4245               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4246               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4247               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4248               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4249             }
4250
4251           if (mips_relax.sequence)
4252             relax_end ();
4253         }
4254       else
4255         {
4256           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4257               && !nopic_need_relax (ep->X_add_symbol, 1))
4258             {
4259               relax_start (ep->X_add_symbol);
4260               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4261                            mips_gp_register, BFD_RELOC_GPREL16);
4262               relax_switch ();
4263             }
4264           macro_build_lui (ep, reg);
4265           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4266                        reg, reg, BFD_RELOC_LO16);
4267           if (mips_relax.sequence)
4268             relax_end ();
4269         }
4270     }
4271   else if (!mips_big_got)
4272     {
4273       expressionS ex;
4274
4275       /* If this is a reference to an external symbol, we want
4276            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4277          Otherwise we want
4278            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4279            nop
4280            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4281          If there is a constant, it must be added in after.
4282
4283          If we have NewABI, we want
4284            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4285          unless we're referencing a global symbol with a non-zero
4286          offset, in which case cst must be added separately.  */
4287       if (HAVE_NEWABI)
4288         {
4289           if (ep->X_add_number)
4290             {
4291               ex.X_add_number = ep->X_add_number;
4292               ep->X_add_number = 0;
4293               relax_start (ep->X_add_symbol);
4294               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4295                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4296               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4297                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4298               ex.X_op = O_constant;
4299               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4300                            reg, reg, BFD_RELOC_LO16);
4301               ep->X_add_number = ex.X_add_number;
4302               relax_switch ();
4303             }
4304           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4305                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4306           if (mips_relax.sequence)
4307             relax_end ();
4308         }
4309       else
4310         {
4311           ex.X_add_number = ep->X_add_number;
4312           ep->X_add_number = 0;
4313           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4314                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4315           load_delay_nop ();
4316           relax_start (ep->X_add_symbol);
4317           relax_switch ();
4318           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4319                        BFD_RELOC_LO16);
4320           relax_end ();
4321
4322           if (ex.X_add_number != 0)
4323             {
4324               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4325                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4326               ex.X_op = O_constant;
4327               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4328                            reg, reg, BFD_RELOC_LO16);
4329             }
4330         }
4331     }
4332   else if (mips_big_got)
4333     {
4334       expressionS ex;
4335
4336       /* This is the large GOT case.  If this is a reference to an
4337          external symbol, we want
4338            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4339            addu         $reg,$reg,$gp
4340            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4341
4342          Otherwise, for a reference to a local symbol in old ABI, we want
4343            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4344            nop
4345            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4346          If there is a constant, it must be added in after.
4347
4348          In the NewABI, for local symbols, with or without offsets, we want:
4349            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4350            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4351       */
4352       if (HAVE_NEWABI)
4353         {
4354           ex.X_add_number = ep->X_add_number;
4355           ep->X_add_number = 0;
4356           relax_start (ep->X_add_symbol);
4357           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4358           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4359                        reg, reg, mips_gp_register);
4360           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4361                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4362           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4363             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4364           else if (ex.X_add_number)
4365             {
4366               ex.X_op = O_constant;
4367               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4368                            BFD_RELOC_LO16);
4369             }
4370
4371           ep->X_add_number = ex.X_add_number;
4372           relax_switch ();
4373           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4374                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4375           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4376                        BFD_RELOC_MIPS_GOT_OFST);
4377           relax_end ();
4378         }
4379       else
4380         {
4381           ex.X_add_number = ep->X_add_number;
4382           ep->X_add_number = 0;
4383           relax_start (ep->X_add_symbol);
4384           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4385           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4386                        reg, reg, mips_gp_register);
4387           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4388                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4389           relax_switch ();
4390           if (reg_needs_delay (mips_gp_register))
4391             {
4392               /* We need a nop before loading from $gp.  This special
4393                  check is required because the lui which starts the main
4394                  instruction stream does not refer to $gp, and so will not
4395                  insert the nop which may be required.  */
4396               macro_build (NULL, "nop", "");
4397             }
4398           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4399                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4400           load_delay_nop ();
4401           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4402                        BFD_RELOC_LO16);
4403           relax_end ();
4404
4405           if (ex.X_add_number != 0)
4406             {
4407               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4408                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4409               ex.X_op = O_constant;
4410               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4411                            BFD_RELOC_LO16);
4412             }
4413         }
4414     }
4415   else
4416     abort ();
4417
4418   if (mips_opts.noat && *used_at == 1)
4419     as_bad (_("Macro used $at after \".set noat\""));
4420 }
4421
4422 /* Move the contents of register SOURCE into register DEST.  */
4423
4424 static void
4425 move_register (int dest, int source)
4426 {
4427   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4428                dest, source, 0);
4429 }
4430
4431 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4432    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4433    The two alternatives are:
4434
4435    Global symbol                Local sybmol
4436    -------------                ------------
4437    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4438    ...                          ...
4439    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4440
4441    load_got_offset emits the first instruction and add_got_offset
4442    emits the second for a 16-bit offset or add_got_offset_hilo emits
4443    a sequence to add a 32-bit offset using a scratch register.  */
4444
4445 static void
4446 load_got_offset (int dest, expressionS *local)
4447 {
4448   expressionS global;
4449
4450   global = *local;
4451   global.X_add_number = 0;
4452
4453   relax_start (local->X_add_symbol);
4454   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4455                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4456   relax_switch ();
4457   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4458                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4459   relax_end ();
4460 }
4461
4462 static void
4463 add_got_offset (int dest, expressionS *local)
4464 {
4465   expressionS global;
4466
4467   global.X_op = O_constant;
4468   global.X_op_symbol = NULL;
4469   global.X_add_symbol = NULL;
4470   global.X_add_number = local->X_add_number;
4471
4472   relax_start (local->X_add_symbol);
4473   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4474                dest, dest, BFD_RELOC_LO16);
4475   relax_switch ();
4476   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4477   relax_end ();
4478 }
4479
4480 static void
4481 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4482 {
4483   expressionS global;
4484   int hold_mips_optimize;
4485
4486   global.X_op = O_constant;
4487   global.X_op_symbol = NULL;
4488   global.X_add_symbol = NULL;
4489   global.X_add_number = local->X_add_number;
4490
4491   relax_start (local->X_add_symbol);
4492   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4493   relax_switch ();
4494   /* Set mips_optimize around the lui instruction to avoid
4495      inserting an unnecessary nop after the lw.  */
4496   hold_mips_optimize = mips_optimize;
4497   mips_optimize = 2;
4498   macro_build_lui (&global, tmp);
4499   mips_optimize = hold_mips_optimize;
4500   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4501   relax_end ();
4502
4503   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4504 }
4505
4506 /*
4507  *                      Build macros
4508  *   This routine implements the seemingly endless macro or synthesized
4509  * instructions and addressing modes in the mips assembly language. Many
4510  * of these macros are simple and are similar to each other. These could
4511  * probably be handled by some kind of table or grammar approach instead of
4512  * this verbose method. Others are not simple macros but are more like
4513  * optimizing code generation.
4514  *   One interesting optimization is when several store macros appear
4515  * consecutively that would load AT with the upper half of the same address.
4516  * The ensuing load upper instructions are ommited. This implies some kind
4517  * of global optimization. We currently only optimize within a single macro.
4518  *   For many of the load and store macros if the address is specified as a
4519  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4520  * first load register 'at' with zero and use it as the base register. The
4521  * mips assembler simply uses register $zero. Just one tiny optimization
4522  * we're missing.
4523  */
4524 static void
4525 macro (struct mips_cl_insn *ip)
4526 {
4527   int treg, sreg, dreg, breg;
4528   int tempreg;
4529   int mask;
4530   int used_at = 0;
4531   expressionS expr1;
4532   const char *s;
4533   const char *s2;
4534   const char *fmt;
4535   int likely = 0;
4536   int dbl = 0;
4537   int coproc = 0;
4538   int lr = 0;
4539   int imm = 0;
4540   int call = 0;
4541   int off;
4542   offsetT maxnum;
4543   bfd_reloc_code_real_type r;
4544   int hold_mips_optimize;
4545
4546   assert (! mips_opts.mips16);
4547
4548   treg = (ip->insn_opcode >> 16) & 0x1f;
4549   dreg = (ip->insn_opcode >> 11) & 0x1f;
4550   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4551   mask = ip->insn_mo->mask;
4552
4553   expr1.X_op = O_constant;
4554   expr1.X_op_symbol = NULL;
4555   expr1.X_add_symbol = NULL;
4556   expr1.X_add_number = 1;
4557
4558   switch (mask)
4559     {
4560     case M_DABS:
4561       dbl = 1;
4562     case M_ABS:
4563       /* bgez $a0,.+12
4564          move v0,$a0
4565          sub v0,$zero,$a0
4566          */
4567
4568       start_noreorder ();
4569
4570       expr1.X_add_number = 8;
4571       macro_build (&expr1, "bgez", "s,p", sreg);
4572       if (dreg == sreg)
4573         macro_build (NULL, "nop", "", 0);
4574       else
4575         move_register (dreg, sreg);
4576       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4577
4578       end_noreorder ();
4579       break;
4580
4581     case M_ADD_I:
4582       s = "addi";
4583       s2 = "add";
4584       goto do_addi;
4585     case M_ADDU_I:
4586       s = "addiu";
4587       s2 = "addu";
4588       goto do_addi;
4589     case M_DADD_I:
4590       dbl = 1;
4591       s = "daddi";
4592       s2 = "dadd";
4593       goto do_addi;
4594     case M_DADDU_I:
4595       dbl = 1;
4596       s = "daddiu";
4597       s2 = "daddu";
4598     do_addi:
4599       if (imm_expr.X_op == O_constant
4600           && imm_expr.X_add_number >= -0x8000
4601           && imm_expr.X_add_number < 0x8000)
4602         {
4603           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4604           break;
4605         }
4606       used_at = 1;
4607       load_register (AT, &imm_expr, dbl);
4608       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4609       break;
4610
4611     case M_AND_I:
4612       s = "andi";
4613       s2 = "and";
4614       goto do_bit;
4615     case M_OR_I:
4616       s = "ori";
4617       s2 = "or";
4618       goto do_bit;
4619     case M_NOR_I:
4620       s = "";
4621       s2 = "nor";
4622       goto do_bit;
4623     case M_XOR_I:
4624       s = "xori";
4625       s2 = "xor";
4626     do_bit:
4627       if (imm_expr.X_op == O_constant
4628           && imm_expr.X_add_number >= 0
4629           && imm_expr.X_add_number < 0x10000)
4630         {
4631           if (mask != M_NOR_I)
4632             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4633           else
4634             {
4635               macro_build (&imm_expr, "ori", "t,r,i",
4636                            treg, sreg, BFD_RELOC_LO16);
4637               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4638             }
4639           break;
4640         }
4641
4642       used_at = 1;
4643       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4644       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4645       break;
4646
4647     case M_BALIGN:
4648       switch (imm_expr.X_add_number)
4649         {
4650         case 0:
4651           macro_build (NULL, "nop", "");
4652           break;
4653         case 2:
4654           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4655           break;
4656         default:
4657           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4658                        (int)imm_expr.X_add_number);
4659           break;
4660         }
4661       break;
4662
4663     case M_BEQ_I:
4664       s = "beq";
4665       goto beq_i;
4666     case M_BEQL_I:
4667       s = "beql";
4668       likely = 1;
4669       goto beq_i;
4670     case M_BNE_I:
4671       s = "bne";
4672       goto beq_i;
4673     case M_BNEL_I:
4674       s = "bnel";
4675       likely = 1;
4676     beq_i:
4677       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4678         {
4679           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4680           break;
4681         }
4682       used_at = 1;
4683       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4684       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4685       break;
4686
4687     case M_BGEL:
4688       likely = 1;
4689     case M_BGE:
4690       if (treg == 0)
4691         {
4692           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4693           break;
4694         }
4695       if (sreg == 0)
4696         {
4697           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4698           break;
4699         }
4700       used_at = 1;
4701       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4702       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4703       break;
4704
4705     case M_BGTL_I:
4706       likely = 1;
4707     case M_BGT_I:
4708       /* check for > max integer */
4709       maxnum = 0x7fffffff;
4710       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4711         {
4712           maxnum <<= 16;
4713           maxnum |= 0xffff;
4714           maxnum <<= 16;
4715           maxnum |= 0xffff;
4716         }
4717       if (imm_expr.X_op == O_constant
4718           && imm_expr.X_add_number >= maxnum
4719           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4720         {
4721         do_false:
4722           /* result is always false */
4723           if (! likely)
4724             macro_build (NULL, "nop", "", 0);
4725           else
4726             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4727           break;
4728         }
4729       if (imm_expr.X_op != O_constant)
4730         as_bad (_("Unsupported large constant"));
4731       ++imm_expr.X_add_number;
4732       /* FALLTHROUGH */
4733     case M_BGE_I:
4734     case M_BGEL_I:
4735       if (mask == M_BGEL_I)
4736         likely = 1;
4737       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4738         {
4739           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4740           break;
4741         }
4742       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4743         {
4744           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4745           break;
4746         }
4747       maxnum = 0x7fffffff;
4748       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4749         {
4750           maxnum <<= 16;
4751           maxnum |= 0xffff;
4752           maxnum <<= 16;
4753           maxnum |= 0xffff;
4754         }
4755       maxnum = - maxnum - 1;
4756       if (imm_expr.X_op == O_constant
4757           && imm_expr.X_add_number <= maxnum
4758           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4759         {
4760         do_true:
4761           /* result is always true */
4762           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4763           macro_build (&offset_expr, "b", "p");
4764           break;
4765         }
4766       used_at = 1;
4767       set_at (sreg, 0);
4768       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4769       break;
4770
4771     case M_BGEUL:
4772       likely = 1;
4773     case M_BGEU:
4774       if (treg == 0)
4775         goto do_true;
4776       if (sreg == 0)
4777         {
4778           macro_build (&offset_expr, likely ? "beql" : "beq",
4779                        "s,t,p", 0, treg);
4780           break;
4781         }
4782       used_at = 1;
4783       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4784       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4785       break;
4786
4787     case M_BGTUL_I:
4788       likely = 1;
4789     case M_BGTU_I:
4790       if (sreg == 0
4791           || (HAVE_32BIT_GPRS
4792               && imm_expr.X_op == O_constant
4793               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4794         goto do_false;
4795       if (imm_expr.X_op != O_constant)
4796         as_bad (_("Unsupported large constant"));
4797       ++imm_expr.X_add_number;
4798       /* FALLTHROUGH */
4799     case M_BGEU_I:
4800     case M_BGEUL_I:
4801       if (mask == M_BGEUL_I)
4802         likely = 1;
4803       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4804         goto do_true;
4805       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4806         {
4807           macro_build (&offset_expr, likely ? "bnel" : "bne",
4808                        "s,t,p", sreg, 0);
4809           break;
4810         }
4811       used_at = 1;
4812       set_at (sreg, 1);
4813       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4814       break;
4815
4816     case M_BGTL:
4817       likely = 1;
4818     case M_BGT:
4819       if (treg == 0)
4820         {
4821           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4822           break;
4823         }
4824       if (sreg == 0)
4825         {
4826           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4827           break;
4828         }
4829       used_at = 1;
4830       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4831       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4832       break;
4833
4834     case M_BGTUL:
4835       likely = 1;
4836     case M_BGTU:
4837       if (treg == 0)
4838         {
4839           macro_build (&offset_expr, likely ? "bnel" : "bne",
4840                        "s,t,p", sreg, 0);
4841           break;
4842         }
4843       if (sreg == 0)
4844         goto do_false;
4845       used_at = 1;
4846       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4847       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4848       break;
4849
4850     case M_BLEL:
4851       likely = 1;
4852     case M_BLE:
4853       if (treg == 0)
4854         {
4855           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4856           break;
4857         }
4858       if (sreg == 0)
4859         {
4860           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4861           break;
4862         }
4863       used_at = 1;
4864       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4865       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4866       break;
4867
4868     case M_BLEL_I:
4869       likely = 1;
4870     case M_BLE_I:
4871       maxnum = 0x7fffffff;
4872       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4873         {
4874           maxnum <<= 16;
4875           maxnum |= 0xffff;
4876           maxnum <<= 16;
4877           maxnum |= 0xffff;
4878         }
4879       if (imm_expr.X_op == O_constant
4880           && imm_expr.X_add_number >= maxnum
4881           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4882         goto do_true;
4883       if (imm_expr.X_op != O_constant)
4884         as_bad (_("Unsupported large constant"));
4885       ++imm_expr.X_add_number;
4886       /* FALLTHROUGH */
4887     case M_BLT_I:
4888     case M_BLTL_I:
4889       if (mask == M_BLTL_I)
4890         likely = 1;
4891       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4892         {
4893           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4894           break;
4895         }
4896       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4897         {
4898           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4899           break;
4900         }
4901       used_at = 1;
4902       set_at (sreg, 0);
4903       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4904       break;
4905
4906     case M_BLEUL:
4907       likely = 1;
4908     case M_BLEU:
4909       if (treg == 0)
4910         {
4911           macro_build (&offset_expr, likely ? "beql" : "beq",
4912                        "s,t,p", sreg, 0);
4913           break;
4914         }
4915       if (sreg == 0)
4916         goto do_true;
4917       used_at = 1;
4918       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4919       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4920       break;
4921
4922     case M_BLEUL_I:
4923       likely = 1;
4924     case M_BLEU_I:
4925       if (sreg == 0
4926           || (HAVE_32BIT_GPRS
4927               && imm_expr.X_op == O_constant
4928               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4929         goto do_true;
4930       if (imm_expr.X_op != O_constant)
4931         as_bad (_("Unsupported large constant"));
4932       ++imm_expr.X_add_number;
4933       /* FALLTHROUGH */
4934     case M_BLTU_I:
4935     case M_BLTUL_I:
4936       if (mask == M_BLTUL_I)
4937         likely = 1;
4938       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4939         goto do_false;
4940       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4941         {
4942           macro_build (&offset_expr, likely ? "beql" : "beq",
4943                        "s,t,p", sreg, 0);
4944           break;
4945         }
4946       used_at = 1;
4947       set_at (sreg, 1);
4948       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4949       break;
4950
4951     case M_BLTL:
4952       likely = 1;
4953     case M_BLT:
4954       if (treg == 0)
4955         {
4956           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4957           break;
4958         }
4959       if (sreg == 0)
4960         {
4961           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4962           break;
4963         }
4964       used_at = 1;
4965       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4966       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4967       break;
4968
4969     case M_BLTUL:
4970       likely = 1;
4971     case M_BLTU:
4972       if (treg == 0)
4973         goto do_false;
4974       if (sreg == 0)
4975         {
4976           macro_build (&offset_expr, likely ? "bnel" : "bne",
4977                        "s,t,p", 0, treg);
4978           break;
4979         }
4980       used_at = 1;
4981       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4982       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4983       break;
4984
4985     case M_DEXT:
4986       {
4987         unsigned long pos;
4988         unsigned long size;
4989
4990         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
4991           {
4992             as_bad (_("Unsupported large constant"));
4993             pos = size = 1;
4994           }
4995         else
4996           {
4997             pos = (unsigned long) imm_expr.X_add_number;
4998             size = (unsigned long) imm2_expr.X_add_number;
4999           }
5000
5001         if (pos > 63)
5002           {
5003             as_bad (_("Improper position (%lu)"), pos);
5004             pos = 1;
5005           }
5006         if (size == 0 || size > 64
5007             || (pos + size - 1) > 63)
5008           {
5009             as_bad (_("Improper extract size (%lu, position %lu)"),
5010                     size, pos);
5011             size = 1;
5012           }
5013
5014         if (size <= 32 && pos < 32)
5015           {
5016             s = "dext";
5017             fmt = "t,r,+A,+C";
5018           }
5019         else if (size <= 32)
5020           {
5021             s = "dextu";
5022             fmt = "t,r,+E,+H";
5023           }
5024         else
5025           {
5026             s = "dextm";
5027             fmt = "t,r,+A,+G";
5028           }
5029         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5030       }
5031       break;
5032
5033     case M_DINS:
5034       {
5035         unsigned long pos;
5036         unsigned long size;
5037
5038         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5039           {
5040             as_bad (_("Unsupported large constant"));
5041             pos = size = 1;
5042           }
5043         else
5044           {
5045             pos = (unsigned long) imm_expr.X_add_number;
5046             size = (unsigned long) imm2_expr.X_add_number;
5047           }
5048
5049         if (pos > 63)
5050           {
5051             as_bad (_("Improper position (%lu)"), pos);
5052             pos = 1;
5053           }
5054         if (size == 0 || size > 64
5055             || (pos + size - 1) > 63)
5056           {
5057             as_bad (_("Improper insert size (%lu, position %lu)"),
5058                     size, pos);
5059             size = 1;
5060           }
5061
5062         if (pos < 32 && (pos + size - 1) < 32)
5063           {
5064             s = "dins";
5065             fmt = "t,r,+A,+B";
5066           }
5067         else if (pos >= 32)
5068           {
5069             s = "dinsu";
5070             fmt = "t,r,+E,+F";
5071           }
5072         else
5073           {
5074             s = "dinsm";
5075             fmt = "t,r,+A,+F";
5076           }
5077         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5078                      pos + size - 1);
5079       }
5080       break;
5081
5082     case M_DDIV_3:
5083       dbl = 1;
5084     case M_DIV_3:
5085       s = "mflo";
5086       goto do_div3;
5087     case M_DREM_3:
5088       dbl = 1;
5089     case M_REM_3:
5090       s = "mfhi";
5091     do_div3:
5092       if (treg == 0)
5093         {
5094           as_warn (_("Divide by zero."));
5095           if (mips_trap)
5096             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5097           else
5098             macro_build (NULL, "break", "c", 7);
5099           break;
5100         }
5101
5102       start_noreorder ();
5103       if (mips_trap)
5104         {
5105           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5106           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5107         }
5108       else
5109         {
5110           expr1.X_add_number = 8;
5111           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5112           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5113           macro_build (NULL, "break", "c", 7);
5114         }
5115       expr1.X_add_number = -1;
5116       used_at = 1;
5117       load_register (AT, &expr1, dbl);
5118       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5119       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5120       if (dbl)
5121         {
5122           expr1.X_add_number = 1;
5123           load_register (AT, &expr1, dbl);
5124           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5125         }
5126       else
5127         {
5128           expr1.X_add_number = 0x80000000;
5129           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5130         }
5131       if (mips_trap)
5132         {
5133           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5134           /* We want to close the noreorder block as soon as possible, so
5135              that later insns are available for delay slot filling.  */
5136           end_noreorder ();
5137         }
5138       else
5139         {
5140           expr1.X_add_number = 8;
5141           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5142           macro_build (NULL, "nop", "", 0);
5143
5144           /* We want to close the noreorder block as soon as possible, so
5145              that later insns are available for delay slot filling.  */
5146           end_noreorder ();
5147
5148           macro_build (NULL, "break", "c", 6);
5149         }
5150       macro_build (NULL, s, "d", dreg);
5151       break;
5152
5153     case M_DIV_3I:
5154       s = "div";
5155       s2 = "mflo";
5156       goto do_divi;
5157     case M_DIVU_3I:
5158       s = "divu";
5159       s2 = "mflo";
5160       goto do_divi;
5161     case M_REM_3I:
5162       s = "div";
5163       s2 = "mfhi";
5164       goto do_divi;
5165     case M_REMU_3I:
5166       s = "divu";
5167       s2 = "mfhi";
5168       goto do_divi;
5169     case M_DDIV_3I:
5170       dbl = 1;
5171       s = "ddiv";
5172       s2 = "mflo";
5173       goto do_divi;
5174     case M_DDIVU_3I:
5175       dbl = 1;
5176       s = "ddivu";
5177       s2 = "mflo";
5178       goto do_divi;
5179     case M_DREM_3I:
5180       dbl = 1;
5181       s = "ddiv";
5182       s2 = "mfhi";
5183       goto do_divi;
5184     case M_DREMU_3I:
5185       dbl = 1;
5186       s = "ddivu";
5187       s2 = "mfhi";
5188     do_divi:
5189       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5190         {
5191           as_warn (_("Divide by zero."));
5192           if (mips_trap)
5193             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5194           else
5195             macro_build (NULL, "break", "c", 7);
5196           break;
5197         }
5198       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5199         {
5200           if (strcmp (s2, "mflo") == 0)
5201             move_register (dreg, sreg);
5202           else
5203             move_register (dreg, 0);
5204           break;
5205         }
5206       if (imm_expr.X_op == O_constant
5207           && imm_expr.X_add_number == -1
5208           && s[strlen (s) - 1] != 'u')
5209         {
5210           if (strcmp (s2, "mflo") == 0)
5211             {
5212               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5213             }
5214           else
5215             move_register (dreg, 0);
5216           break;
5217         }
5218
5219       used_at = 1;
5220       load_register (AT, &imm_expr, dbl);
5221       macro_build (NULL, s, "z,s,t", sreg, AT);
5222       macro_build (NULL, s2, "d", dreg);
5223       break;
5224
5225     case M_DIVU_3:
5226       s = "divu";
5227       s2 = "mflo";
5228       goto do_divu3;
5229     case M_REMU_3:
5230       s = "divu";
5231       s2 = "mfhi";
5232       goto do_divu3;
5233     case M_DDIVU_3:
5234       s = "ddivu";
5235       s2 = "mflo";
5236       goto do_divu3;
5237     case M_DREMU_3:
5238       s = "ddivu";
5239       s2 = "mfhi";
5240     do_divu3:
5241       start_noreorder ();
5242       if (mips_trap)
5243         {
5244           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5245           macro_build (NULL, s, "z,s,t", sreg, treg);
5246           /* We want to close the noreorder block as soon as possible, so
5247              that later insns are available for delay slot filling.  */
5248           end_noreorder ();
5249         }
5250       else
5251         {
5252           expr1.X_add_number = 8;
5253           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5254           macro_build (NULL, s, "z,s,t", sreg, treg);
5255
5256           /* We want to close the noreorder block as soon as possible, so
5257              that later insns are available for delay slot filling.  */
5258           end_noreorder ();
5259           macro_build (NULL, "break", "c", 7);
5260         }
5261       macro_build (NULL, s2, "d", dreg);
5262       break;
5263
5264     case M_DLCA_AB:
5265       dbl = 1;
5266     case M_LCA_AB:
5267       call = 1;
5268       goto do_la;
5269     case M_DLA_AB:
5270       dbl = 1;
5271     case M_LA_AB:
5272     do_la:
5273       /* Load the address of a symbol into a register.  If breg is not
5274          zero, we then add a base register to it.  */
5275
5276       if (dbl && HAVE_32BIT_GPRS)
5277         as_warn (_("dla used to load 32-bit register"));
5278
5279       if (! dbl && HAVE_64BIT_OBJECTS)
5280         as_warn (_("la used to load 64-bit address"));
5281
5282       if (offset_expr.X_op == O_constant
5283           && offset_expr.X_add_number >= -0x8000
5284           && offset_expr.X_add_number < 0x8000)
5285         {
5286           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5287                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5288           break;
5289         }
5290
5291       if (!mips_opts.noat && (treg == breg))
5292         {
5293           tempreg = AT;
5294           used_at = 1;
5295         }
5296       else
5297         {
5298           tempreg = treg;
5299         }
5300
5301       if (offset_expr.X_op != O_symbol
5302           && offset_expr.X_op != O_constant)
5303         {
5304           as_bad (_("expression too complex"));
5305           offset_expr.X_op = O_constant;
5306         }
5307
5308       if (offset_expr.X_op == O_constant)
5309         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5310       else if (mips_pic == NO_PIC)
5311         {
5312           /* If this is a reference to a GP relative symbol, we want
5313                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5314              Otherwise we want
5315                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5316                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5317              If we have a constant, we need two instructions anyhow,
5318              so we may as well always use the latter form.
5319
5320              With 64bit address space and a usable $at we want
5321                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5322                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5323                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5324                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5325                dsll32   $tempreg,0
5326                daddu    $tempreg,$tempreg,$at
5327
5328              If $at is already in use, we use a path which is suboptimal
5329              on superscalar processors.
5330                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5331                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5332                dsll     $tempreg,16
5333                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5334                dsll     $tempreg,16
5335                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5336
5337              For GP relative symbols in 64bit address space we can use
5338              the same sequence as in 32bit address space.  */
5339           if (HAVE_64BIT_SYMBOLS)
5340             {
5341               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5342                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5343                 {
5344                   relax_start (offset_expr.X_add_symbol);
5345                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5346                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5347                   relax_switch ();
5348                 }
5349
5350               if (used_at == 0 && !mips_opts.noat)
5351                 {
5352                   macro_build (&offset_expr, "lui", "t,u",
5353                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5354                   macro_build (&offset_expr, "lui", "t,u",
5355                                AT, BFD_RELOC_HI16_S);
5356                   macro_build (&offset_expr, "daddiu", "t,r,j",
5357                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5358                   macro_build (&offset_expr, "daddiu", "t,r,j",
5359                                AT, AT, BFD_RELOC_LO16);
5360                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5361                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5362                   used_at = 1;
5363                 }
5364               else
5365                 {
5366                   macro_build (&offset_expr, "lui", "t,u",
5367                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5368                   macro_build (&offset_expr, "daddiu", "t,r,j",
5369                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5370                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5371                   macro_build (&offset_expr, "daddiu", "t,r,j",
5372                                tempreg, tempreg, BFD_RELOC_HI16_S);
5373                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5374                   macro_build (&offset_expr, "daddiu", "t,r,j",
5375                                tempreg, tempreg, BFD_RELOC_LO16);
5376                 }
5377
5378               if (mips_relax.sequence)
5379                 relax_end ();
5380             }
5381           else
5382             {
5383               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5384                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5385                 {
5386                   relax_start (offset_expr.X_add_symbol);
5387                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5388                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5389                   relax_switch ();
5390                 }
5391               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5392                 as_bad (_("offset too large"));
5393               macro_build_lui (&offset_expr, tempreg);
5394               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5395                            tempreg, tempreg, BFD_RELOC_LO16);
5396               if (mips_relax.sequence)
5397                 relax_end ();
5398             }
5399         }
5400       else if (!mips_big_got && !HAVE_NEWABI)
5401         {
5402           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5403
5404           /* If this is a reference to an external symbol, and there
5405              is no constant, we want
5406                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5407              or for lca or if tempreg is PIC_CALL_REG
5408                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5409              For a local symbol, we want
5410                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5411                nop
5412                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5413
5414              If we have a small constant, and this is a reference to
5415              an external symbol, we want
5416                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5417                nop
5418                addiu    $tempreg,$tempreg,<constant>
5419              For a local symbol, we want the same instruction
5420              sequence, but we output a BFD_RELOC_LO16 reloc on the
5421              addiu instruction.
5422
5423              If we have a large constant, and this is a reference to
5424              an external symbol, we want
5425                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5426                lui      $at,<hiconstant>
5427                addiu    $at,$at,<loconstant>
5428                addu     $tempreg,$tempreg,$at
5429              For a local symbol, we want the same instruction
5430              sequence, but we output a BFD_RELOC_LO16 reloc on the
5431              addiu instruction.
5432            */
5433
5434           if (offset_expr.X_add_number == 0)
5435             {
5436               if (mips_pic == SVR4_PIC
5437                   && breg == 0
5438                   && (call || tempreg == PIC_CALL_REG))
5439                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5440
5441               relax_start (offset_expr.X_add_symbol);
5442               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5443                            lw_reloc_type, mips_gp_register);
5444               if (breg != 0)
5445                 {
5446                   /* We're going to put in an addu instruction using
5447                      tempreg, so we may as well insert the nop right
5448                      now.  */
5449                   load_delay_nop ();
5450                 }
5451               relax_switch ();
5452               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5453                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5454               load_delay_nop ();
5455               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5456                            tempreg, tempreg, BFD_RELOC_LO16);
5457               relax_end ();
5458               /* FIXME: If breg == 0, and the next instruction uses
5459                  $tempreg, then if this variant case is used an extra
5460                  nop will be generated.  */
5461             }
5462           else if (offset_expr.X_add_number >= -0x8000
5463                    && offset_expr.X_add_number < 0x8000)
5464             {
5465               load_got_offset (tempreg, &offset_expr);
5466               load_delay_nop ();
5467               add_got_offset (tempreg, &offset_expr);
5468             }
5469           else
5470             {
5471               expr1.X_add_number = offset_expr.X_add_number;
5472               offset_expr.X_add_number =
5473                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5474               load_got_offset (tempreg, &offset_expr);
5475               offset_expr.X_add_number = expr1.X_add_number;
5476               /* If we are going to add in a base register, and the
5477                  target register and the base register are the same,
5478                  then we are using AT as a temporary register.  Since
5479                  we want to load the constant into AT, we add our
5480                  current AT (from the global offset table) and the
5481                  register into the register now, and pretend we were
5482                  not using a base register.  */
5483               if (breg == treg)
5484                 {
5485                   load_delay_nop ();
5486                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5487                                treg, AT, breg);
5488                   breg = 0;
5489                   tempreg = treg;
5490                 }
5491               add_got_offset_hilo (tempreg, &offset_expr, AT);
5492               used_at = 1;
5493             }
5494         }
5495       else if (!mips_big_got && HAVE_NEWABI)
5496         {
5497           int add_breg_early = 0;
5498
5499           /* If this is a reference to an external, and there is no
5500              constant, or local symbol (*), with or without a
5501              constant, we want
5502                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5503              or for lca or if tempreg is PIC_CALL_REG
5504                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5505
5506              If we have a small constant, and this is a reference to
5507              an external symbol, we want
5508                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5509                addiu    $tempreg,$tempreg,<constant>
5510
5511              If we have a large constant, and this is a reference to
5512              an external symbol, we want
5513                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5514                lui      $at,<hiconstant>
5515                addiu    $at,$at,<loconstant>
5516                addu     $tempreg,$tempreg,$at
5517
5518              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5519              local symbols, even though it introduces an additional
5520              instruction.  */
5521
5522           if (offset_expr.X_add_number)
5523             {
5524               expr1.X_add_number = offset_expr.X_add_number;
5525               offset_expr.X_add_number = 0;
5526
5527               relax_start (offset_expr.X_add_symbol);
5528               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5529                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5530
5531               if (expr1.X_add_number >= -0x8000
5532                   && expr1.X_add_number < 0x8000)
5533                 {
5534                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5535                                tempreg, tempreg, BFD_RELOC_LO16);
5536                 }
5537               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5538                 {
5539                   int dreg;
5540
5541                   /* If we are going to add in a base register, and the
5542                      target register and the base register are the same,
5543                      then we are using AT as a temporary register.  Since
5544                      we want to load the constant into AT, we add our
5545                      current AT (from the global offset table) and the
5546                      register into the register now, and pretend we were
5547                      not using a base register.  */
5548                   if (breg != treg)
5549                     dreg = tempreg;
5550                   else
5551                     {
5552                       assert (tempreg == AT);
5553                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5554                                    treg, AT, breg);
5555                       dreg = treg;
5556                       add_breg_early = 1;
5557                     }
5558
5559                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5560                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5561                                dreg, dreg, AT);
5562
5563                   used_at = 1;
5564                 }
5565               else
5566                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5567
5568               relax_switch ();
5569               offset_expr.X_add_number = expr1.X_add_number;
5570
5571               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5572                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5573               if (add_breg_early)
5574                 {
5575                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5576                                treg, tempreg, breg);
5577                   breg = 0;
5578                   tempreg = treg;
5579                 }
5580               relax_end ();
5581             }
5582           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5583             {
5584               relax_start (offset_expr.X_add_symbol);
5585               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5586                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5587               relax_switch ();
5588               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5589                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5590               relax_end ();
5591             }
5592           else
5593             {
5594               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5595                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5596             }
5597         }
5598       else if (mips_big_got && !HAVE_NEWABI)
5599         {
5600           int gpdelay;
5601           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5602           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5603           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5604
5605           /* This is the large GOT case.  If this is a reference to an
5606              external symbol, and there is no constant, we want
5607                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5608                addu     $tempreg,$tempreg,$gp
5609                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5610              or for lca or if tempreg is PIC_CALL_REG
5611                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5612                addu     $tempreg,$tempreg,$gp
5613                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5614              For a local symbol, we want
5615                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5616                nop
5617                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5618
5619              If we have a small constant, and this is a reference to
5620              an external symbol, we want
5621                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5622                addu     $tempreg,$tempreg,$gp
5623                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5624                nop
5625                addiu    $tempreg,$tempreg,<constant>
5626              For a local symbol, we want
5627                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5628                nop
5629                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5630
5631              If we have a large constant, and this is a reference to
5632              an external symbol, we want
5633                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5634                addu     $tempreg,$tempreg,$gp
5635                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5636                lui      $at,<hiconstant>
5637                addiu    $at,$at,<loconstant>
5638                addu     $tempreg,$tempreg,$at
5639              For a local symbol, we want
5640                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5641                lui      $at,<hiconstant>
5642                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5643                addu     $tempreg,$tempreg,$at
5644           */
5645
5646           expr1.X_add_number = offset_expr.X_add_number;
5647           offset_expr.X_add_number = 0;
5648           relax_start (offset_expr.X_add_symbol);
5649           gpdelay = reg_needs_delay (mips_gp_register);
5650           if (expr1.X_add_number == 0 && breg == 0
5651               && (call || tempreg == PIC_CALL_REG))
5652             {
5653               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5654               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5655             }
5656           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5657           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5658                        tempreg, tempreg, mips_gp_register);
5659           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5660                        tempreg, lw_reloc_type, tempreg);
5661           if (expr1.X_add_number == 0)
5662             {
5663               if (breg != 0)
5664                 {
5665                   /* We're going to put in an addu instruction using
5666                      tempreg, so we may as well insert the nop right
5667                      now.  */
5668                   load_delay_nop ();
5669                 }
5670             }
5671           else if (expr1.X_add_number >= -0x8000
5672                    && expr1.X_add_number < 0x8000)
5673             {
5674               load_delay_nop ();
5675               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5676                            tempreg, tempreg, BFD_RELOC_LO16);
5677             }
5678           else
5679             {
5680               int dreg;
5681
5682               /* If we are going to add in a base register, and the
5683                  target register and the base register are the same,
5684                  then we are using AT as a temporary register.  Since
5685                  we want to load the constant into AT, we add our
5686                  current AT (from the global offset table) and the
5687                  register into the register now, and pretend we were
5688                  not using a base register.  */
5689               if (breg != treg)
5690                 dreg = tempreg;
5691               else
5692                 {
5693                   assert (tempreg == AT);
5694                   load_delay_nop ();
5695                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5696                                treg, AT, breg);
5697                   dreg = treg;
5698                 }
5699
5700               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5701               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5702
5703               used_at = 1;
5704             }
5705           offset_expr.X_add_number =
5706             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5707           relax_switch ();
5708
5709           if (gpdelay)
5710             {
5711               /* This is needed because this instruction uses $gp, but
5712                  the first instruction on the main stream does not.  */
5713               macro_build (NULL, "nop", "");
5714             }
5715
5716           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5717                        local_reloc_type, mips_gp_register);
5718           if (expr1.X_add_number >= -0x8000
5719               && expr1.X_add_number < 0x8000)
5720             {
5721               load_delay_nop ();
5722               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5723                            tempreg, tempreg, BFD_RELOC_LO16);
5724               /* FIXME: If add_number is 0, and there was no base
5725                  register, the external symbol case ended with a load,
5726                  so if the symbol turns out to not be external, and
5727                  the next instruction uses tempreg, an unnecessary nop
5728                  will be inserted.  */
5729             }
5730           else
5731             {
5732               if (breg == treg)
5733                 {
5734                   /* We must add in the base register now, as in the
5735                      external symbol case.  */
5736                   assert (tempreg == AT);
5737                   load_delay_nop ();
5738                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5739                                treg, AT, breg);
5740                   tempreg = treg;
5741                   /* We set breg to 0 because we have arranged to add
5742                      it in in both cases.  */
5743                   breg = 0;
5744                 }
5745
5746               macro_build_lui (&expr1, AT);
5747               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5748                            AT, AT, BFD_RELOC_LO16);
5749               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5750                            tempreg, tempreg, AT);
5751               used_at = 1;
5752             }
5753           relax_end ();
5754         }
5755       else if (mips_big_got && HAVE_NEWABI)
5756         {
5757           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5758           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5759           int add_breg_early = 0;
5760
5761           /* This is the large GOT case.  If this is a reference to an
5762              external symbol, and there is no constant, we want
5763                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5764                add      $tempreg,$tempreg,$gp
5765                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5766              or for lca or if tempreg is PIC_CALL_REG
5767                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5768                add      $tempreg,$tempreg,$gp
5769                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5770
5771              If we have a small constant, and this is a reference to
5772              an external symbol, we want
5773                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5774                add      $tempreg,$tempreg,$gp
5775                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5776                addi     $tempreg,$tempreg,<constant>
5777
5778              If we have a large constant, and this is a reference to
5779              an external symbol, we want
5780                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5781                addu     $tempreg,$tempreg,$gp
5782                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5783                lui      $at,<hiconstant>
5784                addi     $at,$at,<loconstant>
5785                add      $tempreg,$tempreg,$at
5786
5787              If we have NewABI, and we know it's a local symbol, we want
5788                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5789                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5790              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5791
5792           relax_start (offset_expr.X_add_symbol);
5793
5794           expr1.X_add_number = offset_expr.X_add_number;
5795           offset_expr.X_add_number = 0;
5796
5797           if (expr1.X_add_number == 0 && breg == 0
5798               && (call || tempreg == PIC_CALL_REG))
5799             {
5800               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5801               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5802             }
5803           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5804           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5805                        tempreg, tempreg, mips_gp_register);
5806           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5807                        tempreg, lw_reloc_type, tempreg);
5808
5809           if (expr1.X_add_number == 0)
5810             ;
5811           else if (expr1.X_add_number >= -0x8000
5812                    && expr1.X_add_number < 0x8000)
5813             {
5814               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5815                            tempreg, tempreg, BFD_RELOC_LO16);
5816             }
5817           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5818             {
5819               int dreg;
5820
5821               /* If we are going to add in a base register, and the
5822                  target register and the base register are the same,
5823                  then we are using AT as a temporary register.  Since
5824                  we want to load the constant into AT, we add our
5825                  current AT (from the global offset table) and the
5826                  register into the register now, and pretend we were
5827                  not using a base register.  */
5828               if (breg != treg)
5829                 dreg = tempreg;
5830               else
5831                 {
5832                   assert (tempreg == AT);
5833                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5834                                treg, AT, breg);
5835                   dreg = treg;
5836                   add_breg_early = 1;
5837                 }
5838
5839               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5840               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5841
5842               used_at = 1;
5843             }
5844           else
5845             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5846
5847           relax_switch ();
5848           offset_expr.X_add_number = expr1.X_add_number;
5849           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5850                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5851           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5852                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5853           if (add_breg_early)
5854             {
5855               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5856                            treg, tempreg, breg);
5857               breg = 0;
5858               tempreg = treg;
5859             }
5860           relax_end ();
5861         }
5862       else
5863         abort ();
5864
5865       if (breg != 0)
5866         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5867       break;
5868
5869     case M_J_A:
5870       /* The j instruction may not be used in PIC code, since it
5871          requires an absolute address.  We convert it to a b
5872          instruction.  */
5873       if (mips_pic == NO_PIC)
5874         macro_build (&offset_expr, "j", "a");
5875       else
5876         macro_build (&offset_expr, "b", "p");
5877       break;
5878
5879       /* The jal instructions must be handled as macros because when
5880          generating PIC code they expand to multi-instruction
5881          sequences.  Normally they are simple instructions.  */
5882     case M_JAL_1:
5883       dreg = RA;
5884       /* Fall through.  */
5885     case M_JAL_2:
5886       if (mips_pic == NO_PIC)
5887         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5888       else
5889         {
5890           if (sreg != PIC_CALL_REG)
5891             as_warn (_("MIPS PIC call to register other than $25"));
5892
5893           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5894           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5895             {
5896               if (mips_cprestore_offset < 0)
5897                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5898               else
5899                 {
5900                   if (! mips_frame_reg_valid)
5901                     {
5902                       as_warn (_("No .frame pseudo-op used in PIC code"));
5903                       /* Quiet this warning.  */
5904                       mips_frame_reg_valid = 1;
5905                     }
5906                   if (! mips_cprestore_valid)
5907                     {
5908                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5909                       /* Quiet this warning.  */
5910                       mips_cprestore_valid = 1;
5911                     }
5912                   expr1.X_add_number = mips_cprestore_offset;
5913                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5914                                                 mips_gp_register,
5915                                                 mips_frame_reg,
5916                                                 HAVE_64BIT_ADDRESSES);
5917                 }
5918             }
5919         }
5920
5921       break;
5922
5923     case M_JAL_A:
5924       if (mips_pic == NO_PIC)
5925         macro_build (&offset_expr, "jal", "a");
5926       else if (mips_pic == SVR4_PIC)
5927         {
5928           /* If this is a reference to an external symbol, and we are
5929              using a small GOT, we want
5930                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5931                nop
5932                jalr     $ra,$25
5933                nop
5934                lw       $gp,cprestore($sp)
5935              The cprestore value is set using the .cprestore
5936              pseudo-op.  If we are using a big GOT, we want
5937                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5938                addu     $25,$25,$gp
5939                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5940                nop
5941                jalr     $ra,$25
5942                nop
5943                lw       $gp,cprestore($sp)
5944              If the symbol is not external, we want
5945                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5946                nop
5947                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5948                jalr     $ra,$25
5949                nop
5950                lw $gp,cprestore($sp)
5951
5952              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5953              sequences above, minus nops, unless the symbol is local,
5954              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5955              GOT_DISP.  */
5956           if (HAVE_NEWABI)
5957             {
5958               if (! mips_big_got)
5959                 {
5960                   relax_start (offset_expr.X_add_symbol);
5961                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5962                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5963                                mips_gp_register);
5964                   relax_switch ();
5965                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5966                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5967                                mips_gp_register);
5968                   relax_end ();
5969                 }
5970               else
5971                 {
5972                   relax_start (offset_expr.X_add_symbol);
5973                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5974                                BFD_RELOC_MIPS_CALL_HI16);
5975                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5976                                PIC_CALL_REG, mips_gp_register);
5977                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5978                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5979                                PIC_CALL_REG);
5980                   relax_switch ();
5981                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5982                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
5983                                mips_gp_register);
5984                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5985                                PIC_CALL_REG, PIC_CALL_REG,
5986                                BFD_RELOC_MIPS_GOT_OFST);
5987                   relax_end ();
5988                 }
5989
5990               macro_build_jalr (&offset_expr);
5991             }
5992           else
5993             {
5994               relax_start (offset_expr.X_add_symbol);
5995               if (! mips_big_got)
5996                 {
5997                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5998                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5999                                mips_gp_register);
6000                   load_delay_nop ();
6001                   relax_switch ();
6002                 }
6003               else
6004                 {
6005                   int gpdelay;
6006
6007                   gpdelay = reg_needs_delay (mips_gp_register);
6008                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6009                                BFD_RELOC_MIPS_CALL_HI16);
6010                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6011                                PIC_CALL_REG, mips_gp_register);
6012                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6013                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6014                                PIC_CALL_REG);
6015                   load_delay_nop ();
6016                   relax_switch ();
6017                   if (gpdelay)
6018                     macro_build (NULL, "nop", "");
6019                 }
6020               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6021                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6022                            mips_gp_register);
6023               load_delay_nop ();
6024               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6025                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6026               relax_end ();
6027               macro_build_jalr (&offset_expr);
6028
6029               if (mips_cprestore_offset < 0)
6030                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6031               else
6032                 {
6033                   if (! mips_frame_reg_valid)
6034                     {
6035                       as_warn (_("No .frame pseudo-op used in PIC code"));
6036                       /* Quiet this warning.  */
6037                       mips_frame_reg_valid = 1;
6038                     }
6039                   if (! mips_cprestore_valid)
6040                     {
6041                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6042                       /* Quiet this warning.  */
6043                       mips_cprestore_valid = 1;
6044                     }
6045                   if (mips_opts.noreorder)
6046                     macro_build (NULL, "nop", "");
6047                   expr1.X_add_number = mips_cprestore_offset;
6048                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6049                                                 mips_gp_register,
6050                                                 mips_frame_reg,
6051                                                 HAVE_64BIT_ADDRESSES);
6052                 }
6053             }
6054         }
6055       else if (mips_pic == VXWORKS_PIC)
6056         as_bad (_("Non-PIC jump used in PIC library"));
6057       else
6058         abort ();
6059
6060       break;
6061
6062     case M_LB_AB:
6063       s = "lb";
6064       goto ld;
6065     case M_LBU_AB:
6066       s = "lbu";
6067       goto ld;
6068     case M_LH_AB:
6069       s = "lh";
6070       goto ld;
6071     case M_LHU_AB:
6072       s = "lhu";
6073       goto ld;
6074     case M_LW_AB:
6075       s = "lw";
6076       goto ld;
6077     case M_LWC0_AB:
6078       s = "lwc0";
6079       /* Itbl support may require additional care here.  */
6080       coproc = 1;
6081       goto ld;
6082     case M_LWC1_AB:
6083       s = "lwc1";
6084       /* Itbl support may require additional care here.  */
6085       coproc = 1;
6086       goto ld;
6087     case M_LWC2_AB:
6088       s = "lwc2";
6089       /* Itbl support may require additional care here.  */
6090       coproc = 1;
6091       goto ld;
6092     case M_LWC3_AB:
6093       s = "lwc3";
6094       /* Itbl support may require additional care here.  */
6095       coproc = 1;
6096       goto ld;
6097     case M_LWL_AB:
6098       s = "lwl";
6099       lr = 1;
6100       goto ld;
6101     case M_LWR_AB:
6102       s = "lwr";
6103       lr = 1;
6104       goto ld;
6105     case M_LDC1_AB:
6106       if (mips_opts.arch == CPU_R4650)
6107         {
6108           as_bad (_("opcode not supported on this processor"));
6109           break;
6110         }
6111       s = "ldc1";
6112       /* Itbl support may require additional care here.  */
6113       coproc = 1;
6114       goto ld;
6115     case M_LDC2_AB:
6116       s = "ldc2";
6117       /* Itbl support may require additional care here.  */
6118       coproc = 1;
6119       goto ld;
6120     case M_LDC3_AB:
6121       s = "ldc3";
6122       /* Itbl support may require additional care here.  */
6123       coproc = 1;
6124       goto ld;
6125     case M_LDL_AB:
6126       s = "ldl";
6127       lr = 1;
6128       goto ld;
6129     case M_LDR_AB:
6130       s = "ldr";
6131       lr = 1;
6132       goto ld;
6133     case M_LL_AB:
6134       s = "ll";
6135       goto ld;
6136     case M_LLD_AB:
6137       s = "lld";
6138       goto ld;
6139     case M_LWU_AB:
6140       s = "lwu";
6141     ld:
6142       if (breg == treg || coproc || lr)
6143         {
6144           tempreg = AT;
6145           used_at = 1;
6146         }
6147       else
6148         {
6149           tempreg = treg;
6150         }
6151       goto ld_st;
6152     case M_SB_AB:
6153       s = "sb";
6154       goto st;
6155     case M_SH_AB:
6156       s = "sh";
6157       goto st;
6158     case M_SW_AB:
6159       s = "sw";
6160       goto st;
6161     case M_SWC0_AB:
6162       s = "swc0";
6163       /* Itbl support may require additional care here.  */
6164       coproc = 1;
6165       goto st;
6166     case M_SWC1_AB:
6167       s = "swc1";
6168       /* Itbl support may require additional care here.  */
6169       coproc = 1;
6170       goto st;
6171     case M_SWC2_AB:
6172       s = "swc2";
6173       /* Itbl support may require additional care here.  */
6174       coproc = 1;
6175       goto st;
6176     case M_SWC3_AB:
6177       s = "swc3";
6178       /* Itbl support may require additional care here.  */
6179       coproc = 1;
6180       goto st;
6181     case M_SWL_AB:
6182       s = "swl";
6183       goto st;
6184     case M_SWR_AB:
6185       s = "swr";
6186       goto st;
6187     case M_SC_AB:
6188       s = "sc";
6189       goto st;
6190     case M_SCD_AB:
6191       s = "scd";
6192       goto st;
6193     case M_CACHE_AB:
6194       s = "cache";
6195       goto st;
6196     case M_SDC1_AB:
6197       if (mips_opts.arch == CPU_R4650)
6198         {
6199           as_bad (_("opcode not supported on this processor"));
6200           break;
6201         }
6202       s = "sdc1";
6203       coproc = 1;
6204       /* Itbl support may require additional care here.  */
6205       goto st;
6206     case M_SDC2_AB:
6207       s = "sdc2";
6208       /* Itbl support may require additional care here.  */
6209       coproc = 1;
6210       goto st;
6211     case M_SDC3_AB:
6212       s = "sdc3";
6213       /* Itbl support may require additional care here.  */
6214       coproc = 1;
6215       goto st;
6216     case M_SDL_AB:
6217       s = "sdl";
6218       goto st;
6219     case M_SDR_AB:
6220       s = "sdr";
6221     st:
6222       tempreg = AT;
6223       used_at = 1;
6224     ld_st:
6225       /* Itbl support may require additional care here.  */
6226       if (mask == M_LWC1_AB
6227           || mask == M_SWC1_AB
6228           || mask == M_LDC1_AB
6229           || mask == M_SDC1_AB
6230           || mask == M_L_DAB
6231           || mask == M_S_DAB)
6232         fmt = "T,o(b)";
6233       else if (mask == M_CACHE_AB)
6234         fmt = "k,o(b)";
6235       else if (coproc)
6236         fmt = "E,o(b)";
6237       else
6238         fmt = "t,o(b)";
6239
6240       if (offset_expr.X_op != O_constant
6241           && offset_expr.X_op != O_symbol)
6242         {
6243           as_bad (_("expression too complex"));
6244           offset_expr.X_op = O_constant;
6245         }
6246
6247       if (HAVE_32BIT_ADDRESSES
6248           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6249         {
6250           char value [32];
6251
6252           sprintf_vma (value, offset_expr.X_add_number);
6253           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6254         }
6255
6256       /* A constant expression in PIC code can be handled just as it
6257          is in non PIC code.  */
6258       if (offset_expr.X_op == O_constant)
6259         {
6260           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6261                                 & ~(bfd_vma) 0xffff);
6262           normalize_address_expr (&expr1);
6263           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6264           if (breg != 0)
6265             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6266                          tempreg, tempreg, breg);
6267           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6268         }
6269       else if (mips_pic == NO_PIC)
6270         {
6271           /* If this is a reference to a GP relative symbol, and there
6272              is no base register, we want
6273                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6274              Otherwise, if there is no base register, we want
6275                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6276                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6277              If we have a constant, we need two instructions anyhow,
6278              so we always use the latter form.
6279
6280              If we have a base register, and this is a reference to a
6281              GP relative symbol, we want
6282                addu     $tempreg,$breg,$gp
6283                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6284              Otherwise we want
6285                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6286                addu     $tempreg,$tempreg,$breg
6287                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6288              With a constant we always use the latter case.
6289
6290              With 64bit address space and no base register and $at usable,
6291              we want
6292                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6293                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6294                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6295                dsll32   $tempreg,0
6296                daddu    $tempreg,$at
6297                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6298              If we have a base register, we want
6299                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6300                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6301                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6302                daddu    $at,$breg
6303                dsll32   $tempreg,0
6304                daddu    $tempreg,$at
6305                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6306
6307              Without $at we can't generate the optimal path for superscalar
6308              processors here since this would require two temporary registers.
6309                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6310                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6311                dsll     $tempreg,16
6312                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6313                dsll     $tempreg,16
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                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6318                dsll     $tempreg,16
6319                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6320                dsll     $tempreg,16
6321                daddu    $tempreg,$tempreg,$breg
6322                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6323
6324              For GP relative symbols in 64bit address space we can use
6325              the same sequence as in 32bit address space.  */
6326           if (HAVE_64BIT_SYMBOLS)
6327             {
6328               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6329                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6330                 {
6331                   relax_start (offset_expr.X_add_symbol);
6332                   if (breg == 0)
6333                     {
6334                       macro_build (&offset_expr, s, fmt, treg,
6335                                    BFD_RELOC_GPREL16, mips_gp_register);
6336                     }
6337                   else
6338                     {
6339                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6340                                    tempreg, breg, mips_gp_register);
6341                       macro_build (&offset_expr, s, fmt, treg,
6342                                    BFD_RELOC_GPREL16, tempreg);
6343                     }
6344                   relax_switch ();
6345                 }
6346
6347               if (used_at == 0 && !mips_opts.noat)
6348                 {
6349                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6350                                BFD_RELOC_MIPS_HIGHEST);
6351                   macro_build (&offset_expr, "lui", "t,u", AT,
6352                                BFD_RELOC_HI16_S);
6353                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6354                                tempreg, BFD_RELOC_MIPS_HIGHER);
6355                   if (breg != 0)
6356                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6357                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6358                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6359                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6360                                tempreg);
6361                   used_at = 1;
6362                 }
6363               else
6364                 {
6365                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6366                                BFD_RELOC_MIPS_HIGHEST);
6367                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6368                                tempreg, BFD_RELOC_MIPS_HIGHER);
6369                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6370                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6371                                tempreg, BFD_RELOC_HI16_S);
6372                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6373                   if (breg != 0)
6374                     macro_build (NULL, "daddu", "d,v,t",
6375                                  tempreg, tempreg, breg);
6376                   macro_build (&offset_expr, s, fmt, treg,
6377                                BFD_RELOC_LO16, tempreg);
6378                 }
6379
6380               if (mips_relax.sequence)
6381                 relax_end ();
6382               break;
6383             }
6384
6385           if (breg == 0)
6386             {
6387               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6388                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6389                 {
6390                   relax_start (offset_expr.X_add_symbol);
6391                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6392                                mips_gp_register);
6393                   relax_switch ();
6394                 }
6395               macro_build_lui (&offset_expr, tempreg);
6396               macro_build (&offset_expr, s, fmt, treg,
6397                            BFD_RELOC_LO16, tempreg);
6398               if (mips_relax.sequence)
6399                 relax_end ();
6400             }
6401           else
6402             {
6403               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6404                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6405                 {
6406                   relax_start (offset_expr.X_add_symbol);
6407                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6408                                tempreg, breg, mips_gp_register);
6409                   macro_build (&offset_expr, s, fmt, treg,
6410                                BFD_RELOC_GPREL16, tempreg);
6411                   relax_switch ();
6412                 }
6413               macro_build_lui (&offset_expr, tempreg);
6414               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6415                            tempreg, tempreg, breg);
6416               macro_build (&offset_expr, s, fmt, treg,
6417                            BFD_RELOC_LO16, tempreg);
6418               if (mips_relax.sequence)
6419                 relax_end ();
6420             }
6421         }
6422       else if (!mips_big_got)
6423         {
6424           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6425
6426           /* If this is a reference to an external symbol, we want
6427                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6428                nop
6429                <op>     $treg,0($tempreg)
6430              Otherwise we want
6431                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6432                nop
6433                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6434                <op>     $treg,0($tempreg)
6435
6436              For NewABI, we want
6437                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6438                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6439
6440              If there is a base register, we add it to $tempreg before
6441              the <op>.  If there is a constant, we stick it in the
6442              <op> instruction.  We don't handle constants larger than
6443              16 bits, because we have no way to load the upper 16 bits
6444              (actually, we could handle them for the subset of cases
6445              in which we are not using $at).  */
6446           assert (offset_expr.X_op == O_symbol);
6447           if (HAVE_NEWABI)
6448             {
6449               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6450                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6451               if (breg != 0)
6452                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6453                              tempreg, tempreg, breg);
6454               macro_build (&offset_expr, s, fmt, treg,
6455                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6456               break;
6457             }
6458           expr1.X_add_number = offset_expr.X_add_number;
6459           offset_expr.X_add_number = 0;
6460           if (expr1.X_add_number < -0x8000
6461               || expr1.X_add_number >= 0x8000)
6462             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6463           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6464                        lw_reloc_type, mips_gp_register);
6465           load_delay_nop ();
6466           relax_start (offset_expr.X_add_symbol);
6467           relax_switch ();
6468           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6469                        tempreg, BFD_RELOC_LO16);
6470           relax_end ();
6471           if (breg != 0)
6472             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6473                          tempreg, tempreg, breg);
6474           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6475         }
6476       else if (mips_big_got && !HAVE_NEWABI)
6477         {
6478           int gpdelay;
6479
6480           /* If this is a reference to an external symbol, we want
6481                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6482                addu     $tempreg,$tempreg,$gp
6483                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6484                <op>     $treg,0($tempreg)
6485              Otherwise we want
6486                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6487                nop
6488                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6489                <op>     $treg,0($tempreg)
6490              If there is a base register, we add it to $tempreg before
6491              the <op>.  If there is a constant, we stick it in the
6492              <op> instruction.  We don't handle constants larger than
6493              16 bits, because we have no way to load the upper 16 bits
6494              (actually, we could handle them for the subset of cases
6495              in which we are not using $at).  */
6496           assert (offset_expr.X_op == O_symbol);
6497           expr1.X_add_number = offset_expr.X_add_number;
6498           offset_expr.X_add_number = 0;
6499           if (expr1.X_add_number < -0x8000
6500               || expr1.X_add_number >= 0x8000)
6501             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6502           gpdelay = reg_needs_delay (mips_gp_register);
6503           relax_start (offset_expr.X_add_symbol);
6504           macro_build (&offset_expr, "lui", "t,u", tempreg,
6505                        BFD_RELOC_MIPS_GOT_HI16);
6506           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6507                        mips_gp_register);
6508           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6509                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6510           relax_switch ();
6511           if (gpdelay)
6512             macro_build (NULL, "nop", "");
6513           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6514                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6515           load_delay_nop ();
6516           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6517                        tempreg, BFD_RELOC_LO16);
6518           relax_end ();
6519
6520           if (breg != 0)
6521             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6522                          tempreg, tempreg, breg);
6523           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6524         }
6525       else if (mips_big_got && HAVE_NEWABI)
6526         {
6527           /* If this is a reference to an external symbol, we want
6528                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6529                add      $tempreg,$tempreg,$gp
6530                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6531                <op>     $treg,<ofst>($tempreg)
6532              Otherwise, for local symbols, we want:
6533                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6534                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6535           assert (offset_expr.X_op == O_symbol);
6536           expr1.X_add_number = offset_expr.X_add_number;
6537           offset_expr.X_add_number = 0;
6538           if (expr1.X_add_number < -0x8000
6539               || expr1.X_add_number >= 0x8000)
6540             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6541           relax_start (offset_expr.X_add_symbol);
6542           macro_build (&offset_expr, "lui", "t,u", tempreg,
6543                        BFD_RELOC_MIPS_GOT_HI16);
6544           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6545                        mips_gp_register);
6546           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6547                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6548           if (breg != 0)
6549             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6550                          tempreg, tempreg, breg);
6551           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6552
6553           relax_switch ();
6554           offset_expr.X_add_number = expr1.X_add_number;
6555           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6556                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6557           if (breg != 0)
6558             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6559                          tempreg, tempreg, breg);
6560           macro_build (&offset_expr, s, fmt, treg,
6561                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6562           relax_end ();
6563         }
6564       else
6565         abort ();
6566
6567       break;
6568
6569     case M_LI:
6570     case M_LI_S:
6571       load_register (treg, &imm_expr, 0);
6572       break;
6573
6574     case M_DLI:
6575       load_register (treg, &imm_expr, 1);
6576       break;
6577
6578     case M_LI_SS:
6579       if (imm_expr.X_op == O_constant)
6580         {
6581           used_at = 1;
6582           load_register (AT, &imm_expr, 0);
6583           macro_build (NULL, "mtc1", "t,G", AT, treg);
6584           break;
6585         }
6586       else
6587         {
6588           assert (offset_expr.X_op == O_symbol
6589                   && strcmp (segment_name (S_GET_SEGMENT
6590                                            (offset_expr.X_add_symbol)),
6591                              ".lit4") == 0
6592                   && offset_expr.X_add_number == 0);
6593           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6594                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6595           break;
6596         }
6597
6598     case M_LI_D:
6599       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6600          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6601          order 32 bits of the value and the low order 32 bits are either
6602          zero or in OFFSET_EXPR.  */
6603       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6604         {
6605           if (HAVE_64BIT_GPRS)
6606             load_register (treg, &imm_expr, 1);
6607           else
6608             {
6609               int hreg, lreg;
6610
6611               if (target_big_endian)
6612                 {
6613                   hreg = treg;
6614                   lreg = treg + 1;
6615                 }
6616               else
6617                 {
6618                   hreg = treg + 1;
6619                   lreg = treg;
6620                 }
6621
6622               if (hreg <= 31)
6623                 load_register (hreg, &imm_expr, 0);
6624               if (lreg <= 31)
6625                 {
6626                   if (offset_expr.X_op == O_absent)
6627                     move_register (lreg, 0);
6628                   else
6629                     {
6630                       assert (offset_expr.X_op == O_constant);
6631                       load_register (lreg, &offset_expr, 0);
6632                     }
6633                 }
6634             }
6635           break;
6636         }
6637
6638       /* We know that sym is in the .rdata section.  First we get the
6639          upper 16 bits of the address.  */
6640       if (mips_pic == NO_PIC)
6641         {
6642           macro_build_lui (&offset_expr, AT);
6643           used_at = 1;
6644         }
6645       else
6646         {
6647           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6648                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6649           used_at = 1;
6650         }
6651
6652       /* Now we load the register(s).  */
6653       if (HAVE_64BIT_GPRS)
6654         {
6655           used_at = 1;
6656           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6657         }
6658       else
6659         {
6660           used_at = 1;
6661           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6662           if (treg != RA)
6663             {
6664               /* FIXME: How in the world do we deal with the possible
6665                  overflow here?  */
6666               offset_expr.X_add_number += 4;
6667               macro_build (&offset_expr, "lw", "t,o(b)",
6668                            treg + 1, BFD_RELOC_LO16, AT);
6669             }
6670         }
6671       break;
6672
6673     case M_LI_DD:
6674       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6675          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6676          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6677          the value and the low order 32 bits are either zero or in
6678          OFFSET_EXPR.  */
6679       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6680         {
6681           used_at = 1;
6682           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6683           if (HAVE_64BIT_FPRS)
6684             {
6685               assert (HAVE_64BIT_GPRS);
6686               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6687             }
6688           else
6689             {
6690               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6691               if (offset_expr.X_op == O_absent)
6692                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6693               else
6694                 {
6695                   assert (offset_expr.X_op == O_constant);
6696                   load_register (AT, &offset_expr, 0);
6697                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6698                 }
6699             }
6700           break;
6701         }
6702
6703       assert (offset_expr.X_op == O_symbol
6704               && offset_expr.X_add_number == 0);
6705       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6706       if (strcmp (s, ".lit8") == 0)
6707         {
6708           if (mips_opts.isa != ISA_MIPS1)
6709             {
6710               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6711                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6712               break;
6713             }
6714           breg = mips_gp_register;
6715           r = BFD_RELOC_MIPS_LITERAL;
6716           goto dob;
6717         }
6718       else
6719         {
6720           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6721           used_at = 1;
6722           if (mips_pic != NO_PIC)
6723             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6724                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6725           else
6726             {
6727               /* FIXME: This won't work for a 64 bit address.  */
6728               macro_build_lui (&offset_expr, AT);
6729             }
6730
6731           if (mips_opts.isa != ISA_MIPS1)
6732             {
6733               macro_build (&offset_expr, "ldc1", "T,o(b)",
6734                            treg, BFD_RELOC_LO16, AT);
6735               break;
6736             }
6737           breg = AT;
6738           r = BFD_RELOC_LO16;
6739           goto dob;
6740         }
6741
6742     case M_L_DOB:
6743       if (mips_opts.arch == CPU_R4650)
6744         {
6745           as_bad (_("opcode not supported on this processor"));
6746           break;
6747         }
6748       /* Even on a big endian machine $fn comes before $fn+1.  We have
6749          to adjust when loading from memory.  */
6750       r = BFD_RELOC_LO16;
6751     dob:
6752       assert (mips_opts.isa == ISA_MIPS1);
6753       macro_build (&offset_expr, "lwc1", "T,o(b)",
6754                    target_big_endian ? treg + 1 : treg, r, breg);
6755       /* FIXME: A possible overflow which I don't know how to deal
6756          with.  */
6757       offset_expr.X_add_number += 4;
6758       macro_build (&offset_expr, "lwc1", "T,o(b)",
6759                    target_big_endian ? treg : treg + 1, r, breg);
6760       break;
6761
6762     case M_L_DAB:
6763       /*
6764        * The MIPS assembler seems to check for X_add_number not
6765        * being double aligned and generating:
6766        *        lui     at,%hi(foo+1)
6767        *        addu    at,at,v1
6768        *        addiu   at,at,%lo(foo+1)
6769        *        lwc1    f2,0(at)
6770        *        lwc1    f3,4(at)
6771        * But, the resulting address is the same after relocation so why
6772        * generate the extra instruction?
6773        */
6774       if (mips_opts.arch == CPU_R4650)
6775         {
6776           as_bad (_("opcode not supported on this processor"));
6777           break;
6778         }
6779       /* Itbl support may require additional care here.  */
6780       coproc = 1;
6781       if (mips_opts.isa != ISA_MIPS1)
6782         {
6783           s = "ldc1";
6784           goto ld;
6785         }
6786
6787       s = "lwc1";
6788       fmt = "T,o(b)";
6789       goto ldd_std;
6790
6791     case M_S_DAB:
6792       if (mips_opts.arch == CPU_R4650)
6793         {
6794           as_bad (_("opcode not supported on this processor"));
6795           break;
6796         }
6797
6798       if (mips_opts.isa != ISA_MIPS1)
6799         {
6800           s = "sdc1";
6801           goto st;
6802         }
6803
6804       s = "swc1";
6805       fmt = "T,o(b)";
6806       /* Itbl support may require additional care here.  */
6807       coproc = 1;
6808       goto ldd_std;
6809
6810     case M_LD_AB:
6811       if (HAVE_64BIT_GPRS)
6812         {
6813           s = "ld";
6814           goto ld;
6815         }
6816
6817       s = "lw";
6818       fmt = "t,o(b)";
6819       goto ldd_std;
6820
6821     case M_SD_AB:
6822       if (HAVE_64BIT_GPRS)
6823         {
6824           s = "sd";
6825           goto st;
6826         }
6827
6828       s = "sw";
6829       fmt = "t,o(b)";
6830
6831     ldd_std:
6832       if (offset_expr.X_op != O_symbol
6833           && offset_expr.X_op != O_constant)
6834         {
6835           as_bad (_("expression too complex"));
6836           offset_expr.X_op = O_constant;
6837         }
6838
6839       if (HAVE_32BIT_ADDRESSES
6840           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6841         {
6842           char value [32];
6843
6844           sprintf_vma (value, offset_expr.X_add_number);
6845           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6846         }
6847
6848       /* Even on a big endian machine $fn comes before $fn+1.  We have
6849          to adjust when loading from memory.  We set coproc if we must
6850          load $fn+1 first.  */
6851       /* Itbl support may require additional care here.  */
6852       if (! target_big_endian)
6853         coproc = 0;
6854
6855       if (mips_pic == NO_PIC
6856           || offset_expr.X_op == O_constant)
6857         {
6858           /* If this is a reference to a GP relative symbol, we want
6859                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6860                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6861              If we have a base register, we use this
6862                addu     $at,$breg,$gp
6863                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6864                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6865              If this is not a GP relative symbol, we want
6866                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6867                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6868                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6869              If there is a base register, we add it to $at after the
6870              lui instruction.  If there is a constant, we always use
6871              the last case.  */
6872           if (offset_expr.X_op == O_symbol
6873               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6874               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6875             {
6876               relax_start (offset_expr.X_add_symbol);
6877               if (breg == 0)
6878                 {
6879                   tempreg = mips_gp_register;
6880                 }
6881               else
6882                 {
6883                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6884                                AT, breg, mips_gp_register);
6885                   tempreg = AT;
6886                   used_at = 1;
6887                 }
6888
6889               /* Itbl support may require additional care here.  */
6890               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6891                            BFD_RELOC_GPREL16, tempreg);
6892               offset_expr.X_add_number += 4;
6893
6894               /* Set mips_optimize to 2 to avoid inserting an
6895                  undesired nop.  */
6896               hold_mips_optimize = mips_optimize;
6897               mips_optimize = 2;
6898               /* Itbl support may require additional care here.  */
6899               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6900                            BFD_RELOC_GPREL16, tempreg);
6901               mips_optimize = hold_mips_optimize;
6902
6903               relax_switch ();
6904
6905               /* We just generated two relocs.  When tc_gen_reloc
6906                  handles this case, it will skip the first reloc and
6907                  handle the second.  The second reloc already has an
6908                  extra addend of 4, which we added above.  We must
6909                  subtract it out, and then subtract another 4 to make
6910                  the first reloc come out right.  The second reloc
6911                  will come out right because we are going to add 4 to
6912                  offset_expr when we build its instruction below.
6913
6914                  If we have a symbol, then we don't want to include
6915                  the offset, because it will wind up being included
6916                  when we generate the reloc.  */
6917
6918               if (offset_expr.X_op == O_constant)
6919                 offset_expr.X_add_number -= 8;
6920               else
6921                 {
6922                   offset_expr.X_add_number = -4;
6923                   offset_expr.X_op = O_constant;
6924                 }
6925             }
6926           used_at = 1;
6927           macro_build_lui (&offset_expr, AT);
6928           if (breg != 0)
6929             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6930           /* Itbl support may require additional care here.  */
6931           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6932                        BFD_RELOC_LO16, AT);
6933           /* FIXME: How do we handle overflow here?  */
6934           offset_expr.X_add_number += 4;
6935           /* Itbl support may require additional care here.  */
6936           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6937                        BFD_RELOC_LO16, AT);
6938           if (mips_relax.sequence)
6939             relax_end ();
6940         }
6941       else if (!mips_big_got)
6942         {
6943           /* If this is a reference to an external symbol, we want
6944                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6945                nop
6946                <op>     $treg,0($at)
6947                <op>     $treg+1,4($at)
6948              Otherwise we want
6949                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6950                nop
6951                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6952                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6953              If there is a base register we add it to $at before the
6954              lwc1 instructions.  If there is a constant we include it
6955              in the lwc1 instructions.  */
6956           used_at = 1;
6957           expr1.X_add_number = offset_expr.X_add_number;
6958           if (expr1.X_add_number < -0x8000
6959               || expr1.X_add_number >= 0x8000 - 4)
6960             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6961           load_got_offset (AT, &offset_expr);
6962           load_delay_nop ();
6963           if (breg != 0)
6964             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6965
6966           /* Set mips_optimize to 2 to avoid inserting an undesired
6967              nop.  */
6968           hold_mips_optimize = mips_optimize;
6969           mips_optimize = 2;
6970
6971           /* Itbl support may require additional care here.  */
6972           relax_start (offset_expr.X_add_symbol);
6973           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6974                        BFD_RELOC_LO16, AT);
6975           expr1.X_add_number += 4;
6976           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6977                        BFD_RELOC_LO16, AT);
6978           relax_switch ();
6979           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6980                        BFD_RELOC_LO16, AT);
6981           offset_expr.X_add_number += 4;
6982           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6983                        BFD_RELOC_LO16, AT);
6984           relax_end ();
6985
6986           mips_optimize = hold_mips_optimize;
6987         }
6988       else if (mips_big_got)
6989         {
6990           int gpdelay;
6991
6992           /* If this is a reference to an external symbol, we want
6993                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
6994                addu     $at,$at,$gp
6995                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
6996                nop
6997                <op>     $treg,0($at)
6998                <op>     $treg+1,4($at)
6999              Otherwise we want
7000                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7001                nop
7002                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7003                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7004              If there is a base register we add it to $at before the
7005              lwc1 instructions.  If there is a constant we include it
7006              in the lwc1 instructions.  */
7007           used_at = 1;
7008           expr1.X_add_number = offset_expr.X_add_number;
7009           offset_expr.X_add_number = 0;
7010           if (expr1.X_add_number < -0x8000
7011               || expr1.X_add_number >= 0x8000 - 4)
7012             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7013           gpdelay = reg_needs_delay (mips_gp_register);
7014           relax_start (offset_expr.X_add_symbol);
7015           macro_build (&offset_expr, "lui", "t,u",
7016                        AT, BFD_RELOC_MIPS_GOT_HI16);
7017           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7018                        AT, AT, mips_gp_register);
7019           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7020                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7021           load_delay_nop ();
7022           if (breg != 0)
7023             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7024           /* Itbl support may require additional care here.  */
7025           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7026                        BFD_RELOC_LO16, AT);
7027           expr1.X_add_number += 4;
7028
7029           /* Set mips_optimize to 2 to avoid inserting an undesired
7030              nop.  */
7031           hold_mips_optimize = mips_optimize;
7032           mips_optimize = 2;
7033           /* Itbl support may require additional care here.  */
7034           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7035                        BFD_RELOC_LO16, AT);
7036           mips_optimize = hold_mips_optimize;
7037           expr1.X_add_number -= 4;
7038
7039           relax_switch ();
7040           offset_expr.X_add_number = expr1.X_add_number;
7041           if (gpdelay)
7042             macro_build (NULL, "nop", "");
7043           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7044                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7045           load_delay_nop ();
7046           if (breg != 0)
7047             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7048           /* Itbl support may require additional care here.  */
7049           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7050                        BFD_RELOC_LO16, AT);
7051           offset_expr.X_add_number += 4;
7052
7053           /* Set mips_optimize to 2 to avoid inserting an undesired
7054              nop.  */
7055           hold_mips_optimize = mips_optimize;
7056           mips_optimize = 2;
7057           /* Itbl support may require additional care here.  */
7058           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7059                        BFD_RELOC_LO16, AT);
7060           mips_optimize = hold_mips_optimize;
7061           relax_end ();
7062         }
7063       else
7064         abort ();
7065
7066       break;
7067
7068     case M_LD_OB:
7069       s = "lw";
7070       goto sd_ob;
7071     case M_SD_OB:
7072       s = "sw";
7073     sd_ob:
7074       assert (HAVE_32BIT_ADDRESSES);
7075       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7076       offset_expr.X_add_number += 4;
7077       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7078       break;
7079
7080    /* New code added to support COPZ instructions.
7081       This code builds table entries out of the macros in mip_opcodes.
7082       R4000 uses interlocks to handle coproc delays.
7083       Other chips (like the R3000) require nops to be inserted for delays.
7084
7085       FIXME: Currently, we require that the user handle delays.
7086       In order to fill delay slots for non-interlocked chips,
7087       we must have a way to specify delays based on the coprocessor.
7088       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7089       What are the side-effects of the cop instruction?
7090       What cache support might we have and what are its effects?
7091       Both coprocessor & memory require delays. how long???
7092       What registers are read/set/modified?
7093
7094       If an itbl is provided to interpret cop instructions,
7095       this knowledge can be encoded in the itbl spec.  */
7096
7097     case M_COP0:
7098       s = "c0";
7099       goto copz;
7100     case M_COP1:
7101       s = "c1";
7102       goto copz;
7103     case M_COP2:
7104       s = "c2";
7105       goto copz;
7106     case M_COP3:
7107       s = "c3";
7108     copz:
7109       /* For now we just do C (same as Cz).  The parameter will be
7110          stored in insn_opcode by mips_ip.  */
7111       macro_build (NULL, s, "C", ip->insn_opcode);
7112       break;
7113
7114     case M_MOVE:
7115       move_register (dreg, sreg);
7116       break;
7117
7118 #ifdef LOSING_COMPILER
7119     default:
7120       /* Try and see if this is a new itbl instruction.
7121          This code builds table entries out of the macros in mip_opcodes.
7122          FIXME: For now we just assemble the expression and pass it's
7123          value along as a 32-bit immediate.
7124          We may want to have the assembler assemble this value,
7125          so that we gain the assembler's knowledge of delay slots,
7126          symbols, etc.
7127          Would it be more efficient to use mask (id) here? */
7128       if (itbl_have_entries
7129           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7130         {
7131           s = ip->insn_mo->name;
7132           s2 = "cop3";
7133           coproc = ITBL_DECODE_PNUM (immed_expr);;
7134           macro_build (&immed_expr, s, "C");
7135           break;
7136         }
7137       macro2 (ip);
7138       break;
7139     }
7140   if (mips_opts.noat && used_at)
7141     as_bad (_("Macro used $at after \".set noat\""));
7142 }
7143
7144 static void
7145 macro2 (struct mips_cl_insn *ip)
7146 {
7147   int treg, sreg, dreg, breg;
7148   int tempreg;
7149   int mask;
7150   int used_at;
7151   expressionS expr1;
7152   const char *s;
7153   const char *s2;
7154   const char *fmt;
7155   int likely = 0;
7156   int dbl = 0;
7157   int coproc = 0;
7158   int lr = 0;
7159   int imm = 0;
7160   int off;
7161   offsetT maxnum;
7162   bfd_reloc_code_real_type r;
7163
7164   treg = (ip->insn_opcode >> 16) & 0x1f;
7165   dreg = (ip->insn_opcode >> 11) & 0x1f;
7166   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7167   mask = ip->insn_mo->mask;
7168
7169   expr1.X_op = O_constant;
7170   expr1.X_op_symbol = NULL;
7171   expr1.X_add_symbol = NULL;
7172   expr1.X_add_number = 1;
7173
7174   switch (mask)
7175     {
7176 #endif /* LOSING_COMPILER */
7177
7178     case M_DMUL:
7179       dbl = 1;
7180     case M_MUL:
7181       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7182       macro_build (NULL, "mflo", "d", dreg);
7183       break;
7184
7185     case M_DMUL_I:
7186       dbl = 1;
7187     case M_MUL_I:
7188       /* The MIPS assembler some times generates shifts and adds.  I'm
7189          not trying to be that fancy. GCC should do this for us
7190          anyway.  */
7191       used_at = 1;
7192       load_register (AT, &imm_expr, dbl);
7193       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7194       macro_build (NULL, "mflo", "d", dreg);
7195       break;
7196
7197     case M_DMULO_I:
7198       dbl = 1;
7199     case M_MULO_I:
7200       imm = 1;
7201       goto do_mulo;
7202
7203     case M_DMULO:
7204       dbl = 1;
7205     case M_MULO:
7206     do_mulo:
7207       start_noreorder ();
7208       used_at = 1;
7209       if (imm)
7210         load_register (AT, &imm_expr, dbl);
7211       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7212       macro_build (NULL, "mflo", "d", dreg);
7213       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7214       macro_build (NULL, "mfhi", "d", AT);
7215       if (mips_trap)
7216         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7217       else
7218         {
7219           expr1.X_add_number = 8;
7220           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7221           macro_build (NULL, "nop", "", 0);
7222           macro_build (NULL, "break", "c", 6);
7223         }
7224       end_noreorder ();
7225       macro_build (NULL, "mflo", "d", dreg);
7226       break;
7227
7228     case M_DMULOU_I:
7229       dbl = 1;
7230     case M_MULOU_I:
7231       imm = 1;
7232       goto do_mulou;
7233
7234     case M_DMULOU:
7235       dbl = 1;
7236     case M_MULOU:
7237     do_mulou:
7238       start_noreorder ();
7239       used_at = 1;
7240       if (imm)
7241         load_register (AT, &imm_expr, dbl);
7242       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7243                    sreg, imm ? AT : treg);
7244       macro_build (NULL, "mfhi", "d", AT);
7245       macro_build (NULL, "mflo", "d", dreg);
7246       if (mips_trap)
7247         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7248       else
7249         {
7250           expr1.X_add_number = 8;
7251           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7252           macro_build (NULL, "nop", "", 0);
7253           macro_build (NULL, "break", "c", 6);
7254         }
7255       end_noreorder ();
7256       break;
7257
7258     case M_DROL:
7259       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7260         {
7261           if (dreg == sreg)
7262             {
7263               tempreg = AT;
7264               used_at = 1;
7265             }
7266           else
7267             {
7268               tempreg = dreg;
7269             }
7270           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7271           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7272           break;
7273         }
7274       used_at = 1;
7275       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7276       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7277       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7278       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7279       break;
7280
7281     case M_ROL:
7282       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7283         {
7284           if (dreg == sreg)
7285             {
7286               tempreg = AT;
7287               used_at = 1;
7288             }
7289           else
7290             {
7291               tempreg = dreg;
7292             }
7293           macro_build (NULL, "negu", "d,w", tempreg, treg);
7294           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7295           break;
7296         }
7297       used_at = 1;
7298       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7299       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7300       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7301       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7302       break;
7303
7304     case M_DROL_I:
7305       {
7306         unsigned int rot;
7307         char *l, *r;
7308
7309         if (imm_expr.X_op != O_constant)
7310           as_bad (_("Improper rotate count"));
7311         rot = imm_expr.X_add_number & 0x3f;
7312         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7313           {
7314             rot = (64 - rot) & 0x3f;
7315             if (rot >= 32)
7316               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7317             else
7318               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7319             break;
7320           }
7321         if (rot == 0)
7322           {
7323             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7324             break;
7325           }
7326         l = (rot < 0x20) ? "dsll" : "dsll32";
7327         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7328         rot &= 0x1f;
7329         used_at = 1;
7330         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7331         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7332         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7333       }
7334       break;
7335
7336     case M_ROL_I:
7337       {
7338         unsigned int rot;
7339
7340         if (imm_expr.X_op != O_constant)
7341           as_bad (_("Improper rotate count"));
7342         rot = imm_expr.X_add_number & 0x1f;
7343         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7344           {
7345             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7346             break;
7347           }
7348         if (rot == 0)
7349           {
7350             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7351             break;
7352           }
7353         used_at = 1;
7354         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7355         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7356         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7357       }
7358       break;
7359
7360     case M_DROR:
7361       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7362         {
7363           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7364           break;
7365         }
7366       used_at = 1;
7367       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7368       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7369       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7370       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7371       break;
7372
7373     case M_ROR:
7374       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7375         {
7376           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7377           break;
7378         }
7379       used_at = 1;
7380       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7381       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7382       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7383       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7384       break;
7385
7386     case M_DROR_I:
7387       {
7388         unsigned int rot;
7389         char *l, *r;
7390
7391         if (imm_expr.X_op != O_constant)
7392           as_bad (_("Improper rotate count"));
7393         rot = imm_expr.X_add_number & 0x3f;
7394         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7395           {
7396             if (rot >= 32)
7397               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7398             else
7399               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7400             break;
7401           }
7402         if (rot == 0)
7403           {
7404             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7405             break;
7406           }
7407         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7408         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7409         rot &= 0x1f;
7410         used_at = 1;
7411         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7412         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7413         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7414       }
7415       break;
7416
7417     case M_ROR_I:
7418       {
7419         unsigned int rot;
7420
7421         if (imm_expr.X_op != O_constant)
7422           as_bad (_("Improper rotate count"));
7423         rot = imm_expr.X_add_number & 0x1f;
7424         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7425           {
7426             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7427             break;
7428           }
7429         if (rot == 0)
7430           {
7431             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7432             break;
7433           }
7434         used_at = 1;
7435         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7436         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7437         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7438       }
7439       break;
7440
7441     case M_S_DOB:
7442       if (mips_opts.arch == CPU_R4650)
7443         {
7444           as_bad (_("opcode not supported on this processor"));
7445           break;
7446         }
7447       assert (mips_opts.isa == ISA_MIPS1);
7448       /* Even on a big endian machine $fn comes before $fn+1.  We have
7449          to adjust when storing to memory.  */
7450       macro_build (&offset_expr, "swc1", "T,o(b)",
7451                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7452       offset_expr.X_add_number += 4;
7453       macro_build (&offset_expr, "swc1", "T,o(b)",
7454                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7455       break;
7456
7457     case M_SEQ:
7458       if (sreg == 0)
7459         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7460       else if (treg == 0)
7461         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7462       else
7463         {
7464           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7465           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7466         }
7467       break;
7468
7469     case M_SEQ_I:
7470       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7471         {
7472           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7473           break;
7474         }
7475       if (sreg == 0)
7476         {
7477           as_warn (_("Instruction %s: result is always false"),
7478                    ip->insn_mo->name);
7479           move_register (dreg, 0);
7480           break;
7481         }
7482       if (imm_expr.X_op == O_constant
7483           && imm_expr.X_add_number >= 0
7484           && imm_expr.X_add_number < 0x10000)
7485         {
7486           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7487         }
7488       else if (imm_expr.X_op == O_constant
7489                && imm_expr.X_add_number > -0x8000
7490                && imm_expr.X_add_number < 0)
7491         {
7492           imm_expr.X_add_number = -imm_expr.X_add_number;
7493           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7494                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7495         }
7496       else
7497         {
7498           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7499           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7500           used_at = 1;
7501         }
7502       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7503       break;
7504
7505     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7506       s = "slt";
7507       goto sge;
7508     case M_SGEU:
7509       s = "sltu";
7510     sge:
7511       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7512       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7513       break;
7514
7515     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7516     case M_SGEU_I:
7517       if (imm_expr.X_op == O_constant
7518           && imm_expr.X_add_number >= -0x8000
7519           && imm_expr.X_add_number < 0x8000)
7520         {
7521           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7522                        dreg, sreg, BFD_RELOC_LO16);
7523         }
7524       else
7525         {
7526           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7527           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7528                        dreg, sreg, AT);
7529           used_at = 1;
7530         }
7531       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7532       break;
7533
7534     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7535       s = "slt";
7536       goto sgt;
7537     case M_SGTU:
7538       s = "sltu";
7539     sgt:
7540       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7541       break;
7542
7543     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7544       s = "slt";
7545       goto sgti;
7546     case M_SGTU_I:
7547       s = "sltu";
7548     sgti:
7549       used_at = 1;
7550       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7551       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7552       break;
7553
7554     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7555       s = "slt";
7556       goto sle;
7557     case M_SLEU:
7558       s = "sltu";
7559     sle:
7560       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7561       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7562       break;
7563
7564     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7565       s = "slt";
7566       goto slei;
7567     case M_SLEU_I:
7568       s = "sltu";
7569     slei:
7570       used_at = 1;
7571       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7572       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7573       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7574       break;
7575
7576     case M_SLT_I:
7577       if (imm_expr.X_op == O_constant
7578           && imm_expr.X_add_number >= -0x8000
7579           && imm_expr.X_add_number < 0x8000)
7580         {
7581           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7582           break;
7583         }
7584       used_at = 1;
7585       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7586       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7587       break;
7588
7589     case M_SLTU_I:
7590       if (imm_expr.X_op == O_constant
7591           && imm_expr.X_add_number >= -0x8000
7592           && imm_expr.X_add_number < 0x8000)
7593         {
7594           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7595                        BFD_RELOC_LO16);
7596           break;
7597         }
7598       used_at = 1;
7599       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7600       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7601       break;
7602
7603     case M_SNE:
7604       if (sreg == 0)
7605         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7606       else if (treg == 0)
7607         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7608       else
7609         {
7610           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7611           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7612         }
7613       break;
7614
7615     case M_SNE_I:
7616       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7617         {
7618           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7619           break;
7620         }
7621       if (sreg == 0)
7622         {
7623           as_warn (_("Instruction %s: result is always true"),
7624                    ip->insn_mo->name);
7625           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7626                        dreg, 0, BFD_RELOC_LO16);
7627           break;
7628         }
7629       if (imm_expr.X_op == O_constant
7630           && imm_expr.X_add_number >= 0
7631           && imm_expr.X_add_number < 0x10000)
7632         {
7633           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7634         }
7635       else if (imm_expr.X_op == O_constant
7636                && imm_expr.X_add_number > -0x8000
7637                && imm_expr.X_add_number < 0)
7638         {
7639           imm_expr.X_add_number = -imm_expr.X_add_number;
7640           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7641                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7642         }
7643       else
7644         {
7645           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7646           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7647           used_at = 1;
7648         }
7649       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7650       break;
7651
7652     case M_DSUB_I:
7653       dbl = 1;
7654     case M_SUB_I:
7655       if (imm_expr.X_op == O_constant
7656           && imm_expr.X_add_number > -0x8000
7657           && imm_expr.X_add_number <= 0x8000)
7658         {
7659           imm_expr.X_add_number = -imm_expr.X_add_number;
7660           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7661                        dreg, sreg, BFD_RELOC_LO16);
7662           break;
7663         }
7664       used_at = 1;
7665       load_register (AT, &imm_expr, dbl);
7666       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7667       break;
7668
7669     case M_DSUBU_I:
7670       dbl = 1;
7671     case M_SUBU_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 ? "daddiu" : "addiu", "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 ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7684       break;
7685
7686     case M_TEQ_I:
7687       s = "teq";
7688       goto trap;
7689     case M_TGE_I:
7690       s = "tge";
7691       goto trap;
7692     case M_TGEU_I:
7693       s = "tgeu";
7694       goto trap;
7695     case M_TLT_I:
7696       s = "tlt";
7697       goto trap;
7698     case M_TLTU_I:
7699       s = "tltu";
7700       goto trap;
7701     case M_TNE_I:
7702       s = "tne";
7703     trap:
7704       used_at = 1;
7705       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7706       macro_build (NULL, s, "s,t", sreg, AT);
7707       break;
7708
7709     case M_TRUNCWS:
7710     case M_TRUNCWD:
7711       assert (mips_opts.isa == ISA_MIPS1);
7712       used_at = 1;
7713       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7714       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7715
7716       /*
7717        * Is the double cfc1 instruction a bug in the mips assembler;
7718        * or is there a reason for it?
7719        */
7720       start_noreorder ();
7721       macro_build (NULL, "cfc1", "t,G", treg, RA);
7722       macro_build (NULL, "cfc1", "t,G", treg, RA);
7723       macro_build (NULL, "nop", "");
7724       expr1.X_add_number = 3;
7725       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7726       expr1.X_add_number = 2;
7727       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7728       macro_build (NULL, "ctc1", "t,G", AT, RA);
7729       macro_build (NULL, "nop", "");
7730       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7731                    dreg, sreg);
7732       macro_build (NULL, "ctc1", "t,G", treg, RA);
7733       macro_build (NULL, "nop", "");
7734       end_noreorder ();
7735       break;
7736
7737     case M_ULH:
7738       s = "lb";
7739       goto ulh;
7740     case M_ULHU:
7741       s = "lbu";
7742     ulh:
7743       used_at = 1;
7744       if (offset_expr.X_add_number >= 0x7fff)
7745         as_bad (_("operand overflow"));
7746       if (! target_big_endian)
7747         ++offset_expr.X_add_number;
7748       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7749       if (! target_big_endian)
7750         --offset_expr.X_add_number;
7751       else
7752         ++offset_expr.X_add_number;
7753       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7754       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7755       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7756       break;
7757
7758     case M_ULD:
7759       s = "ldl";
7760       s2 = "ldr";
7761       off = 7;
7762       goto ulw;
7763     case M_ULW:
7764       s = "lwl";
7765       s2 = "lwr";
7766       off = 3;
7767     ulw:
7768       if (offset_expr.X_add_number >= 0x8000 - off)
7769         as_bad (_("operand overflow"));
7770       if (treg != breg)
7771         tempreg = treg;
7772       else
7773         {
7774           used_at = 1;
7775           tempreg = AT;
7776         }
7777       if (! target_big_endian)
7778         offset_expr.X_add_number += off;
7779       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7780       if (! target_big_endian)
7781         offset_expr.X_add_number -= off;
7782       else
7783         offset_expr.X_add_number += off;
7784       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7785
7786       /* If necessary, move the result in tempreg the final destination.  */
7787       if (treg == tempreg)
7788         break;
7789       /* Protect second load's delay slot.  */
7790       load_delay_nop ();
7791       move_register (treg, tempreg);
7792       break;
7793
7794     case M_ULD_A:
7795       s = "ldl";
7796       s2 = "ldr";
7797       off = 7;
7798       goto ulwa;
7799     case M_ULW_A:
7800       s = "lwl";
7801       s2 = "lwr";
7802       off = 3;
7803     ulwa:
7804       used_at = 1;
7805       load_address (AT, &offset_expr, &used_at);
7806       if (breg != 0)
7807         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7808       if (! target_big_endian)
7809         expr1.X_add_number = off;
7810       else
7811         expr1.X_add_number = 0;
7812       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7813       if (! target_big_endian)
7814         expr1.X_add_number = 0;
7815       else
7816         expr1.X_add_number = off;
7817       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7818       break;
7819
7820     case M_ULH_A:
7821     case M_ULHU_A:
7822       used_at = 1;
7823       load_address (AT, &offset_expr, &used_at);
7824       if (breg != 0)
7825         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7826       if (target_big_endian)
7827         expr1.X_add_number = 0;
7828       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7829                    treg, BFD_RELOC_LO16, AT);
7830       if (target_big_endian)
7831         expr1.X_add_number = 1;
7832       else
7833         expr1.X_add_number = 0;
7834       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7835       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7836       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7837       break;
7838
7839     case M_USH:
7840       used_at = 1;
7841       if (offset_expr.X_add_number >= 0x7fff)
7842         as_bad (_("operand overflow"));
7843       if (target_big_endian)
7844         ++offset_expr.X_add_number;
7845       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7846       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7847       if (target_big_endian)
7848         --offset_expr.X_add_number;
7849       else
7850         ++offset_expr.X_add_number;
7851       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7852       break;
7853
7854     case M_USD:
7855       s = "sdl";
7856       s2 = "sdr";
7857       off = 7;
7858       goto usw;
7859     case M_USW:
7860       s = "swl";
7861       s2 = "swr";
7862       off = 3;
7863     usw:
7864       if (offset_expr.X_add_number >= 0x8000 - off)
7865         as_bad (_("operand overflow"));
7866       if (! target_big_endian)
7867         offset_expr.X_add_number += off;
7868       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7869       if (! target_big_endian)
7870         offset_expr.X_add_number -= off;
7871       else
7872         offset_expr.X_add_number += off;
7873       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7874       break;
7875
7876     case M_USD_A:
7877       s = "sdl";
7878       s2 = "sdr";
7879       off = 7;
7880       goto uswa;
7881     case M_USW_A:
7882       s = "swl";
7883       s2 = "swr";
7884       off = 3;
7885     uswa:
7886       used_at = 1;
7887       load_address (AT, &offset_expr, &used_at);
7888       if (breg != 0)
7889         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7890       if (! target_big_endian)
7891         expr1.X_add_number = off;
7892       else
7893         expr1.X_add_number = 0;
7894       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7895       if (! target_big_endian)
7896         expr1.X_add_number = 0;
7897       else
7898         expr1.X_add_number = off;
7899       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7900       break;
7901
7902     case M_USH_A:
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 = 0;
7909       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7910       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7911       if (! target_big_endian)
7912         expr1.X_add_number = 1;
7913       else
7914         expr1.X_add_number = 0;
7915       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7916       if (! target_big_endian)
7917         expr1.X_add_number = 0;
7918       else
7919         expr1.X_add_number = 1;
7920       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7921       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7922       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7923       break;
7924
7925     default:
7926       /* FIXME: Check if this is one of the itbl macros, since they
7927          are added dynamically.  */
7928       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7929       break;
7930     }
7931   if (mips_opts.noat && used_at)
7932     as_bad (_("Macro used $at after \".set noat\""));
7933 }
7934
7935 /* Implement macros in mips16 mode.  */
7936
7937 static void
7938 mips16_macro (struct mips_cl_insn *ip)
7939 {
7940   int mask;
7941   int xreg, yreg, zreg, tmp;
7942   expressionS expr1;
7943   int dbl;
7944   const char *s, *s2, *s3;
7945
7946   mask = ip->insn_mo->mask;
7947
7948   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
7949   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
7950   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
7951
7952   expr1.X_op = O_constant;
7953   expr1.X_op_symbol = NULL;
7954   expr1.X_add_symbol = NULL;
7955   expr1.X_add_number = 1;
7956
7957   dbl = 0;
7958
7959   switch (mask)
7960     {
7961     default:
7962       internalError ();
7963
7964     case M_DDIV_3:
7965       dbl = 1;
7966     case M_DIV_3:
7967       s = "mflo";
7968       goto do_div3;
7969     case M_DREM_3:
7970       dbl = 1;
7971     case M_REM_3:
7972       s = "mfhi";
7973     do_div3:
7974       start_noreorder ();
7975       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7976       expr1.X_add_number = 2;
7977       macro_build (&expr1, "bnez", "x,p", yreg);
7978       macro_build (NULL, "break", "6", 7);
7979
7980       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7981          since that causes an overflow.  We should do that as well,
7982          but I don't see how to do the comparisons without a temporary
7983          register.  */
7984       end_noreorder ();
7985       macro_build (NULL, s, "x", zreg);
7986       break;
7987
7988     case M_DIVU_3:
7989       s = "divu";
7990       s2 = "mflo";
7991       goto do_divu3;
7992     case M_REMU_3:
7993       s = "divu";
7994       s2 = "mfhi";
7995       goto do_divu3;
7996     case M_DDIVU_3:
7997       s = "ddivu";
7998       s2 = "mflo";
7999       goto do_divu3;
8000     case M_DREMU_3:
8001       s = "ddivu";
8002       s2 = "mfhi";
8003     do_divu3:
8004       start_noreorder ();
8005       macro_build (NULL, s, "0,x,y", xreg, yreg);
8006       expr1.X_add_number = 2;
8007       macro_build (&expr1, "bnez", "x,p", yreg);
8008       macro_build (NULL, "break", "6", 7);
8009       end_noreorder ();
8010       macro_build (NULL, s2, "x", zreg);
8011       break;
8012
8013     case M_DMUL:
8014       dbl = 1;
8015     case M_MUL:
8016       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8017       macro_build (NULL, "mflo", "x", zreg);
8018       break;
8019
8020     case M_DSUBU_I:
8021       dbl = 1;
8022       goto do_subu;
8023     case M_SUBU_I:
8024     do_subu:
8025       if (imm_expr.X_op != O_constant)
8026         as_bad (_("Unsupported large constant"));
8027       imm_expr.X_add_number = -imm_expr.X_add_number;
8028       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8029       break;
8030
8031     case M_SUBU_I_2:
8032       if (imm_expr.X_op != O_constant)
8033         as_bad (_("Unsupported large constant"));
8034       imm_expr.X_add_number = -imm_expr.X_add_number;
8035       macro_build (&imm_expr, "addiu", "x,k", xreg);
8036       break;
8037
8038     case M_DSUBU_I_2:
8039       if (imm_expr.X_op != O_constant)
8040         as_bad (_("Unsupported large constant"));
8041       imm_expr.X_add_number = -imm_expr.X_add_number;
8042       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8043       break;
8044
8045     case M_BEQ:
8046       s = "cmp";
8047       s2 = "bteqz";
8048       goto do_branch;
8049     case M_BNE:
8050       s = "cmp";
8051       s2 = "btnez";
8052       goto do_branch;
8053     case M_BLT:
8054       s = "slt";
8055       s2 = "btnez";
8056       goto do_branch;
8057     case M_BLTU:
8058       s = "sltu";
8059       s2 = "btnez";
8060       goto do_branch;
8061     case M_BLE:
8062       s = "slt";
8063       s2 = "bteqz";
8064       goto do_reverse_branch;
8065     case M_BLEU:
8066       s = "sltu";
8067       s2 = "bteqz";
8068       goto do_reverse_branch;
8069     case M_BGE:
8070       s = "slt";
8071       s2 = "bteqz";
8072       goto do_branch;
8073     case M_BGEU:
8074       s = "sltu";
8075       s2 = "bteqz";
8076       goto do_branch;
8077     case M_BGT:
8078       s = "slt";
8079       s2 = "btnez";
8080       goto do_reverse_branch;
8081     case M_BGTU:
8082       s = "sltu";
8083       s2 = "btnez";
8084
8085     do_reverse_branch:
8086       tmp = xreg;
8087       xreg = yreg;
8088       yreg = tmp;
8089
8090     do_branch:
8091       macro_build (NULL, s, "x,y", xreg, yreg);
8092       macro_build (&offset_expr, s2, "p");
8093       break;
8094
8095     case M_BEQ_I:
8096       s = "cmpi";
8097       s2 = "bteqz";
8098       s3 = "x,U";
8099       goto do_branch_i;
8100     case M_BNE_I:
8101       s = "cmpi";
8102       s2 = "btnez";
8103       s3 = "x,U";
8104       goto do_branch_i;
8105     case M_BLT_I:
8106       s = "slti";
8107       s2 = "btnez";
8108       s3 = "x,8";
8109       goto do_branch_i;
8110     case M_BLTU_I:
8111       s = "sltiu";
8112       s2 = "btnez";
8113       s3 = "x,8";
8114       goto do_branch_i;
8115     case M_BLE_I:
8116       s = "slti";
8117       s2 = "btnez";
8118       s3 = "x,8";
8119       goto do_addone_branch_i;
8120     case M_BLEU_I:
8121       s = "sltiu";
8122       s2 = "btnez";
8123       s3 = "x,8";
8124       goto do_addone_branch_i;
8125     case M_BGE_I:
8126       s = "slti";
8127       s2 = "bteqz";
8128       s3 = "x,8";
8129       goto do_branch_i;
8130     case M_BGEU_I:
8131       s = "sltiu";
8132       s2 = "bteqz";
8133       s3 = "x,8";
8134       goto do_branch_i;
8135     case M_BGT_I:
8136       s = "slti";
8137       s2 = "bteqz";
8138       s3 = "x,8";
8139       goto do_addone_branch_i;
8140     case M_BGTU_I:
8141       s = "sltiu";
8142       s2 = "bteqz";
8143       s3 = "x,8";
8144
8145     do_addone_branch_i:
8146       if (imm_expr.X_op != O_constant)
8147         as_bad (_("Unsupported large constant"));
8148       ++imm_expr.X_add_number;
8149
8150     do_branch_i:
8151       macro_build (&imm_expr, s, s3, xreg);
8152       macro_build (&offset_expr, s2, "p");
8153       break;
8154
8155     case M_ABS:
8156       expr1.X_add_number = 0;
8157       macro_build (&expr1, "slti", "x,8", yreg);
8158       if (xreg != yreg)
8159         move_register (xreg, yreg);
8160       expr1.X_add_number = 2;
8161       macro_build (&expr1, "bteqz", "p");
8162       macro_build (NULL, "neg", "x,w", xreg, xreg);
8163     }
8164 }
8165
8166 /* For consistency checking, verify that all bits are specified either
8167    by the match/mask part of the instruction definition, or by the
8168    operand list.  */
8169 static int
8170 validate_mips_insn (const struct mips_opcode *opc)
8171 {
8172   const char *p = opc->args;
8173   char c;
8174   unsigned long used_bits = opc->mask;
8175
8176   if ((used_bits & opc->match) != opc->match)
8177     {
8178       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8179               opc->name, opc->args);
8180       return 0;
8181     }
8182 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8183   while (*p)
8184     switch (c = *p++)
8185       {
8186       case ',': break;
8187       case '(': break;
8188       case ')': break;
8189       case '+':
8190         switch (c = *p++)
8191           {
8192           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8193           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8194           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8195           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8196           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8197           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8198           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8199           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8200                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8201           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8202           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8203           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8204           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8205           case 'I': break;
8206           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8207           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8208                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8209           default:
8210             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8211                     c, opc->name, opc->args);
8212             return 0;
8213           }
8214         break;
8215       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8216       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8217       case 'A': break;
8218       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8219       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8220       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8221       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8222       case 'F': break;
8223       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8224       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8225       case 'I': break;
8226       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8227       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8228       case 'L': break;
8229       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8230       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8231       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8232       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8233                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8234       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8235       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8236       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8237       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8238       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8239       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8240       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8241       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8242       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8243       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8244       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8245       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8246       case 'f': break;
8247       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8248       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8249       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8250       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8251       case 'l': break;
8252       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8253       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8254       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8255       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8256       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8257       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8258       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8259       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8260       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8261       case 'x': break;
8262       case 'z': break;
8263       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8264       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8265                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8266       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8267       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8268       case '[': break;
8269       case ']': break;
8270       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8271       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8272       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8273       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8274       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8275       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8276       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8277       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8278       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8279       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8280       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8281       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8282       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8283       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8284       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8285       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8286       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8287       default:
8288         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8289                 c, opc->name, opc->args);
8290         return 0;
8291       }
8292 #undef USE_BITS
8293   if (used_bits != 0xffffffff)
8294     {
8295       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8296               ~used_bits & 0xffffffff, opc->name, opc->args);
8297       return 0;
8298     }
8299   return 1;
8300 }
8301
8302 /* UDI immediates.  */
8303 struct mips_immed {
8304   char          type;
8305   unsigned int  shift;
8306   unsigned long mask;
8307   const char *  desc;
8308 };
8309
8310 static const struct mips_immed mips_immed[] = {
8311   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8312   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8313   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8314   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8315   { 0,0,0,0 }
8316 };
8317
8318 /* Check whether an odd floating-point register is allowed.  */
8319 static int
8320 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8321 {
8322   const char *s = insn->name;
8323
8324   if (insn->pinfo == INSN_MACRO)
8325     /* Let a macro pass, we'll catch it later when it is expanded.  */
8326     return 1;
8327
8328   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8329     {
8330       /* Allow odd registers for single-precision ops.  */
8331       switch (insn->pinfo & (FP_S | FP_D))
8332         {
8333         case FP_S:
8334         case 0:
8335           return 1;     /* both single precision - ok */
8336         case FP_D:
8337           return 0;     /* both double precision - fail */
8338         default:
8339           break;
8340         }
8341
8342       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8343       s = strchr (insn->name, '.');
8344       if (argnum == 2)
8345         s = s != NULL ? strchr (s + 1, '.') : NULL;
8346       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8347     } 
8348
8349   /* Single-precision coprocessor loads and moves are OK too.  */
8350   if ((insn->pinfo & FP_S)
8351       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8352                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8353     return 1;
8354
8355   return 0;
8356 }
8357
8358 /* This routine assembles an instruction into its binary format.  As a
8359    side effect, it sets one of the global variables imm_reloc or
8360    offset_reloc to the type of relocation to do if one of the operands
8361    is an address expression.  */
8362
8363 static void
8364 mips_ip (char *str, struct mips_cl_insn *ip)
8365 {
8366   char *s;
8367   const char *args;
8368   char c = 0;
8369   struct mips_opcode *insn;
8370   char *argsStart;
8371   unsigned int regno;
8372   unsigned int lastregno = 0;
8373   unsigned int lastpos = 0;
8374   unsigned int limlo, limhi;
8375   char *s_reset;
8376   char save_c = 0;
8377   offsetT min_range, max_range;
8378   int argnum;
8379   unsigned int rtype;
8380
8381   insn_error = NULL;
8382
8383   /* If the instruction contains a '.', we first try to match an instruction
8384      including the '.'.  Then we try again without the '.'.  */
8385   insn = NULL;
8386   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8387     continue;
8388
8389   /* If we stopped on whitespace, then replace the whitespace with null for
8390      the call to hash_find.  Save the character we replaced just in case we
8391      have to re-parse the instruction.  */
8392   if (ISSPACE (*s))
8393     {
8394       save_c = *s;
8395       *s++ = '\0';
8396     }
8397
8398   insn = (struct mips_opcode *) hash_find (op_hash, str);
8399
8400   /* If we didn't find the instruction in the opcode table, try again, but
8401      this time with just the instruction up to, but not including the
8402      first '.'.  */
8403   if (insn == NULL)
8404     {
8405       /* Restore the character we overwrite above (if any).  */
8406       if (save_c)
8407         *(--s) = save_c;
8408
8409       /* Scan up to the first '.' or whitespace.  */
8410       for (s = str;
8411            *s != '\0' && *s != '.' && !ISSPACE (*s);
8412            ++s)
8413         continue;
8414
8415       /* If we did not find a '.', then we can quit now.  */
8416       if (*s != '.')
8417         {
8418           insn_error = "unrecognized opcode";
8419           return;
8420         }
8421
8422       /* Lookup the instruction in the hash table.  */
8423       *s++ = '\0';
8424       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8425         {
8426           insn_error = "unrecognized opcode";
8427           return;
8428         }
8429     }
8430
8431   argsStart = s;
8432   for (;;)
8433     {
8434       bfd_boolean ok;
8435
8436       assert (strcmp (insn->name, str) == 0);
8437
8438       if (OPCODE_IS_MEMBER (insn,
8439                             (mips_opts.isa
8440                              /* We don't check for mips_opts.mips16 here since
8441                                 we want to allow jalx if -mips16 was specified
8442                                 on the command line.  */
8443                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8444                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8445                              | (mips_opts.ase_dsp ? INSN_DSP : 0)
8446                              | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
8447                                 ? INSN_DSP64 : 0)
8448                              | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
8449                              | (mips_opts.ase_mt ? INSN_MT : 0)
8450                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8451                              | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8452                             mips_opts.arch))
8453         ok = TRUE;
8454       else
8455         ok = FALSE;
8456
8457       if (insn->pinfo != INSN_MACRO)
8458         {
8459           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8460             ok = FALSE;
8461         }
8462
8463       if (! ok)
8464         {
8465           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8466               && strcmp (insn->name, insn[1].name) == 0)
8467             {
8468               ++insn;
8469               continue;
8470             }
8471           else
8472             {
8473               if (!insn_error)
8474                 {
8475                   static char buf[100];
8476                   sprintf (buf,
8477                            _("opcode not supported on this processor: %s (%s)"),
8478                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8479                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8480                   insn_error = buf;
8481                 }
8482               if (save_c)
8483                 *(--s) = save_c;
8484               return;
8485             }
8486         }
8487
8488       create_insn (ip, insn);
8489       insn_error = NULL;
8490       argnum = 1;
8491       for (args = insn->args;; ++args)
8492         {
8493           int is_mdmx;
8494
8495           s += strspn (s, " \t");
8496           is_mdmx = 0;
8497           switch (*args)
8498             {
8499             case '\0':          /* end of args */
8500               if (*s == '\0')
8501                 return;
8502               break;
8503
8504             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8505               my_getExpression (&imm_expr, s);
8506               check_absolute_expr (ip, &imm_expr);
8507               if ((unsigned long) imm_expr.X_add_number != 1
8508                   && (unsigned long) imm_expr.X_add_number != 3)
8509                 {
8510                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8511                           (unsigned long) imm_expr.X_add_number);
8512                 }
8513               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8514               imm_expr.X_op = O_absent;
8515               s = expr_end;
8516               continue;
8517
8518             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8519               my_getExpression (&imm_expr, s);
8520               check_absolute_expr (ip, &imm_expr);
8521               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8522                 {
8523                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8524                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8525                 }
8526               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8527               imm_expr.X_op = O_absent;
8528               s = expr_end;
8529               continue;
8530
8531             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8532               my_getExpression (&imm_expr, s);
8533               check_absolute_expr (ip, &imm_expr);
8534               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8535                 {
8536                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8537                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8538                 }
8539               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8540               imm_expr.X_op = O_absent;
8541               s = expr_end;
8542               continue;
8543
8544             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8545               my_getExpression (&imm_expr, s);
8546               check_absolute_expr (ip, &imm_expr);
8547               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8548                 {
8549                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8550                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8551                 }
8552               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8553               imm_expr.X_op = O_absent;
8554               s = expr_end;
8555               continue;
8556
8557             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8558               my_getExpression (&imm_expr, s);
8559               check_absolute_expr (ip, &imm_expr);
8560               if (imm_expr.X_add_number & ~OP_MASK_RS)
8561                 {
8562                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8563                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8564                 }
8565               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8566               imm_expr.X_op = O_absent;
8567               s = expr_end;
8568               continue;
8569
8570             case '7': /* four dsp accumulators in bits 11,12 */ 
8571               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8572                   s[3] >= '0' && s[3] <= '3')
8573                 {
8574                   regno = s[3] - '0';
8575                   s += 4;
8576                   INSERT_OPERAND (DSPACC, *ip, regno);
8577                   continue;
8578                 }
8579               else
8580                 as_bad (_("Invalid dsp acc register"));
8581               break;
8582
8583             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8584               my_getExpression (&imm_expr, s);
8585               check_absolute_expr (ip, &imm_expr);
8586               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8587                 {
8588                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8589                           OP_MASK_WRDSP,
8590                           (unsigned long) imm_expr.X_add_number);
8591                 }
8592               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8593               imm_expr.X_op = O_absent;
8594               s = expr_end;
8595               continue;
8596
8597             case '9': /* four dsp accumulators in bits 21,22 */
8598               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8599                   s[3] >= '0' && s[3] <= '3')
8600                 {
8601                   regno = s[3] - '0';
8602                   s += 4;
8603                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8604                   continue;
8605                 }
8606               else
8607                 as_bad (_("Invalid dsp acc register"));
8608               break;
8609
8610             case '0': /* dsp 6-bit signed immediate in bit 20 */
8611               my_getExpression (&imm_expr, s);
8612               check_absolute_expr (ip, &imm_expr);
8613               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8614               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8615               if (imm_expr.X_add_number < min_range ||
8616                   imm_expr.X_add_number > max_range)
8617                 {
8618                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8619                           (long) min_range, (long) max_range,
8620                           (long) imm_expr.X_add_number);
8621                 }
8622               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8623               imm_expr.X_op = O_absent;
8624               s = expr_end;
8625               continue;
8626
8627             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8628               my_getExpression (&imm_expr, s);
8629               check_absolute_expr (ip, &imm_expr);
8630               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8631                 {
8632                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8633                           OP_MASK_RDDSP,
8634                           (unsigned long) imm_expr.X_add_number);
8635                 }
8636               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8637               imm_expr.X_op = O_absent;
8638               s = expr_end;
8639               continue;
8640
8641             case ':': /* dsp 7-bit signed immediate in bit 19 */
8642               my_getExpression (&imm_expr, s);
8643               check_absolute_expr (ip, &imm_expr);
8644               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8645               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8646               if (imm_expr.X_add_number < min_range ||
8647                   imm_expr.X_add_number > max_range)
8648                 {
8649                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8650                           (long) min_range, (long) max_range,
8651                           (long) imm_expr.X_add_number);
8652                 }
8653               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8654               imm_expr.X_op = O_absent;
8655               s = expr_end;
8656               continue;
8657
8658             case '@': /* dsp 10-bit signed immediate in bit 16 */
8659               my_getExpression (&imm_expr, s);
8660               check_absolute_expr (ip, &imm_expr);
8661               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8662               max_range = ((OP_MASK_IMM10 + 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 (IMM10, *ip, imm_expr.X_add_number);
8671               imm_expr.X_op = O_absent;
8672               s = expr_end;
8673               continue;
8674
8675             case '!': /* MT usermode flag bit.  */
8676               my_getExpression (&imm_expr, s);
8677               check_absolute_expr (ip, &imm_expr);
8678               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8679                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8680                         (unsigned long) imm_expr.X_add_number);
8681               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8682               imm_expr.X_op = O_absent;
8683               s = expr_end;
8684               continue;
8685
8686             case '$': /* MT load high flag bit.  */
8687               my_getExpression (&imm_expr, s);
8688               check_absolute_expr (ip, &imm_expr);
8689               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8690                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8691                         (unsigned long) imm_expr.X_add_number);
8692               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8693               imm_expr.X_op = O_absent;
8694               s = expr_end;
8695               continue;
8696
8697             case '*': /* four dsp accumulators in bits 18,19 */ 
8698               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8699                   s[3] >= '0' && s[3] <= '3')
8700                 {
8701                   regno = s[3] - '0';
8702                   s += 4;
8703                   INSERT_OPERAND (MTACC_T, *ip, regno);
8704                   continue;
8705                 }
8706               else
8707                 as_bad (_("Invalid dsp/smartmips acc register"));
8708               break;
8709
8710             case '&': /* four dsp accumulators in bits 13,14 */ 
8711               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8712                   s[3] >= '0' && s[3] <= '3')
8713                 {
8714                   regno = s[3] - '0';
8715                   s += 4;
8716                   INSERT_OPERAND (MTACC_D, *ip, regno);
8717                   continue;
8718                 }
8719               else
8720                 as_bad (_("Invalid dsp/smartmips acc register"));
8721               break;
8722
8723             case ',':
8724               ++argnum;
8725               if (*s++ == *args)
8726                 continue;
8727               s--;
8728               switch (*++args)
8729                 {
8730                 case 'r':
8731                 case 'v':
8732                   INSERT_OPERAND (RS, *ip, lastregno);
8733                   continue;
8734
8735                 case 'w':
8736                   INSERT_OPERAND (RT, *ip, lastregno);
8737                   continue;
8738
8739                 case 'W':
8740                   INSERT_OPERAND (FT, *ip, lastregno);
8741                   continue;
8742
8743                 case 'V':
8744                   INSERT_OPERAND (FS, *ip, lastregno);
8745                   continue;
8746                 }
8747               break;
8748
8749             case '(':
8750               /* Handle optional base register.
8751                  Either the base register is omitted or
8752                  we must have a left paren.  */
8753               /* This is dependent on the next operand specifier
8754                  is a base register specification.  */
8755               assert (args[1] == 'b' || args[1] == '5'
8756                       || args[1] == '-' || args[1] == '4');
8757               if (*s == '\0')
8758                 return;
8759
8760             case ')':           /* these must match exactly */
8761             case '[':
8762             case ']':
8763               if (*s++ == *args)
8764                 continue;
8765               break;
8766
8767             case '+':           /* Opcode extension character.  */
8768               switch (*++args)
8769                 {
8770                 case '1':       /* UDI immediates.  */
8771                 case '2':
8772                 case '3':
8773                 case '4':
8774                   {
8775                     const struct mips_immed *imm = mips_immed;
8776
8777                     while (imm->type && imm->type != *args)
8778                       ++imm;
8779                     if (! imm->type)
8780                       internalError ();
8781                     my_getExpression (&imm_expr, s);
8782                     check_absolute_expr (ip, &imm_expr);
8783                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8784                       {
8785                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8786                                  imm->desc ? imm->desc : ip->insn_mo->name,
8787                                  (unsigned long) imm_expr.X_add_number,
8788                                  (unsigned long) imm_expr.X_add_number);
8789                               imm_expr.X_add_number &= imm->mask;
8790                       }
8791                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8792                                         << imm->shift);
8793                     imm_expr.X_op = O_absent;
8794                     s = expr_end;
8795                   }
8796                   continue;
8797                   
8798                 case 'A':               /* ins/ext position, becomes LSB.  */
8799                   limlo = 0;
8800                   limhi = 31;
8801                   goto do_lsb;
8802                 case 'E':
8803                   limlo = 32;
8804                   limhi = 63;
8805                   goto do_lsb;
8806 do_lsb:
8807                   my_getExpression (&imm_expr, s);
8808                   check_absolute_expr (ip, &imm_expr);
8809                   if ((unsigned long) imm_expr.X_add_number < limlo
8810                       || (unsigned long) imm_expr.X_add_number > limhi)
8811                     {
8812                       as_bad (_("Improper position (%lu)"),
8813                               (unsigned long) imm_expr.X_add_number);
8814                       imm_expr.X_add_number = limlo;
8815                     }
8816                   lastpos = imm_expr.X_add_number;
8817                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8818                   imm_expr.X_op = O_absent;
8819                   s = expr_end;
8820                   continue;
8821
8822                 case 'B':               /* ins size, becomes MSB.  */
8823                   limlo = 1;
8824                   limhi = 32;
8825                   goto do_msb;
8826                 case 'F':
8827                   limlo = 33;
8828                   limhi = 64;
8829                   goto do_msb;
8830 do_msb:
8831                   my_getExpression (&imm_expr, s);
8832                   check_absolute_expr (ip, &imm_expr);
8833                   /* Check for negative input so that small negative numbers
8834                      will not succeed incorrectly.  The checks against
8835                      (pos+size) transitively check "size" itself,
8836                      assuming that "pos" is reasonable.  */
8837                   if ((long) imm_expr.X_add_number < 0
8838                       || ((unsigned long) imm_expr.X_add_number
8839                           + lastpos) < limlo
8840                       || ((unsigned long) imm_expr.X_add_number
8841                           + lastpos) > limhi)
8842                     {
8843                       as_bad (_("Improper insert size (%lu, position %lu)"),
8844                               (unsigned long) imm_expr.X_add_number,
8845                               (unsigned long) lastpos);
8846                       imm_expr.X_add_number = limlo - lastpos;
8847                     }
8848                   INSERT_OPERAND (INSMSB, *ip,
8849                                  lastpos + imm_expr.X_add_number - 1);
8850                   imm_expr.X_op = O_absent;
8851                   s = expr_end;
8852                   continue;
8853
8854                 case 'C':               /* ext size, becomes MSBD.  */
8855                   limlo = 1;
8856                   limhi = 32;
8857                   goto do_msbd;
8858                 case 'G':
8859                   limlo = 33;
8860                   limhi = 64;
8861                   goto do_msbd;
8862                 case 'H':
8863                   limlo = 33;
8864                   limhi = 64;
8865                   goto do_msbd;
8866 do_msbd:
8867                   my_getExpression (&imm_expr, s);
8868                   check_absolute_expr (ip, &imm_expr);
8869                   /* Check for negative input so that small negative numbers
8870                      will not succeed incorrectly.  The checks against
8871                      (pos+size) transitively check "size" itself,
8872                      assuming that "pos" is reasonable.  */
8873                   if ((long) imm_expr.X_add_number < 0
8874                       || ((unsigned long) imm_expr.X_add_number
8875                           + lastpos) < limlo
8876                       || ((unsigned long) imm_expr.X_add_number
8877                           + lastpos) > limhi)
8878                     {
8879                       as_bad (_("Improper extract size (%lu, position %lu)"),
8880                               (unsigned long) imm_expr.X_add_number,
8881                               (unsigned long) lastpos);
8882                       imm_expr.X_add_number = limlo - lastpos;
8883                     }
8884                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
8885                   imm_expr.X_op = O_absent;
8886                   s = expr_end;
8887                   continue;
8888
8889                 case 'D':
8890                   /* +D is for disassembly only; never match.  */
8891                   break;
8892
8893                 case 'I':
8894                   /* "+I" is like "I", except that imm2_expr is used.  */
8895                   my_getExpression (&imm2_expr, s);
8896                   if (imm2_expr.X_op != O_big
8897                       && imm2_expr.X_op != O_constant)
8898                   insn_error = _("absolute expression required");
8899                   if (HAVE_32BIT_GPRS)
8900                     normalize_constant_expr (&imm2_expr);
8901                   s = expr_end;
8902                   continue;
8903
8904                 case 'T': /* Coprocessor register.  */
8905                   /* +T is for disassembly only; never match.  */
8906                   break;
8907
8908                 case 't': /* Coprocessor register number.  */
8909                   if (s[0] == '$' && ISDIGIT (s[1]))
8910                     {
8911                       ++s;
8912                       regno = 0;
8913                       do
8914                         {
8915                           regno *= 10;
8916                           regno += *s - '0';
8917                           ++s;
8918                         }
8919                       while (ISDIGIT (*s));
8920                       if (regno > 31)
8921                         as_bad (_("Invalid register number (%d)"), regno);
8922                       else
8923                         {
8924                           INSERT_OPERAND (RT, *ip, regno);
8925                           continue;
8926                         }
8927                     }
8928                   else
8929                     as_bad (_("Invalid coprocessor 0 register number"));
8930                   break;
8931
8932                 default:
8933                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8934                     *args, insn->name, insn->args);
8935                   /* Further processing is fruitless.  */
8936                   return;
8937                 }
8938               break;
8939
8940             case '<':           /* must be at least one digit */
8941               /*
8942                * According to the manual, if the shift amount is greater
8943                * than 31 or less than 0, then the shift amount should be
8944                * mod 32.  In reality the mips assembler issues an error.
8945                * We issue a warning and mask out all but the low 5 bits.
8946                */
8947               my_getExpression (&imm_expr, s);
8948               check_absolute_expr (ip, &imm_expr);
8949               if ((unsigned long) imm_expr.X_add_number > 31)
8950                 as_warn (_("Improper shift amount (%lu)"),
8951                          (unsigned long) imm_expr.X_add_number);
8952               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8953               imm_expr.X_op = O_absent;
8954               s = expr_end;
8955               continue;
8956
8957             case '>':           /* shift amount minus 32 */
8958               my_getExpression (&imm_expr, s);
8959               check_absolute_expr (ip, &imm_expr);
8960               if ((unsigned long) imm_expr.X_add_number < 32
8961                   || (unsigned long) imm_expr.X_add_number > 63)
8962                 break;
8963               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8964               imm_expr.X_op = O_absent;
8965               s = expr_end;
8966               continue;
8967
8968             case 'k':           /* cache code */
8969             case 'h':           /* prefx code */
8970               my_getExpression (&imm_expr, s);
8971               check_absolute_expr (ip, &imm_expr);
8972               if ((unsigned long) imm_expr.X_add_number > 31)
8973                 as_warn (_("Invalid value for `%s' (%lu)"),
8974                          ip->insn_mo->name,
8975                          (unsigned long) imm_expr.X_add_number);
8976               if (*args == 'k')
8977                 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8978               else
8979                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8980               imm_expr.X_op = O_absent;
8981               s = expr_end;
8982               continue;
8983
8984             case 'c':           /* break code */
8985               my_getExpression (&imm_expr, s);
8986               check_absolute_expr (ip, &imm_expr);
8987               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
8988                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
8989                          ip->insn_mo->name,
8990                          (unsigned long) imm_expr.X_add_number);
8991               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
8992               imm_expr.X_op = O_absent;
8993               s = expr_end;
8994               continue;
8995
8996             case 'q':           /* lower break code */
8997               my_getExpression (&imm_expr, s);
8998               check_absolute_expr (ip, &imm_expr);
8999               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9000                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9001                          ip->insn_mo->name,
9002                          (unsigned long) imm_expr.X_add_number);
9003               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9004               imm_expr.X_op = O_absent;
9005               s = expr_end;
9006               continue;
9007
9008             case 'B':           /* 20-bit syscall/break code.  */
9009               my_getExpression (&imm_expr, s);
9010               check_absolute_expr (ip, &imm_expr);
9011               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9012                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9013                          ip->insn_mo->name,
9014                          (unsigned long) imm_expr.X_add_number);
9015               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9016               imm_expr.X_op = O_absent;
9017               s = expr_end;
9018               continue;
9019
9020             case 'C':           /* Coprocessor code */
9021               my_getExpression (&imm_expr, s);
9022               check_absolute_expr (ip, &imm_expr);
9023               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9024                 {
9025                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9026                            (unsigned long) imm_expr.X_add_number);
9027                   imm_expr.X_add_number &= OP_MASK_COPZ;
9028                 }
9029               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9030               imm_expr.X_op = O_absent;
9031               s = expr_end;
9032               continue;
9033
9034             case 'J':           /* 19-bit wait code.  */
9035               my_getExpression (&imm_expr, s);
9036               check_absolute_expr (ip, &imm_expr);
9037               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9038                 {
9039                   as_warn (_("Illegal 19-bit code (%lu)"),
9040                            (unsigned long) imm_expr.X_add_number);
9041                   imm_expr.X_add_number &= OP_MASK_CODE19;
9042                 }
9043               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9044               imm_expr.X_op = O_absent;
9045               s = expr_end;
9046               continue;
9047
9048             case 'P':           /* Performance register.  */
9049               my_getExpression (&imm_expr, s);
9050               check_absolute_expr (ip, &imm_expr);
9051               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9052                 as_warn (_("Invalid performance register (%lu)"),
9053                          (unsigned long) imm_expr.X_add_number);
9054               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9055               imm_expr.X_op = O_absent;
9056               s = expr_end;
9057               continue;
9058
9059             case 'G':           /* Coprocessor destination register.  */
9060               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9061                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9062               else
9063                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9064               INSERT_OPERAND (RD, *ip, regno);
9065               if (ok) 
9066                 {
9067                   lastregno = regno;
9068                   continue;
9069                 }
9070               else
9071                 break;
9072
9073             case 'b':           /* base register */
9074             case 'd':           /* destination register */
9075             case 's':           /* source register */
9076             case 't':           /* target register */
9077             case 'r':           /* both target and source */
9078             case 'v':           /* both dest and source */
9079             case 'w':           /* both dest and target */
9080             case 'E':           /* coprocessor target register */
9081             case 'K':           /* 'rdhwr' destination register */
9082             case 'x':           /* ignore register name */
9083             case 'z':           /* must be zero register */
9084             case 'U':           /* destination register (clo/clz).  */
9085             case 'g':           /* coprocessor destination register */
9086               s_reset = s;            
9087               if (*args == 'E' || *args == 'K')
9088                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9089               else
9090                 {
9091                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9092                   if (regno == AT && ! mips_opts.noat)
9093                     as_warn ("Used $at without \".set noat\"");
9094                 }
9095               if (ok)
9096                 {
9097                   c = *args;
9098                   if (*s == ' ')
9099                     ++s;
9100                   if (args[1] != *s)
9101                     {
9102                       if (c == 'r' || c == 'v' || c == 'w')
9103                         {
9104                           regno = lastregno;
9105                           s = s_reset;
9106                           ++args;
9107                         }
9108                     }
9109                   /* 'z' only matches $0.  */
9110                   if (c == 'z' && regno != 0)
9111                     break;
9112
9113         /* Now that we have assembled one operand, we use the args string
9114          * to figure out where it goes in the instruction.  */
9115                   switch (c)
9116                     {
9117                     case 'r':
9118                     case 's':
9119                     case 'v':
9120                     case 'b':
9121                       INSERT_OPERAND (RS, *ip, regno);
9122                       break;
9123                     case 'd':
9124                     case 'G':
9125                     case 'K':
9126                     case 'g':
9127                       INSERT_OPERAND (RD, *ip, regno);
9128                       break;
9129                     case 'U':
9130                       INSERT_OPERAND (RD, *ip, regno);
9131                       INSERT_OPERAND (RT, *ip, regno);
9132                       break;
9133                     case 'w':
9134                     case 't':
9135                     case 'E':
9136                       INSERT_OPERAND (RT, *ip, regno);
9137                       break;
9138                     case 'x':
9139                       /* This case exists because on the r3000 trunc
9140                          expands into a macro which requires a gp
9141                          register.  On the r6000 or r4000 it is
9142                          assembled into a single instruction which
9143                          ignores the register.  Thus the insn version
9144                          is MIPS_ISA2 and uses 'x', and the macro
9145                          version is MIPS_ISA1 and uses 't'.  */
9146                       break;
9147                     case 'z':
9148                       /* This case is for the div instruction, which
9149                          acts differently if the destination argument
9150                          is $0.  This only matches $0, and is checked
9151                          outside the switch.  */
9152                       break;
9153                     case 'D':
9154                       /* Itbl operand; not yet implemented. FIXME ?? */
9155                       break;
9156                       /* What about all other operands like 'i', which
9157                          can be specified in the opcode table? */
9158                     }
9159                   lastregno = regno;
9160                   continue;
9161                 }
9162               switch (*args++)
9163                 {
9164                 case 'r':
9165                 case 'v':
9166                   INSERT_OPERAND (RS, *ip, lastregno);
9167                   continue;
9168                 case 'w':
9169                   INSERT_OPERAND (RT, *ip, lastregno);
9170                   continue;
9171                 }
9172               break;
9173
9174             case 'O':           /* MDMX alignment immediate constant.  */
9175               my_getExpression (&imm_expr, s);
9176               check_absolute_expr (ip, &imm_expr);
9177               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9178                 as_warn ("Improper align amount (%ld), using low bits",
9179                          (long) imm_expr.X_add_number);
9180               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9181               imm_expr.X_op = O_absent;
9182               s = expr_end;
9183               continue;
9184
9185             case 'Q':           /* MDMX vector, element sel, or const.  */
9186               if (s[0] != '$')
9187                 {
9188                   /* MDMX Immediate.  */
9189                   my_getExpression (&imm_expr, s);
9190                   check_absolute_expr (ip, &imm_expr);
9191                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9192                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9193                              (long) imm_expr.X_add_number);
9194                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9195                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9196                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9197                   else
9198                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9199                   imm_expr.X_op = O_absent;
9200                   s = expr_end;
9201                   continue;
9202                 }
9203               /* Not MDMX Immediate.  Fall through.  */
9204             case 'X':           /* MDMX destination register.  */
9205             case 'Y':           /* MDMX source register.  */
9206             case 'Z':           /* MDMX target register.  */
9207               is_mdmx = 1;
9208             case 'D':           /* floating point destination register */
9209             case 'S':           /* floating point source register */
9210             case 'T':           /* floating point target register */
9211             case 'R':           /* floating point source register */
9212             case 'V':
9213             case 'W':
9214               rtype = RTYPE_FPU;
9215               if (is_mdmx
9216                   || (mips_opts.ase_mdmx
9217                       && (ip->insn_mo->pinfo & FP_D)
9218                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9219                                                 | INSN_COPROC_MEMORY_DELAY
9220                                                 | INSN_LOAD_COPROC_DELAY
9221                                                 | INSN_LOAD_MEMORY_DELAY
9222                                                 | INSN_STORE_MEMORY))))
9223                 rtype |= RTYPE_VEC;
9224               s_reset = s;
9225               if (reg_lookup (&s, rtype, &regno))
9226                 {
9227                   if ((regno & 1) != 0
9228                       && HAVE_32BIT_FPRS
9229                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9230                     as_warn (_("Float register should be even, was %d"),
9231                              regno);
9232
9233                   c = *args;
9234                   if (*s == ' ')
9235                     ++s;
9236                   if (args[1] != *s)
9237                     {
9238                       if (c == 'V' || c == 'W')
9239                         {
9240                           regno = lastregno;
9241                           s = s_reset;
9242                           ++args;
9243                         }
9244                     }
9245                   switch (c)
9246                     {
9247                     case 'D':
9248                     case 'X':
9249                       INSERT_OPERAND (FD, *ip, regno);
9250                       break;
9251                     case 'V':
9252                     case 'S':
9253                     case 'Y':
9254                       INSERT_OPERAND (FS, *ip, regno);
9255                       break;
9256                     case 'Q':
9257                       /* This is like 'Z', but also needs to fix the MDMX
9258                          vector/scalar select bits.  Note that the
9259                          scalar immediate case is handled above.  */
9260                       if (*s == '[')
9261                         {
9262                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9263                           int max_el = (is_qh ? 3 : 7);
9264                           s++;
9265                           my_getExpression(&imm_expr, s);
9266                           check_absolute_expr (ip, &imm_expr);
9267                           s = expr_end;
9268                           if (imm_expr.X_add_number > max_el)
9269                             as_bad(_("Bad element selector %ld"),
9270                                    (long) imm_expr.X_add_number);
9271                           imm_expr.X_add_number &= max_el;
9272                           ip->insn_opcode |= (imm_expr.X_add_number
9273                                               << (OP_SH_VSEL +
9274                                                   (is_qh ? 2 : 1)));
9275                           imm_expr.X_op = O_absent;
9276                           if (*s != ']')
9277                             as_warn(_("Expecting ']' found '%s'"), s);
9278                           else
9279                             s++;
9280                         }
9281                       else
9282                         {
9283                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9284                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9285                                                 << OP_SH_VSEL);
9286                           else
9287                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9288                                                 OP_SH_VSEL);
9289                         }
9290                       /* Fall through */
9291                     case 'W':
9292                     case 'T':
9293                     case 'Z':
9294                       INSERT_OPERAND (FT, *ip, regno);
9295                       break;
9296                     case 'R':
9297                       INSERT_OPERAND (FR, *ip, regno);
9298                       break;
9299                     }
9300                   lastregno = regno;
9301                   continue;
9302                 }
9303
9304               switch (*args++)
9305                 {
9306                 case 'V':
9307                   INSERT_OPERAND (FS, *ip, lastregno);
9308                   continue;
9309                 case 'W':
9310                   INSERT_OPERAND (FT, *ip, lastregno);
9311                   continue;
9312                 }
9313               break;
9314
9315             case 'I':
9316               my_getExpression (&imm_expr, s);
9317               if (imm_expr.X_op != O_big
9318                   && imm_expr.X_op != O_constant)
9319                 insn_error = _("absolute expression required");
9320               if (HAVE_32BIT_GPRS)
9321                 normalize_constant_expr (&imm_expr);
9322               s = expr_end;
9323               continue;
9324
9325             case 'A':
9326               my_getExpression (&offset_expr, s);
9327               normalize_address_expr (&offset_expr);
9328               *imm_reloc = BFD_RELOC_32;
9329               s = expr_end;
9330               continue;
9331
9332             case 'F':
9333             case 'L':
9334             case 'f':
9335             case 'l':
9336               {
9337                 int f64;
9338                 int using_gprs;
9339                 char *save_in;
9340                 char *err;
9341                 unsigned char temp[8];
9342                 int len;
9343                 unsigned int length;
9344                 segT seg;
9345                 subsegT subseg;
9346                 char *p;
9347
9348                 /* These only appear as the last operand in an
9349                    instruction, and every instruction that accepts
9350                    them in any variant accepts them in all variants.
9351                    This means we don't have to worry about backing out
9352                    any changes if the instruction does not match.
9353
9354                    The difference between them is the size of the
9355                    floating point constant and where it goes.  For 'F'
9356                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9357                    is 32 bits.  Where the constant is placed is based
9358                    on how the MIPS assembler does things:
9359                     F -- .rdata
9360                     L -- .lit8
9361                     f -- immediate value
9362                     l -- .lit4
9363
9364                     The .lit4 and .lit8 sections are only used if
9365                     permitted by the -G argument.
9366
9367                     The code below needs to know whether the target register
9368                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9369                     'F' are used with GPR-based instructions and 'l' and
9370                     'L' are used with FPR-based instructions.  */
9371
9372                 f64 = *args == 'F' || *args == 'L';
9373                 using_gprs = *args == 'F' || *args == 'f';
9374
9375                 save_in = input_line_pointer;
9376                 input_line_pointer = s;
9377                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9378                 length = len;
9379                 s = input_line_pointer;
9380                 input_line_pointer = save_in;
9381                 if (err != NULL && *err != '\0')
9382                   {
9383                     as_bad (_("Bad floating point constant: %s"), err);
9384                     memset (temp, '\0', sizeof temp);
9385                     length = f64 ? 8 : 4;
9386                   }
9387
9388                 assert (length == (unsigned) (f64 ? 8 : 4));
9389
9390                 if (*args == 'f'
9391                     || (*args == 'l'
9392                         && (g_switch_value < 4
9393                             || (temp[0] == 0 && temp[1] == 0)
9394                             || (temp[2] == 0 && temp[3] == 0))))
9395                   {
9396                     imm_expr.X_op = O_constant;
9397                     if (! target_big_endian)
9398                       imm_expr.X_add_number = bfd_getl32 (temp);
9399                     else
9400                       imm_expr.X_add_number = bfd_getb32 (temp);
9401                   }
9402                 else if (length > 4
9403                          && ! mips_disable_float_construction
9404                          /* Constants can only be constructed in GPRs and
9405                             copied to FPRs if the GPRs are at least as wide
9406                             as the FPRs.  Force the constant into memory if
9407                             we are using 64-bit FPRs but the GPRs are only
9408                             32 bits wide.  */
9409                          && (using_gprs
9410                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9411                          && ((temp[0] == 0 && temp[1] == 0)
9412                              || (temp[2] == 0 && temp[3] == 0))
9413                          && ((temp[4] == 0 && temp[5] == 0)
9414                              || (temp[6] == 0 && temp[7] == 0)))
9415                   {
9416                     /* The value is simple enough to load with a couple of
9417                        instructions.  If using 32-bit registers, set
9418                        imm_expr to the high order 32 bits and offset_expr to
9419                        the low order 32 bits.  Otherwise, set imm_expr to
9420                        the entire 64 bit constant.  */
9421                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9422                       {
9423                         imm_expr.X_op = O_constant;
9424                         offset_expr.X_op = O_constant;
9425                         if (! target_big_endian)
9426                           {
9427                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9428                             offset_expr.X_add_number = bfd_getl32 (temp);
9429                           }
9430                         else
9431                           {
9432                             imm_expr.X_add_number = bfd_getb32 (temp);
9433                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9434                           }
9435                         if (offset_expr.X_add_number == 0)
9436                           offset_expr.X_op = O_absent;
9437                       }
9438                     else if (sizeof (imm_expr.X_add_number) > 4)
9439                       {
9440                         imm_expr.X_op = O_constant;
9441                         if (! target_big_endian)
9442                           imm_expr.X_add_number = bfd_getl64 (temp);
9443                         else
9444                           imm_expr.X_add_number = bfd_getb64 (temp);
9445                       }
9446                     else
9447                       {
9448                         imm_expr.X_op = O_big;
9449                         imm_expr.X_add_number = 4;
9450                         if (! target_big_endian)
9451                           {
9452                             generic_bignum[0] = bfd_getl16 (temp);
9453                             generic_bignum[1] = bfd_getl16 (temp + 2);
9454                             generic_bignum[2] = bfd_getl16 (temp + 4);
9455                             generic_bignum[3] = bfd_getl16 (temp + 6);
9456                           }
9457                         else
9458                           {
9459                             generic_bignum[0] = bfd_getb16 (temp + 6);
9460                             generic_bignum[1] = bfd_getb16 (temp + 4);
9461                             generic_bignum[2] = bfd_getb16 (temp + 2);
9462                             generic_bignum[3] = bfd_getb16 (temp);
9463                           }
9464                       }
9465                   }
9466                 else
9467                   {
9468                     const char *newname;
9469                     segT new_seg;
9470
9471                     /* Switch to the right section.  */
9472                     seg = now_seg;
9473                     subseg = now_subseg;
9474                     switch (*args)
9475                       {
9476                       default: /* unused default case avoids warnings.  */
9477                       case 'L':
9478                         newname = RDATA_SECTION_NAME;
9479                         if (g_switch_value >= 8)
9480                           newname = ".lit8";
9481                         break;
9482                       case 'F':
9483                         newname = RDATA_SECTION_NAME;
9484                         break;
9485                       case 'l':
9486                         assert (g_switch_value >= 4);
9487                         newname = ".lit4";
9488                         break;
9489                       }
9490                     new_seg = subseg_new (newname, (subsegT) 0);
9491                     if (IS_ELF)
9492                       bfd_set_section_flags (stdoutput, new_seg,
9493                                              (SEC_ALLOC
9494                                               | SEC_LOAD
9495                                               | SEC_READONLY
9496                                               | SEC_DATA));
9497                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9498                     if (IS_ELF && strcmp (TARGET_OS, "elf") != 0)
9499                       record_alignment (new_seg, 4);
9500                     else
9501                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9502                     if (seg == now_seg)
9503                       as_bad (_("Can't use floating point insn in this section"));
9504
9505                     /* Set the argument to the current address in the
9506                        section.  */
9507                     offset_expr.X_op = O_symbol;
9508                     offset_expr.X_add_symbol =
9509                       symbol_new ("L0\001", now_seg,
9510                                   (valueT) frag_now_fix (), frag_now);
9511                     offset_expr.X_add_number = 0;
9512
9513                     /* Put the floating point number into the section.  */
9514                     p = frag_more ((int) length);
9515                     memcpy (p, temp, length);
9516
9517                     /* Switch back to the original section.  */
9518                     subseg_set (seg, subseg);
9519                   }
9520               }
9521               continue;
9522
9523             case 'i':           /* 16 bit unsigned immediate */
9524             case 'j':           /* 16 bit signed immediate */
9525               *imm_reloc = BFD_RELOC_LO16;
9526               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9527                 {
9528                   int more;
9529                   offsetT minval, maxval;
9530
9531                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9532                           && strcmp (insn->name, insn[1].name) == 0);
9533
9534                   /* If the expression was written as an unsigned number,
9535                      only treat it as signed if there are no more
9536                      alternatives.  */
9537                   if (more
9538                       && *args == 'j'
9539                       && sizeof (imm_expr.X_add_number) <= 4
9540                       && imm_expr.X_op == O_constant
9541                       && imm_expr.X_add_number < 0
9542                       && imm_expr.X_unsigned
9543                       && HAVE_64BIT_GPRS)
9544                     break;
9545
9546                   /* For compatibility with older assemblers, we accept
9547                      0x8000-0xffff as signed 16-bit numbers when only
9548                      signed numbers are allowed.  */
9549                   if (*args == 'i')
9550                     minval = 0, maxval = 0xffff;
9551                   else if (more)
9552                     minval = -0x8000, maxval = 0x7fff;
9553                   else
9554                     minval = -0x8000, maxval = 0xffff;
9555
9556                   if (imm_expr.X_op != O_constant
9557                       || imm_expr.X_add_number < minval
9558                       || imm_expr.X_add_number > maxval)
9559                     {
9560                       if (more)
9561                         break;
9562                       if (imm_expr.X_op == O_constant
9563                           || imm_expr.X_op == O_big)
9564                         as_bad (_("expression out of range"));
9565                     }
9566                 }
9567               s = expr_end;
9568               continue;
9569
9570             case 'o':           /* 16 bit offset */
9571               /* Check whether there is only a single bracketed expression
9572                  left.  If so, it must be the base register and the
9573                  constant must be zero.  */
9574               if (*s == '(' && strchr (s + 1, '(') == 0)
9575                 {
9576                   offset_expr.X_op = O_constant;
9577                   offset_expr.X_add_number = 0;
9578                   continue;
9579                 }
9580
9581               /* If this value won't fit into a 16 bit offset, then go
9582                  find a macro that will generate the 32 bit offset
9583                  code pattern.  */
9584               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9585                   && (offset_expr.X_op != O_constant
9586                       || offset_expr.X_add_number >= 0x8000
9587                       || offset_expr.X_add_number < -0x8000))
9588                 break;
9589
9590               s = expr_end;
9591               continue;
9592
9593             case 'p':           /* pc relative offset */
9594               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9595               my_getExpression (&offset_expr, s);
9596               s = expr_end;
9597               continue;
9598
9599             case 'u':           /* upper 16 bits */
9600               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9601                   && imm_expr.X_op == O_constant
9602                   && (imm_expr.X_add_number < 0
9603                       || imm_expr.X_add_number >= 0x10000))
9604                 as_bad (_("lui expression not in range 0..65535"));
9605               s = expr_end;
9606               continue;
9607
9608             case 'a':           /* 26 bit address */
9609               my_getExpression (&offset_expr, s);
9610               s = expr_end;
9611               *offset_reloc = BFD_RELOC_MIPS_JMP;
9612               continue;
9613
9614             case 'N':           /* 3 bit branch condition code */
9615             case 'M':           /* 3 bit compare condition code */
9616               rtype = RTYPE_CCC;
9617               if (ip->insn_mo->pinfo & (FP_D| FP_S))
9618                 rtype |= RTYPE_FCC;
9619               if (!reg_lookup (&s, rtype, &regno))
9620                 break;
9621               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9622                    || strcmp(str + strlen(str) - 5, "any2f") == 0
9623                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
9624                   && (regno & 1) != 0)
9625                 as_warn(_("Condition code register should be even for %s, was %d"),
9626                         str, regno);
9627               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9628                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
9629                   && (regno & 3) != 0)
9630                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9631                         str, regno);
9632               if (*args == 'N')
9633                 INSERT_OPERAND (BCC, *ip, regno);
9634               else
9635                 INSERT_OPERAND (CCC, *ip, regno);
9636               continue;
9637
9638             case 'H':
9639               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9640                 s += 2;
9641               if (ISDIGIT (*s))
9642                 {
9643                   c = 0;
9644                   do
9645                     {
9646                       c *= 10;
9647                       c += *s - '0';
9648                       ++s;
9649                     }
9650                   while (ISDIGIT (*s));
9651                 }
9652               else
9653                 c = 8; /* Invalid sel value.  */
9654
9655               if (c > 7)
9656                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9657               ip->insn_opcode |= c;
9658               continue;
9659
9660             case 'e':
9661               /* Must be at least one digit.  */
9662               my_getExpression (&imm_expr, s);
9663               check_absolute_expr (ip, &imm_expr);
9664
9665               if ((unsigned long) imm_expr.X_add_number
9666                   > (unsigned long) OP_MASK_VECBYTE)
9667                 {
9668                   as_bad (_("bad byte vector index (%ld)"),
9669                            (long) imm_expr.X_add_number);
9670                   imm_expr.X_add_number = 0;
9671                 }
9672
9673               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9674               imm_expr.X_op = O_absent;
9675               s = expr_end;
9676               continue;
9677
9678             case '%':
9679               my_getExpression (&imm_expr, s);
9680               check_absolute_expr (ip, &imm_expr);
9681
9682               if ((unsigned long) imm_expr.X_add_number
9683                   > (unsigned long) OP_MASK_VECALIGN)
9684                 {
9685                   as_bad (_("bad byte vector index (%ld)"),
9686                            (long) imm_expr.X_add_number);
9687                   imm_expr.X_add_number = 0;
9688                 }
9689
9690               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9691               imm_expr.X_op = O_absent;
9692               s = expr_end;
9693               continue;
9694
9695             default:
9696               as_bad (_("bad char = '%c'\n"), *args);
9697               internalError ();
9698             }
9699           break;
9700         }
9701       /* Args don't match.  */
9702       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9703           !strcmp (insn->name, insn[1].name))
9704         {
9705           ++insn;
9706           s = argsStart;
9707           insn_error = _("illegal operands");
9708           continue;
9709         }
9710       if (save_c)
9711         *(--s) = save_c;
9712       insn_error = _("illegal operands");
9713       return;
9714     }
9715 }
9716
9717 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9718
9719 /* This routine assembles an instruction into its binary format when
9720    assembling for the mips16.  As a side effect, it sets one of the
9721    global variables imm_reloc or offset_reloc to the type of
9722    relocation to do if one of the operands is an address expression.
9723    It also sets mips16_small and mips16_ext if the user explicitly
9724    requested a small or extended instruction.  */
9725
9726 static void
9727 mips16_ip (char *str, struct mips_cl_insn *ip)
9728 {
9729   char *s;
9730   const char *args;
9731   struct mips_opcode *insn;
9732   char *argsstart;
9733   unsigned int regno;
9734   unsigned int lastregno = 0;
9735   char *s_reset;
9736   size_t i;
9737
9738   insn_error = NULL;
9739
9740   mips16_small = FALSE;
9741   mips16_ext = FALSE;
9742
9743   for (s = str; ISLOWER (*s); ++s)
9744     ;
9745   switch (*s)
9746     {
9747     case '\0':
9748       break;
9749
9750     case ' ':
9751       *s++ = '\0';
9752       break;
9753
9754     case '.':
9755       if (s[1] == 't' && s[2] == ' ')
9756         {
9757           *s = '\0';
9758           mips16_small = TRUE;
9759           s += 3;
9760           break;
9761         }
9762       else if (s[1] == 'e' && s[2] == ' ')
9763         {
9764           *s = '\0';
9765           mips16_ext = TRUE;
9766           s += 3;
9767           break;
9768         }
9769       /* Fall through.  */
9770     default:
9771       insn_error = _("unknown opcode");
9772       return;
9773     }
9774
9775   if (mips_opts.noautoextend && ! mips16_ext)
9776     mips16_small = TRUE;
9777
9778   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9779     {
9780       insn_error = _("unrecognized opcode");
9781       return;
9782     }
9783
9784   argsstart = s;
9785   for (;;)
9786     {
9787       bfd_boolean ok;
9788
9789       assert (strcmp (insn->name, str) == 0);
9790
9791       if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
9792         ok = TRUE;
9793       else
9794         ok = FALSE;
9795
9796       if (! ok)
9797         {
9798           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
9799               && strcmp (insn->name, insn[1].name) == 0)
9800             {
9801               ++insn;
9802               continue;
9803             }
9804           else
9805             {
9806               if (!insn_error)
9807                 {
9808                   static char buf[100];
9809                   sprintf (buf,
9810                            _("opcode not supported on this processor: %s (%s)"),
9811                            mips_cpu_info_from_arch (mips_opts.arch)->name,
9812                            mips_cpu_info_from_isa (mips_opts.isa)->name);
9813                   insn_error = buf;
9814                 }
9815               return;
9816             }
9817         }
9818
9819       create_insn (ip, insn);
9820       imm_expr.X_op = O_absent;
9821       imm_reloc[0] = BFD_RELOC_UNUSED;
9822       imm_reloc[1] = BFD_RELOC_UNUSED;
9823       imm_reloc[2] = BFD_RELOC_UNUSED;
9824       imm2_expr.X_op = O_absent;
9825       offset_expr.X_op = O_absent;
9826       offset_reloc[0] = BFD_RELOC_UNUSED;
9827       offset_reloc[1] = BFD_RELOC_UNUSED;
9828       offset_reloc[2] = BFD_RELOC_UNUSED;
9829       for (args = insn->args; 1; ++args)
9830         {
9831           int c;
9832
9833           if (*s == ' ')
9834             ++s;
9835
9836           /* In this switch statement we call break if we did not find
9837              a match, continue if we did find a match, or return if we
9838              are done.  */
9839
9840           c = *args;
9841           switch (c)
9842             {
9843             case '\0':
9844               if (*s == '\0')
9845                 {
9846                   /* Stuff the immediate value in now, if we can.  */
9847                   if (imm_expr.X_op == O_constant
9848                       && *imm_reloc > BFD_RELOC_UNUSED
9849                       && insn->pinfo != INSN_MACRO)
9850                     {
9851                       valueT tmp;
9852
9853                       switch (*offset_reloc)
9854                         {
9855                           case BFD_RELOC_MIPS16_HI16_S:
9856                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9857                             break;
9858
9859                           case BFD_RELOC_MIPS16_HI16:
9860                             tmp = imm_expr.X_add_number >> 16;
9861                             break;
9862
9863                           case BFD_RELOC_MIPS16_LO16:
9864                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9865                                   - 0x8000;
9866                             break;
9867
9868                           case BFD_RELOC_UNUSED:
9869                             tmp = imm_expr.X_add_number;
9870                             break;
9871
9872                           default:
9873                             internalError ();
9874                         }
9875                       *offset_reloc = BFD_RELOC_UNUSED;
9876
9877                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9878                                     tmp, TRUE, mips16_small,
9879                                     mips16_ext, &ip->insn_opcode,
9880                                     &ip->use_extend, &ip->extend);
9881                       imm_expr.X_op = O_absent;
9882                       *imm_reloc = BFD_RELOC_UNUSED;
9883                     }
9884
9885                   return;
9886                 }
9887               break;
9888
9889             case ',':
9890               if (*s++ == c)
9891                 continue;
9892               s--;
9893               switch (*++args)
9894                 {
9895                 case 'v':
9896                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9897                   continue;
9898                 case 'w':
9899                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9900                   continue;
9901                 }
9902               break;
9903
9904             case '(':
9905             case ')':
9906               if (*s++ == c)
9907                 continue;
9908               break;
9909
9910             case 'v':
9911             case 'w':
9912               if (s[0] != '$')
9913                 {
9914                   if (c == 'v')
9915                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9916                   else
9917                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9918                   ++args;
9919                   continue;
9920                 }
9921               /* Fall through.  */
9922             case 'x':
9923             case 'y':
9924             case 'z':
9925             case 'Z':
9926             case '0':
9927             case 'S':
9928             case 'R':
9929             case 'X':
9930             case 'Y':
9931               s_reset = s;
9932               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9933                 {
9934                   if (c == 'v' || c == 'w')
9935                     {
9936                       if (c == 'v')
9937                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9938                       else
9939                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9940                       ++args;
9941                       continue;
9942                     }
9943                   break;
9944                 }
9945
9946               if (*s == ' ')
9947                 ++s;
9948               if (args[1] != *s)
9949                 {
9950                   if (c == 'v' || c == 'w')
9951                     {
9952                       regno = mips16_to_32_reg_map[lastregno];
9953                       s = s_reset;
9954                       ++args;
9955                     }
9956                 }
9957
9958               switch (c)
9959                 {
9960                 case 'x':
9961                 case 'y':
9962                 case 'z':
9963                 case 'v':
9964                 case 'w':
9965                 case 'Z':
9966                   regno = mips32_to_16_reg_map[regno];
9967                   break;
9968
9969                 case '0':
9970                   if (regno != 0)
9971                     regno = ILLEGAL_REG;
9972                   break;
9973
9974                 case 'S':
9975                   if (regno != SP)
9976                     regno = ILLEGAL_REG;
9977                   break;
9978
9979                 case 'R':
9980                   if (regno != RA)
9981                     regno = ILLEGAL_REG;
9982                   break;
9983
9984                 case 'X':
9985                 case 'Y':
9986                   if (regno == AT && ! mips_opts.noat)
9987                     as_warn (_("used $at without \".set noat\""));
9988                   break;
9989
9990                 default:
9991                   internalError ();
9992                 }
9993
9994               if (regno == ILLEGAL_REG)
9995                 break;
9996
9997               switch (c)
9998                 {
9999                 case 'x':
10000                 case 'v':
10001                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10002                   break;
10003                 case 'y':
10004                 case 'w':
10005                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10006                   break;
10007                 case 'z':
10008                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10009                   break;
10010                 case 'Z':
10011                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10012                 case '0':
10013                 case 'S':
10014                 case 'R':
10015                   break;
10016                 case 'X':
10017                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10018                   break;
10019                 case 'Y':
10020                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10021                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10022                   break;
10023                 default:
10024                   internalError ();
10025                 }
10026
10027               lastregno = regno;
10028               continue;
10029
10030             case 'P':
10031               if (strncmp (s, "$pc", 3) == 0)
10032                 {
10033                   s += 3;
10034                   continue;
10035                 }
10036               break;
10037
10038             case '5':
10039             case 'H':
10040             case 'W':
10041             case 'D':
10042             case 'j':
10043             case 'V':
10044             case 'C':
10045             case 'U':
10046             case 'k':
10047             case 'K':
10048               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10049               if (i > 0)
10050                 {
10051                   if (imm_expr.X_op != O_constant)
10052                     {
10053                       mips16_ext = TRUE;
10054                       ip->use_extend = TRUE;
10055                       ip->extend = 0;
10056                     }
10057                   else
10058                     {
10059                       /* We need to relax this instruction.  */
10060                       *offset_reloc = *imm_reloc;
10061                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10062                     }
10063                   s = expr_end;
10064                   continue;
10065                 }
10066               *imm_reloc = BFD_RELOC_UNUSED;
10067               /* Fall through.  */
10068             case '<':
10069             case '>':
10070             case '[':
10071             case ']':
10072             case '4':
10073             case '8':
10074               my_getExpression (&imm_expr, s);
10075               if (imm_expr.X_op == O_register)
10076                 {
10077                   /* What we thought was an expression turned out to
10078                      be a register.  */
10079
10080                   if (s[0] == '(' && args[1] == '(')
10081                     {
10082                       /* It looks like the expression was omitted
10083                          before a register indirection, which means
10084                          that the expression is implicitly zero.  We
10085                          still set up imm_expr, so that we handle
10086                          explicit extensions correctly.  */
10087                       imm_expr.X_op = O_constant;
10088                       imm_expr.X_add_number = 0;
10089                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10090                       continue;
10091                     }
10092
10093                   break;
10094                 }
10095
10096               /* We need to relax this instruction.  */
10097               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10098               s = expr_end;
10099               continue;
10100
10101             case 'p':
10102             case 'q':
10103             case 'A':
10104             case 'B':
10105             case 'E':
10106               /* We use offset_reloc rather than imm_reloc for the PC
10107                  relative operands.  This lets macros with both
10108                  immediate and address operands work correctly.  */
10109               my_getExpression (&offset_expr, s);
10110
10111               if (offset_expr.X_op == O_register)
10112                 break;
10113
10114               /* We need to relax this instruction.  */
10115               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10116               s = expr_end;
10117               continue;
10118
10119             case '6':           /* break code */
10120               my_getExpression (&imm_expr, s);
10121               check_absolute_expr (ip, &imm_expr);
10122               if ((unsigned long) imm_expr.X_add_number > 63)
10123                 as_warn (_("Invalid value for `%s' (%lu)"),
10124                          ip->insn_mo->name,
10125                          (unsigned long) imm_expr.X_add_number);
10126               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10127               imm_expr.X_op = O_absent;
10128               s = expr_end;
10129               continue;
10130
10131             case 'a':           /* 26 bit address */
10132               my_getExpression (&offset_expr, s);
10133               s = expr_end;
10134               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10135               ip->insn_opcode <<= 16;
10136               continue;
10137
10138             case 'l':           /* register list for entry macro */
10139             case 'L':           /* register list for exit macro */
10140               {
10141                 int mask;
10142
10143                 if (c == 'l')
10144                   mask = 0;
10145                 else
10146                   mask = 7 << 3;
10147                 while (*s != '\0')
10148                   {
10149                     unsigned int freg, reg1, reg2;
10150
10151                     while (*s == ' ' || *s == ',')
10152                       ++s;
10153                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10154                       freg = 0;
10155                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10156                       freg = 1;
10157                     else
10158                       {
10159                         as_bad (_("can't parse register list"));
10160                         break;
10161                       }
10162                     if (*s == ' ')
10163                       ++s;
10164                     if (*s != '-')
10165                       reg2 = reg1;
10166                     else
10167                       {
10168                         ++s;
10169                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10170                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10171                           {
10172                             as_bad (_("invalid register list"));
10173                             break;
10174                           }
10175                       }
10176                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10177                       {
10178                         mask &= ~ (7 << 3);
10179                         mask |= 5 << 3;
10180                       }
10181                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10182                       {
10183                         mask &= ~ (7 << 3);
10184                         mask |= 6 << 3;
10185                       }
10186                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10187                       mask |= (reg2 - 3) << 3;
10188                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10189                       mask |= (reg2 - 15) << 1;
10190                     else if (reg1 == RA && reg2 == RA)
10191                       mask |= 1;
10192                     else
10193                       {
10194                         as_bad (_("invalid register list"));
10195                         break;
10196                       }
10197                   }
10198                 /* The mask is filled in in the opcode table for the
10199                    benefit of the disassembler.  We remove it before
10200                    applying the actual mask.  */
10201                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10202                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10203               }
10204             continue;
10205
10206             case 'm':           /* Register list for save insn.  */
10207             case 'M':           /* Register list for restore insn.  */
10208               {
10209                 int opcode = 0;
10210                 int framesz = 0, seen_framesz = 0;
10211                 int args = 0, statics = 0, sregs = 0;
10212
10213                 while (*s != '\0')
10214                   {
10215                     unsigned int reg1, reg2;
10216
10217                     SKIP_SPACE_TABS (s);
10218                     while (*s == ',')
10219                       ++s;
10220                     SKIP_SPACE_TABS (s);
10221
10222                     my_getExpression (&imm_expr, s);
10223                     if (imm_expr.X_op == O_constant)
10224                       {
10225                         /* Handle the frame size.  */
10226                         if (seen_framesz)
10227                           {
10228                             as_bad (_("more than one frame size in list"));
10229                             break;
10230                           }
10231                         seen_framesz = 1;
10232                         framesz = imm_expr.X_add_number;
10233                         imm_expr.X_op = O_absent;
10234                         s = expr_end;
10235                         continue;
10236                       }
10237
10238                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10239                       {
10240                         as_bad (_("can't parse register list"));
10241                         break;
10242                       }
10243
10244                     while (*s == ' ')
10245                       ++s;
10246
10247                     if (*s != '-')
10248                       reg2 = reg1;
10249                     else
10250                       {
10251                         ++s;
10252                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10253                             || reg2 < reg1)
10254                           {
10255                             as_bad (_("can't parse register list"));
10256                             break;
10257                           }
10258                       }
10259
10260                     while (reg1 <= reg2)
10261                       {
10262                         if (reg1 >= 4 && reg1 <= 7)
10263                           {
10264                             if (!seen_framesz)
10265                                 /* args $a0-$a3 */
10266                                 args |= 1 << (reg1 - 4);
10267                             else
10268                                 /* statics $a0-$a3 */
10269                                 statics |= 1 << (reg1 - 4);
10270                           }
10271                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10272                           {
10273                             /* $s0-$s8 */
10274                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10275                           }
10276                         else if (reg1 == 31)
10277                           {
10278                             /* Add $ra to insn.  */
10279                             opcode |= 0x40;
10280                           }
10281                         else
10282                           {
10283                             as_bad (_("unexpected register in list"));
10284                             break;
10285                           }
10286                         if (++reg1 == 24)
10287                           reg1 = 30;
10288                       }
10289                   }
10290
10291                 /* Encode args/statics combination.  */
10292                 if (args & statics)
10293                   as_bad (_("arg/static registers overlap"));
10294                 else if (args == 0xf)
10295                   /* All $a0-$a3 are args.  */
10296                   opcode |= MIPS16_ALL_ARGS << 16;
10297                 else if (statics == 0xf)
10298                   /* All $a0-$a3 are statics.  */
10299                   opcode |= MIPS16_ALL_STATICS << 16;
10300                 else 
10301                   {
10302                     int narg = 0, nstat = 0;
10303
10304                     /* Count arg registers.  */
10305                     while (args & 0x1)
10306                       {
10307                         args >>= 1;
10308                         narg++;
10309                       }
10310                     if (args != 0)
10311                       as_bad (_("invalid arg register list"));
10312
10313                     /* Count static registers.  */
10314                     while (statics & 0x8)
10315                       {
10316                         statics = (statics << 1) & 0xf;
10317                         nstat++;
10318                       }
10319                     if (statics != 0) 
10320                       as_bad (_("invalid static register list"));
10321
10322                     /* Encode args/statics.  */
10323                     opcode |= ((narg << 2) | nstat) << 16;
10324                   }
10325
10326                 /* Encode $s0/$s1.  */
10327                 if (sregs & (1 << 0))           /* $s0 */
10328                   opcode |= 0x20;
10329                 if (sregs & (1 << 1))           /* $s1 */
10330                   opcode |= 0x10;
10331                 sregs >>= 2;
10332
10333                 if (sregs != 0)
10334                   {
10335                     /* Count regs $s2-$s8.  */
10336                     int nsreg = 0;
10337                     while (sregs & 1)
10338                       {
10339                         sregs >>= 1;
10340                         nsreg++;
10341                       }
10342                     if (sregs != 0)
10343                       as_bad (_("invalid static register list"));
10344                     /* Encode $s2-$s8. */
10345                     opcode |= nsreg << 24;
10346                   }
10347
10348                 /* Encode frame size.  */
10349                 if (!seen_framesz)
10350                   as_bad (_("missing frame size"));
10351                 else if ((framesz & 7) != 0 || framesz < 0
10352                          || framesz > 0xff * 8)
10353                   as_bad (_("invalid frame size"));
10354                 else if (framesz != 128 || (opcode >> 16) != 0)
10355                   {
10356                     framesz /= 8;
10357                     opcode |= (((framesz & 0xf0) << 16)
10358                              | (framesz & 0x0f));
10359                   }
10360
10361                 /* Finally build the instruction.  */
10362                 if ((opcode >> 16) != 0 || framesz == 0)
10363                   {
10364                     ip->use_extend = TRUE;
10365                     ip->extend = opcode >> 16;
10366                   }
10367                 ip->insn_opcode |= opcode & 0x7f;
10368               }
10369             continue;
10370
10371             case 'e':           /* extend code */
10372               my_getExpression (&imm_expr, s);
10373               check_absolute_expr (ip, &imm_expr);
10374               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10375                 {
10376                   as_warn (_("Invalid value for `%s' (%lu)"),
10377                            ip->insn_mo->name,
10378                            (unsigned long) imm_expr.X_add_number);
10379                   imm_expr.X_add_number &= 0x7ff;
10380                 }
10381               ip->insn_opcode |= imm_expr.X_add_number;
10382               imm_expr.X_op = O_absent;
10383               s = expr_end;
10384               continue;
10385
10386             default:
10387               internalError ();
10388             }
10389           break;
10390         }
10391
10392       /* Args don't match.  */
10393       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10394           strcmp (insn->name, insn[1].name) == 0)
10395         {
10396           ++insn;
10397           s = argsstart;
10398           continue;
10399         }
10400
10401       insn_error = _("illegal operands");
10402
10403       return;
10404     }
10405 }
10406
10407 /* This structure holds information we know about a mips16 immediate
10408    argument type.  */
10409
10410 struct mips16_immed_operand
10411 {
10412   /* The type code used in the argument string in the opcode table.  */
10413   int type;
10414   /* The number of bits in the short form of the opcode.  */
10415   int nbits;
10416   /* The number of bits in the extended form of the opcode.  */
10417   int extbits;
10418   /* The amount by which the short form is shifted when it is used;
10419      for example, the sw instruction has a shift count of 2.  */
10420   int shift;
10421   /* The amount by which the short form is shifted when it is stored
10422      into the instruction code.  */
10423   int op_shift;
10424   /* Non-zero if the short form is unsigned.  */
10425   int unsp;
10426   /* Non-zero if the extended form is unsigned.  */
10427   int extu;
10428   /* Non-zero if the value is PC relative.  */
10429   int pcrel;
10430 };
10431
10432 /* The mips16 immediate operand types.  */
10433
10434 static const struct mips16_immed_operand mips16_immed_operands[] =
10435 {
10436   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10437   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10438   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10439   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10440   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10441   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10442   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10443   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10444   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10445   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10446   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10447   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10448   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10449   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10450   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10451   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10452   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10453   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10454   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10455   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10456   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10457 };
10458
10459 #define MIPS16_NUM_IMMED \
10460   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10461
10462 /* Handle a mips16 instruction with an immediate value.  This or's the
10463    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10464    whether an extended value is needed; if one is needed, it sets
10465    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10466    If SMALL is true, an unextended opcode was explicitly requested.
10467    If EXT is true, an extended opcode was explicitly requested.  If
10468    WARN is true, warn if EXT does not match reality.  */
10469
10470 static void
10471 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10472               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10473               unsigned long *insn, bfd_boolean *use_extend,
10474               unsigned short *extend)
10475 {
10476   const struct mips16_immed_operand *op;
10477   int mintiny, maxtiny;
10478   bfd_boolean needext;
10479
10480   op = mips16_immed_operands;
10481   while (op->type != type)
10482     {
10483       ++op;
10484       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10485     }
10486
10487   if (op->unsp)
10488     {
10489       if (type == '<' || type == '>' || type == '[' || type == ']')
10490         {
10491           mintiny = 1;
10492           maxtiny = 1 << op->nbits;
10493         }
10494       else
10495         {
10496           mintiny = 0;
10497           maxtiny = (1 << op->nbits) - 1;
10498         }
10499     }
10500   else
10501     {
10502       mintiny = - (1 << (op->nbits - 1));
10503       maxtiny = (1 << (op->nbits - 1)) - 1;
10504     }
10505
10506   /* Branch offsets have an implicit 0 in the lowest bit.  */
10507   if (type == 'p' || type == 'q')
10508     val /= 2;
10509
10510   if ((val & ((1 << op->shift) - 1)) != 0
10511       || val < (mintiny << op->shift)
10512       || val > (maxtiny << op->shift))
10513     needext = TRUE;
10514   else
10515     needext = FALSE;
10516
10517   if (warn && ext && ! needext)
10518     as_warn_where (file, line,
10519                    _("extended operand requested but not required"));
10520   if (small && needext)
10521     as_bad_where (file, line, _("invalid unextended operand value"));
10522
10523   if (small || (! ext && ! needext))
10524     {
10525       int insnval;
10526
10527       *use_extend = FALSE;
10528       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10529       insnval <<= op->op_shift;
10530       *insn |= insnval;
10531     }
10532   else
10533     {
10534       long minext, maxext;
10535       int extval;
10536
10537       if (op->extu)
10538         {
10539           minext = 0;
10540           maxext = (1 << op->extbits) - 1;
10541         }
10542       else
10543         {
10544           minext = - (1 << (op->extbits - 1));
10545           maxext = (1 << (op->extbits - 1)) - 1;
10546         }
10547       if (val < minext || val > maxext)
10548         as_bad_where (file, line,
10549                       _("operand value out of range for instruction"));
10550
10551       *use_extend = TRUE;
10552       if (op->extbits == 16)
10553         {
10554           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10555           val &= 0x1f;
10556         }
10557       else if (op->extbits == 15)
10558         {
10559           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10560           val &= 0xf;
10561         }
10562       else
10563         {
10564           extval = ((val & 0x1f) << 6) | (val & 0x20);
10565           val = 0;
10566         }
10567
10568       *extend = (unsigned short) extval;
10569       *insn |= val;
10570     }
10571 }
10572 \f
10573 struct percent_op_match
10574 {
10575   const char *str;
10576   bfd_reloc_code_real_type reloc;
10577 };
10578
10579 static const struct percent_op_match mips_percent_op[] =
10580 {
10581   {"%lo", BFD_RELOC_LO16},
10582 #ifdef OBJ_ELF
10583   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10584   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10585   {"%call16", BFD_RELOC_MIPS_CALL16},
10586   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10587   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10588   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10589   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10590   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10591   {"%got", BFD_RELOC_MIPS_GOT16},
10592   {"%gp_rel", BFD_RELOC_GPREL16},
10593   {"%half", BFD_RELOC_16},
10594   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10595   {"%higher", BFD_RELOC_MIPS_HIGHER},
10596   {"%neg", BFD_RELOC_MIPS_SUB},
10597   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10598   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10599   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10600   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10601   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10602   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10603   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10604 #endif
10605   {"%hi", BFD_RELOC_HI16_S}
10606 };
10607
10608 static const struct percent_op_match mips16_percent_op[] =
10609 {
10610   {"%lo", BFD_RELOC_MIPS16_LO16},
10611   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10612   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10613 };
10614
10615
10616 /* Return true if *STR points to a relocation operator.  When returning true,
10617    move *STR over the operator and store its relocation code in *RELOC.
10618    Leave both *STR and *RELOC alone when returning false.  */
10619
10620 static bfd_boolean
10621 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10622 {
10623   const struct percent_op_match *percent_op;
10624   size_t limit, i;
10625
10626   if (mips_opts.mips16)
10627     {
10628       percent_op = mips16_percent_op;
10629       limit = ARRAY_SIZE (mips16_percent_op);
10630     }
10631   else
10632     {
10633       percent_op = mips_percent_op;
10634       limit = ARRAY_SIZE (mips_percent_op);
10635     }
10636
10637   for (i = 0; i < limit; i++)
10638     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10639       {
10640         int len = strlen (percent_op[i].str);
10641
10642         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10643           continue;
10644
10645         *str += strlen (percent_op[i].str);
10646         *reloc = percent_op[i].reloc;
10647
10648         /* Check whether the output BFD supports this relocation.
10649            If not, issue an error and fall back on something safe.  */
10650         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10651           {
10652             as_bad ("relocation %s isn't supported by the current ABI",
10653                     percent_op[i].str);
10654             *reloc = BFD_RELOC_UNUSED;
10655           }
10656         return TRUE;
10657       }
10658   return FALSE;
10659 }
10660
10661
10662 /* Parse string STR as a 16-bit relocatable operand.  Store the
10663    expression in *EP and the relocations in the array starting
10664    at RELOC.  Return the number of relocation operators used.
10665
10666    On exit, EXPR_END points to the first character after the expression.  */
10667
10668 static size_t
10669 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10670                        char *str)
10671 {
10672   bfd_reloc_code_real_type reversed_reloc[3];
10673   size_t reloc_index, i;
10674   int crux_depth, str_depth;
10675   char *crux;
10676
10677   /* Search for the start of the main expression, recoding relocations
10678      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10679      of the main expression and with CRUX_DEPTH containing the number
10680      of open brackets at that point.  */
10681   reloc_index = -1;
10682   str_depth = 0;
10683   do
10684     {
10685       reloc_index++;
10686       crux = str;
10687       crux_depth = str_depth;
10688
10689       /* Skip over whitespace and brackets, keeping count of the number
10690          of brackets.  */
10691       while (*str == ' ' || *str == '\t' || *str == '(')
10692         if (*str++ == '(')
10693           str_depth++;
10694     }
10695   while (*str == '%'
10696          && reloc_index < (HAVE_NEWABI ? 3 : 1)
10697          && parse_relocation (&str, &reversed_reloc[reloc_index]));
10698
10699   my_getExpression (ep, crux);
10700   str = expr_end;
10701
10702   /* Match every open bracket.  */
10703   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10704     if (*str++ == ')')
10705       crux_depth--;
10706
10707   if (crux_depth > 0)
10708     as_bad ("unclosed '('");
10709
10710   expr_end = str;
10711
10712   if (reloc_index != 0)
10713     {
10714       prev_reloc_op_frag = frag_now;
10715       for (i = 0; i < reloc_index; i++)
10716         reloc[i] = reversed_reloc[reloc_index - 1 - i];
10717     }
10718
10719   return reloc_index;
10720 }
10721
10722 static void
10723 my_getExpression (expressionS *ep, char *str)
10724 {
10725   char *save_in;
10726   valueT val;
10727
10728   save_in = input_line_pointer;
10729   input_line_pointer = str;
10730   expression (ep);
10731   expr_end = input_line_pointer;
10732   input_line_pointer = save_in;
10733
10734   /* If we are in mips16 mode, and this is an expression based on `.',
10735      then we bump the value of the symbol by 1 since that is how other
10736      text symbols are handled.  We don't bother to handle complex
10737      expressions, just `.' plus or minus a constant.  */
10738   if (mips_opts.mips16
10739       && ep->X_op == O_symbol
10740       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10741       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10742       && symbol_get_frag (ep->X_add_symbol) == frag_now
10743       && symbol_constant_p (ep->X_add_symbol)
10744       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10745     S_SET_VALUE (ep->X_add_symbol, val + 1);
10746 }
10747
10748 /* Turn a string in input_line_pointer into a floating point constant
10749    of type TYPE, and store the appropriate bytes in *LITP.  The number
10750    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
10751    returned, or NULL on OK.  */
10752
10753 char *
10754 md_atof (int type, char *litP, int *sizeP)
10755 {
10756   int prec;
10757   LITTLENUM_TYPE words[4];
10758   char *t;
10759   int i;
10760
10761   switch (type)
10762     {
10763     case 'f':
10764       prec = 2;
10765       break;
10766
10767     case 'd':
10768       prec = 4;
10769       break;
10770
10771     default:
10772       *sizeP = 0;
10773       return _("bad call to md_atof");
10774     }
10775
10776   t = atof_ieee (input_line_pointer, type, words);
10777   if (t)
10778     input_line_pointer = t;
10779
10780   *sizeP = prec * 2;
10781
10782   if (! target_big_endian)
10783     {
10784       for (i = prec - 1; i >= 0; i--)
10785         {
10786           md_number_to_chars (litP, words[i], 2);
10787           litP += 2;
10788         }
10789     }
10790   else
10791     {
10792       for (i = 0; i < prec; i++)
10793         {
10794           md_number_to_chars (litP, words[i], 2);
10795           litP += 2;
10796         }
10797     }
10798
10799   return NULL;
10800 }
10801
10802 void
10803 md_number_to_chars (char *buf, valueT val, int n)
10804 {
10805   if (target_big_endian)
10806     number_to_chars_bigendian (buf, val, n);
10807   else
10808     number_to_chars_littleendian (buf, val, n);
10809 }
10810 \f
10811 #ifdef OBJ_ELF
10812 static int support_64bit_objects(void)
10813 {
10814   const char **list, **l;
10815   int yes;
10816
10817   list = bfd_target_list ();
10818   for (l = list; *l != NULL; l++)
10819 #ifdef TE_TMIPS
10820     /* This is traditional mips */
10821     if (strcmp (*l, "elf64-tradbigmips") == 0
10822         || strcmp (*l, "elf64-tradlittlemips") == 0)
10823 #else
10824     if (strcmp (*l, "elf64-bigmips") == 0
10825         || strcmp (*l, "elf64-littlemips") == 0)
10826 #endif
10827       break;
10828   yes = (*l != NULL);
10829   free (list);
10830   return yes;
10831 }
10832 #endif /* OBJ_ELF */
10833
10834 const char *md_shortopts = "O::g::G:";
10835
10836 struct option md_longopts[] =
10837 {
10838   /* Options which specify architecture.  */
10839 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10840 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10841   {"march", required_argument, NULL, OPTION_MARCH},
10842 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10843   {"mtune", required_argument, NULL, OPTION_MTUNE},
10844 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10845   {"mips0", no_argument, NULL, OPTION_MIPS1},
10846   {"mips1", no_argument, NULL, OPTION_MIPS1},
10847 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10848   {"mips2", no_argument, NULL, OPTION_MIPS2},
10849 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10850   {"mips3", no_argument, NULL, OPTION_MIPS3},
10851 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10852   {"mips4", no_argument, NULL, OPTION_MIPS4},
10853 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10854   {"mips5", no_argument, NULL, OPTION_MIPS5},
10855 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10856   {"mips32", no_argument, NULL, OPTION_MIPS32},
10857 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10858   {"mips64", no_argument, NULL, OPTION_MIPS64},
10859 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10860   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10861 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10862   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10863
10864   /* Options which specify Application Specific Extensions (ASEs).  */
10865 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10866 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10867   {"mips16", no_argument, NULL, OPTION_MIPS16},
10868 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10869   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10870 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10871   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10872 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10873   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10874 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10875   {"mdmx", no_argument, NULL, OPTION_MDMX},
10876 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10877   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10878 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10879   {"mdsp", no_argument, NULL, OPTION_DSP},
10880 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10881   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
10882 #define OPTION_MT (OPTION_ASE_BASE + 8)
10883   {"mmt", no_argument, NULL, OPTION_MT},
10884 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10885   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
10886 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
10887   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
10888 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
10889   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
10890 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
10891   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
10892 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
10893   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
10894
10895   /* Old-style architecture options.  Don't add more of these.  */
10896 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
10897 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10898   {"m4650", no_argument, NULL, OPTION_M4650},
10899 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10900   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10901 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10902   {"m4010", no_argument, NULL, OPTION_M4010},
10903 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10904   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10905 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10906   {"m4100", no_argument, NULL, OPTION_M4100},
10907 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10908   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10909 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10910   {"m3900", no_argument, NULL, OPTION_M3900},
10911 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10912   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10913
10914   /* Options which enable bug fixes.  */
10915 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10916 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10917   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10918 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10919   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10920   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10921 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10922 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10923   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10924   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10925 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10926 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10927   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
10928   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
10929
10930   /* Miscellaneous options.  */
10931 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10932 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10933   {"trap", no_argument, NULL, OPTION_TRAP},
10934   {"no-break", no_argument, NULL, OPTION_TRAP},
10935 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10936   {"break", no_argument, NULL, OPTION_BREAK},
10937   {"no-trap", no_argument, NULL, OPTION_BREAK},
10938 #define OPTION_EB (OPTION_MISC_BASE + 2)
10939   {"EB", no_argument, NULL, OPTION_EB},
10940 #define OPTION_EL (OPTION_MISC_BASE + 3)
10941   {"EL", no_argument, NULL, OPTION_EL},
10942 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10943   {"mfp32", no_argument, NULL, OPTION_FP32},
10944 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10945   {"mgp32", no_argument, NULL, OPTION_GP32},
10946 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10947   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10948 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10949   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10950 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10951   {"mfp64", no_argument, NULL, OPTION_FP64},
10952 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10953   {"mgp64", no_argument, NULL, OPTION_GP64},
10954 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10955 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10956   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10957   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10958 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10959 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10960   {"mshared", no_argument, NULL, OPTION_MSHARED},
10961   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
10962 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10963 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10964   {"msym32", no_argument, NULL, OPTION_MSYM32},
10965   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
10966
10967   /* ELF-specific options.  */
10968 #ifdef OBJ_ELF
10969 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 16)
10970 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10971   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10972   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10973 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10974   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10975 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10976   {"xgot",        no_argument, NULL, OPTION_XGOT},
10977 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10978   {"mabi", required_argument, NULL, OPTION_MABI},
10979 #define OPTION_32          (OPTION_ELF_BASE + 4)
10980   {"32",          no_argument, NULL, OPTION_32},
10981 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10982   {"n32",         no_argument, NULL, OPTION_N32},
10983 #define OPTION_64          (OPTION_ELF_BASE + 6)
10984   {"64",          no_argument, NULL, OPTION_64},
10985 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10986   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10987 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10988   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10989 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
10990   {"mpdr", no_argument, NULL, OPTION_PDR},
10991 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
10992   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10993 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10994   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
10995 #endif /* OBJ_ELF */
10996
10997   {NULL, no_argument, NULL, 0}
10998 };
10999 size_t md_longopts_size = sizeof (md_longopts);
11000
11001 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11002    NEW_VALUE.  Warn if another value was already specified.  Note:
11003    we have to defer parsing the -march and -mtune arguments in order
11004    to handle 'from-abi' correctly, since the ABI might be specified
11005    in a later argument.  */
11006
11007 static void
11008 mips_set_option_string (const char **string_ptr, const char *new_value)
11009 {
11010   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11011     as_warn (_("A different %s was already specified, is now %s"),
11012              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11013              new_value);
11014
11015   *string_ptr = new_value;
11016 }
11017
11018 int
11019 md_parse_option (int c, char *arg)
11020 {
11021   switch (c)
11022     {
11023     case OPTION_CONSTRUCT_FLOATS:
11024       mips_disable_float_construction = 0;
11025       break;
11026
11027     case OPTION_NO_CONSTRUCT_FLOATS:
11028       mips_disable_float_construction = 1;
11029       break;
11030
11031     case OPTION_TRAP:
11032       mips_trap = 1;
11033       break;
11034
11035     case OPTION_BREAK:
11036       mips_trap = 0;
11037       break;
11038
11039     case OPTION_EB:
11040       target_big_endian = 1;
11041       break;
11042
11043     case OPTION_EL:
11044       target_big_endian = 0;
11045       break;
11046
11047     case 'O':
11048       if (arg && arg[0] == '0')
11049         mips_optimize = 1;
11050       else
11051         mips_optimize = 2;
11052       break;
11053
11054     case 'g':
11055       if (arg == NULL)
11056         mips_debug = 2;
11057       else
11058         mips_debug = atoi (arg);
11059       break;
11060
11061     case OPTION_MIPS1:
11062       file_mips_isa = ISA_MIPS1;
11063       break;
11064
11065     case OPTION_MIPS2:
11066       file_mips_isa = ISA_MIPS2;
11067       break;
11068
11069     case OPTION_MIPS3:
11070       file_mips_isa = ISA_MIPS3;
11071       break;
11072
11073     case OPTION_MIPS4:
11074       file_mips_isa = ISA_MIPS4;
11075       break;
11076
11077     case OPTION_MIPS5:
11078       file_mips_isa = ISA_MIPS5;
11079       break;
11080
11081     case OPTION_MIPS32:
11082       file_mips_isa = ISA_MIPS32;
11083       break;
11084
11085     case OPTION_MIPS32R2:
11086       file_mips_isa = ISA_MIPS32R2;
11087       break;
11088
11089     case OPTION_MIPS64R2:
11090       file_mips_isa = ISA_MIPS64R2;
11091       break;
11092
11093     case OPTION_MIPS64:
11094       file_mips_isa = ISA_MIPS64;
11095       break;
11096
11097     case OPTION_MTUNE:
11098       mips_set_option_string (&mips_tune_string, arg);
11099       break;
11100
11101     case OPTION_MARCH:
11102       mips_set_option_string (&mips_arch_string, arg);
11103       break;
11104
11105     case OPTION_M4650:
11106       mips_set_option_string (&mips_arch_string, "4650");
11107       mips_set_option_string (&mips_tune_string, "4650");
11108       break;
11109
11110     case OPTION_NO_M4650:
11111       break;
11112
11113     case OPTION_M4010:
11114       mips_set_option_string (&mips_arch_string, "4010");
11115       mips_set_option_string (&mips_tune_string, "4010");
11116       break;
11117
11118     case OPTION_NO_M4010:
11119       break;
11120
11121     case OPTION_M4100:
11122       mips_set_option_string (&mips_arch_string, "4100");
11123       mips_set_option_string (&mips_tune_string, "4100");
11124       break;
11125
11126     case OPTION_NO_M4100:
11127       break;
11128
11129     case OPTION_M3900:
11130       mips_set_option_string (&mips_arch_string, "3900");
11131       mips_set_option_string (&mips_tune_string, "3900");
11132       break;
11133
11134     case OPTION_NO_M3900:
11135       break;
11136
11137     case OPTION_MDMX:
11138       mips_opts.ase_mdmx = 1;
11139       break;
11140
11141     case OPTION_NO_MDMX:
11142       mips_opts.ase_mdmx = 0;
11143       break;
11144
11145     case OPTION_DSP:
11146       mips_opts.ase_dsp = 1;
11147       mips_opts.ase_dspr2 = 0;
11148       break;
11149
11150     case OPTION_NO_DSP:
11151       mips_opts.ase_dsp = 0;
11152       mips_opts.ase_dspr2 = 0;
11153       break;
11154
11155     case OPTION_DSPR2:
11156       mips_opts.ase_dspr2 = 1;
11157       mips_opts.ase_dsp = 1;
11158       break;
11159
11160     case OPTION_NO_DSPR2:
11161       mips_opts.ase_dspr2 = 0;
11162       mips_opts.ase_dsp = 0;
11163       break;
11164
11165     case OPTION_MT:
11166       mips_opts.ase_mt = 1;
11167       break;
11168
11169     case OPTION_NO_MT:
11170       mips_opts.ase_mt = 0;
11171       break;
11172
11173     case OPTION_MIPS16:
11174       mips_opts.mips16 = 1;
11175       mips_no_prev_insn ();
11176       break;
11177
11178     case OPTION_NO_MIPS16:
11179       mips_opts.mips16 = 0;
11180       mips_no_prev_insn ();
11181       break;
11182
11183     case OPTION_MIPS3D:
11184       mips_opts.ase_mips3d = 1;
11185       break;
11186
11187     case OPTION_NO_MIPS3D:
11188       mips_opts.ase_mips3d = 0;
11189       break;
11190
11191     case OPTION_SMARTMIPS:
11192       mips_opts.ase_smartmips = 1;
11193       break;
11194
11195     case OPTION_NO_SMARTMIPS:
11196       mips_opts.ase_smartmips = 0;
11197       break;
11198
11199     case OPTION_FIX_VR4120:
11200       mips_fix_vr4120 = 1;
11201       break;
11202
11203     case OPTION_NO_FIX_VR4120:
11204       mips_fix_vr4120 = 0;
11205       break;
11206
11207     case OPTION_FIX_VR4130:
11208       mips_fix_vr4130 = 1;
11209       break;
11210
11211     case OPTION_NO_FIX_VR4130:
11212       mips_fix_vr4130 = 0;
11213       break;
11214
11215     case OPTION_RELAX_BRANCH:
11216       mips_relax_branch = 1;
11217       break;
11218
11219     case OPTION_NO_RELAX_BRANCH:
11220       mips_relax_branch = 0;
11221       break;
11222
11223     case OPTION_MSHARED:
11224       mips_in_shared = TRUE;
11225       break;
11226
11227     case OPTION_MNO_SHARED:
11228       mips_in_shared = FALSE;
11229       break;
11230
11231     case OPTION_MSYM32:
11232       mips_opts.sym32 = TRUE;
11233       break;
11234
11235     case OPTION_MNO_SYM32:
11236       mips_opts.sym32 = FALSE;
11237       break;
11238
11239 #ifdef OBJ_ELF
11240       /* When generating ELF code, we permit -KPIC and -call_shared to
11241          select SVR4_PIC, and -non_shared to select no PIC.  This is
11242          intended to be compatible with Irix 5.  */
11243     case OPTION_CALL_SHARED:
11244       if (!IS_ELF)
11245         {
11246           as_bad (_("-call_shared is supported only for ELF format"));
11247           return 0;
11248         }
11249       mips_pic = SVR4_PIC;
11250       mips_abicalls = TRUE;
11251       break;
11252
11253     case OPTION_NON_SHARED:
11254       if (!IS_ELF)
11255         {
11256           as_bad (_("-non_shared is supported only for ELF format"));
11257           return 0;
11258         }
11259       mips_pic = NO_PIC;
11260       mips_abicalls = FALSE;
11261       break;
11262
11263       /* The -xgot option tells the assembler to use 32 bit offsets
11264          when accessing the got in SVR4_PIC mode.  It is for Irix
11265          compatibility.  */
11266     case OPTION_XGOT:
11267       mips_big_got = 1;
11268       break;
11269 #endif /* OBJ_ELF */
11270
11271     case 'G':
11272       g_switch_value = atoi (arg);
11273       g_switch_seen = 1;
11274       break;
11275
11276 #ifdef OBJ_ELF
11277       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11278          and -mabi=64.  */
11279     case OPTION_32:
11280       if (!IS_ELF)
11281         {
11282           as_bad (_("-32 is supported for ELF format only"));
11283           return 0;
11284         }
11285       mips_abi = O32_ABI;
11286       break;
11287
11288     case OPTION_N32:
11289       if (!IS_ELF)
11290         {
11291           as_bad (_("-n32 is supported for ELF format only"));
11292           return 0;
11293         }
11294       mips_abi = N32_ABI;
11295       break;
11296
11297     case OPTION_64:
11298       if (!IS_ELF)
11299         {
11300           as_bad (_("-64 is supported for ELF format only"));
11301           return 0;
11302         }
11303       mips_abi = N64_ABI;
11304       if (!support_64bit_objects())
11305         as_fatal (_("No compiled in support for 64 bit object file format"));
11306       break;
11307 #endif /* OBJ_ELF */
11308
11309     case OPTION_GP32:
11310       file_mips_gp32 = 1;
11311       break;
11312
11313     case OPTION_GP64:
11314       file_mips_gp32 = 0;
11315       break;
11316
11317     case OPTION_FP32:
11318       file_mips_fp32 = 1;
11319       break;
11320
11321     case OPTION_FP64:
11322       file_mips_fp32 = 0;
11323       break;
11324
11325 #ifdef OBJ_ELF
11326     case OPTION_MABI:
11327       if (!IS_ELF)
11328         {
11329           as_bad (_("-mabi is supported for ELF format only"));
11330           return 0;
11331         }
11332       if (strcmp (arg, "32") == 0)
11333         mips_abi = O32_ABI;
11334       else if (strcmp (arg, "o64") == 0)
11335         mips_abi = O64_ABI;
11336       else if (strcmp (arg, "n32") == 0)
11337         mips_abi = N32_ABI;
11338       else if (strcmp (arg, "64") == 0)
11339         {
11340           mips_abi = N64_ABI;
11341           if (! support_64bit_objects())
11342             as_fatal (_("No compiled in support for 64 bit object file "
11343                         "format"));
11344         }
11345       else if (strcmp (arg, "eabi") == 0)
11346         mips_abi = EABI_ABI;
11347       else
11348         {
11349           as_fatal (_("invalid abi -mabi=%s"), arg);
11350           return 0;
11351         }
11352       break;
11353 #endif /* OBJ_ELF */
11354
11355     case OPTION_M7000_HILO_FIX:
11356       mips_7000_hilo_fix = TRUE;
11357       break;
11358
11359     case OPTION_MNO_7000_HILO_FIX:
11360       mips_7000_hilo_fix = FALSE;
11361       break;
11362
11363 #ifdef OBJ_ELF
11364     case OPTION_MDEBUG:
11365       mips_flag_mdebug = TRUE;
11366       break;
11367
11368     case OPTION_NO_MDEBUG:
11369       mips_flag_mdebug = FALSE;
11370       break;
11371
11372     case OPTION_PDR:
11373       mips_flag_pdr = TRUE;
11374       break;
11375
11376     case OPTION_NO_PDR:
11377       mips_flag_pdr = FALSE;
11378       break;
11379
11380     case OPTION_MVXWORKS_PIC:
11381       mips_pic = VXWORKS_PIC;
11382       break;
11383 #endif /* OBJ_ELF */
11384
11385     default:
11386       return 0;
11387     }
11388
11389   return 1;
11390 }
11391 \f
11392 /* Set up globals to generate code for the ISA or processor
11393    described by INFO.  */
11394
11395 static void
11396 mips_set_architecture (const struct mips_cpu_info *info)
11397 {
11398   if (info != 0)
11399     {
11400       file_mips_arch = info->cpu;
11401       mips_opts.arch = info->cpu;
11402       mips_opts.isa = info->isa;
11403     }
11404 }
11405
11406
11407 /* Likewise for tuning.  */
11408
11409 static void
11410 mips_set_tune (const struct mips_cpu_info *info)
11411 {
11412   if (info != 0)
11413     mips_tune = info->cpu;
11414 }
11415
11416
11417 void
11418 mips_after_parse_args (void)
11419 {
11420   const struct mips_cpu_info *arch_info = 0;
11421   const struct mips_cpu_info *tune_info = 0;
11422
11423   /* GP relative stuff not working for PE */
11424   if (strncmp (TARGET_OS, "pe", 2) == 0)
11425     {
11426       if (g_switch_seen && g_switch_value != 0)
11427         as_bad (_("-G not supported in this configuration."));
11428       g_switch_value = 0;
11429     }
11430
11431   if (mips_abi == NO_ABI)
11432     mips_abi = MIPS_DEFAULT_ABI;
11433
11434   /* The following code determines the architecture and register size.
11435      Similar code was added to GCC 3.3 (see override_options() in
11436      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11437      as much as possible.  */
11438
11439   if (mips_arch_string != 0)
11440     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11441
11442   if (file_mips_isa != ISA_UNKNOWN)
11443     {
11444       /* Handle -mipsN.  At this point, file_mips_isa contains the
11445          ISA level specified by -mipsN, while arch_info->isa contains
11446          the -march selection (if any).  */
11447       if (arch_info != 0)
11448         {
11449           /* -march takes precedence over -mipsN, since it is more descriptive.
11450              There's no harm in specifying both as long as the ISA levels
11451              are the same.  */
11452           if (file_mips_isa != arch_info->isa)
11453             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11454                     mips_cpu_info_from_isa (file_mips_isa)->name,
11455                     mips_cpu_info_from_isa (arch_info->isa)->name);
11456         }
11457       else
11458         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11459     }
11460
11461   if (arch_info == 0)
11462     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11463
11464   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11465     as_bad ("-march=%s is not compatible with the selected ABI",
11466             arch_info->name);
11467
11468   mips_set_architecture (arch_info);
11469
11470   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11471   if (mips_tune_string != 0)
11472     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11473
11474   if (tune_info == 0)
11475     mips_set_tune (arch_info);
11476   else
11477     mips_set_tune (tune_info);
11478
11479   if (file_mips_gp32 >= 0)
11480     {
11481       /* The user specified the size of the integer registers.  Make sure
11482          it agrees with the ABI and ISA.  */
11483       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11484         as_bad (_("-mgp64 used with a 32-bit processor"));
11485       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11486         as_bad (_("-mgp32 used with a 64-bit ABI"));
11487       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11488         as_bad (_("-mgp64 used with a 32-bit ABI"));
11489     }
11490   else
11491     {
11492       /* Infer the integer register size from the ABI and processor.
11493          Restrict ourselves to 32-bit registers if that's all the
11494          processor has, or if the ABI cannot handle 64-bit registers.  */
11495       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11496                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11497     }
11498
11499   switch (file_mips_fp32)
11500     {
11501     default:
11502     case -1:
11503       /* No user specified float register size.
11504          ??? GAS treats single-float processors as though they had 64-bit
11505          float registers (although it complains when double-precision
11506          instructions are used).  As things stand, saying they have 32-bit
11507          registers would lead to spurious "register must be even" messages.
11508          So here we assume float registers are never smaller than the
11509          integer ones.  */
11510       if (file_mips_gp32 == 0)
11511         /* 64-bit integer registers implies 64-bit float registers.  */
11512         file_mips_fp32 = 0;
11513       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11514                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11515         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11516         file_mips_fp32 = 0;
11517       else
11518         /* 32-bit float registers.  */
11519         file_mips_fp32 = 1;
11520       break;
11521
11522     /* The user specified the size of the float registers.  Check if it
11523        agrees with the ABI and ISA.  */
11524     case 0:
11525       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11526         as_bad (_("-mfp64 used with a 32-bit fpu"));
11527       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11528                && !ISA_HAS_MXHC1 (mips_opts.isa))
11529         as_warn (_("-mfp64 used with a 32-bit ABI"));
11530       break;
11531     case 1:
11532       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11533         as_warn (_("-mfp32 used with a 64-bit ABI"));
11534       break;
11535     }
11536
11537   /* End of GCC-shared inference code.  */
11538
11539   /* This flag is set when we have a 64-bit capable CPU but use only
11540      32-bit wide registers.  Note that EABI does not use it.  */
11541   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11542       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11543           || mips_abi == O32_ABI))
11544     mips_32bitmode = 1;
11545
11546   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11547     as_bad (_("trap exception not supported at ISA 1"));
11548
11549   /* If the selected architecture includes support for ASEs, enable
11550      generation of code for them.  */
11551   if (mips_opts.mips16 == -1)
11552     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11553   if (mips_opts.ase_mips3d == -1)
11554     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11555                             && file_mips_fp32 == 0) ? 1 : 0;
11556   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11557     as_bad (_("-mfp32 used with -mips3d"));
11558
11559   if (mips_opts.ase_mdmx == -1)
11560     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11561                           && file_mips_fp32 == 0) ? 1 : 0;
11562   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11563     as_bad (_("-mfp32 used with -mdmx"));
11564
11565   if (mips_opts.ase_smartmips == -1)
11566     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11567   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11568       as_warn ("%s ISA does not support SmartMIPS", 
11569                mips_cpu_info_from_isa (mips_opts.isa)->name);
11570
11571   if (mips_opts.ase_dsp == -1)
11572     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11573   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11574       as_warn ("%s ISA does not support DSP ASE", 
11575                mips_cpu_info_from_isa (mips_opts.isa)->name);
11576
11577   if (mips_opts.ase_dspr2 == -1)
11578     {
11579       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11580       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11581     }
11582   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11583       as_warn ("%s ISA does not support DSP R2 ASE",
11584                mips_cpu_info_from_isa (mips_opts.isa)->name);
11585
11586   if (mips_opts.ase_mt == -1)
11587     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11588   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11589       as_warn ("%s ISA does not support MT ASE",
11590                mips_cpu_info_from_isa (mips_opts.isa)->name);
11591
11592   file_mips_isa = mips_opts.isa;
11593   file_ase_mips16 = mips_opts.mips16;
11594   file_ase_mips3d = mips_opts.ase_mips3d;
11595   file_ase_mdmx = mips_opts.ase_mdmx;
11596   file_ase_smartmips = mips_opts.ase_smartmips;
11597   file_ase_dsp = mips_opts.ase_dsp;
11598   file_ase_dspr2 = mips_opts.ase_dspr2;
11599   file_ase_mt = mips_opts.ase_mt;
11600   mips_opts.gp32 = file_mips_gp32;
11601   mips_opts.fp32 = file_mips_fp32;
11602
11603   if (mips_flag_mdebug < 0)
11604     {
11605 #ifdef OBJ_MAYBE_ECOFF
11606       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11607         mips_flag_mdebug = 1;
11608       else
11609 #endif /* OBJ_MAYBE_ECOFF */
11610         mips_flag_mdebug = 0;
11611     }
11612 }
11613 \f
11614 void
11615 mips_init_after_args (void)
11616 {
11617   /* initialize opcodes */
11618   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11619   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11620 }
11621
11622 long
11623 md_pcrel_from (fixS *fixP)
11624 {
11625   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11626   switch (fixP->fx_r_type)
11627     {
11628     case BFD_RELOC_16_PCREL_S2:
11629     case BFD_RELOC_MIPS_JMP:
11630       /* Return the address of the delay slot.  */
11631       return addr + 4;
11632     default:
11633       /* We have no relocation type for PC relative MIPS16 instructions.  */
11634       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11635         as_bad_where (fixP->fx_file, fixP->fx_line,
11636                       _("PC relative MIPS16 instruction references a different section"));
11637       return addr;
11638     }
11639 }
11640
11641 /* This is called before the symbol table is processed.  In order to
11642    work with gcc when using mips-tfile, we must keep all local labels.
11643    However, in other cases, we want to discard them.  If we were
11644    called with -g, but we didn't see any debugging information, it may
11645    mean that gcc is smuggling debugging information through to
11646    mips-tfile, in which case we must generate all local labels.  */
11647
11648 void
11649 mips_frob_file_before_adjust (void)
11650 {
11651 #ifndef NO_ECOFF_DEBUGGING
11652   if (ECOFF_DEBUGGING
11653       && mips_debug != 0
11654       && ! ecoff_debugging_seen)
11655     flag_keep_locals = 1;
11656 #endif
11657 }
11658
11659 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11660    the corresponding LO16 reloc.  This is called before md_apply_fix and
11661    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11662    relocation operators.
11663
11664    For our purposes, a %lo() expression matches a %got() or %hi()
11665    expression if:
11666
11667       (a) it refers to the same symbol; and
11668       (b) the offset applied in the %lo() expression is no lower than
11669           the offset applied in the %got() or %hi().
11670
11671    (b) allows us to cope with code like:
11672
11673         lui     $4,%hi(foo)
11674         lh      $4,%lo(foo+2)($4)
11675
11676    ...which is legal on RELA targets, and has a well-defined behaviour
11677    if the user knows that adding 2 to "foo" will not induce a carry to
11678    the high 16 bits.
11679
11680    When several %lo()s match a particular %got() or %hi(), we use the
11681    following rules to distinguish them:
11682
11683      (1) %lo()s with smaller offsets are a better match than %lo()s with
11684          higher offsets.
11685
11686      (2) %lo()s with no matching %got() or %hi() are better than those
11687          that already have a matching %got() or %hi().
11688
11689      (3) later %lo()s are better than earlier %lo()s.
11690
11691    These rules are applied in order.
11692
11693    (1) means, among other things, that %lo()s with identical offsets are
11694    chosen if they exist.
11695
11696    (2) means that we won't associate several high-part relocations with
11697    the same low-part relocation unless there's no alternative.  Having
11698    several high parts for the same low part is a GNU extension; this rule
11699    allows careful users to avoid it.
11700
11701    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
11702    with the last high-part relocation being at the front of the list.
11703    It therefore makes sense to choose the last matching low-part
11704    relocation, all other things being equal.  It's also easier
11705    to code that way.  */
11706
11707 void
11708 mips_frob_file (void)
11709 {
11710   struct mips_hi_fixup *l;
11711
11712   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11713     {
11714       segment_info_type *seginfo;
11715       bfd_boolean matched_lo_p;
11716       fixS **hi_pos, **lo_pos, **pos;
11717
11718       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11719
11720       /* If a GOT16 relocation turns out to be against a global symbol,
11721          there isn't supposed to be a matching LO.  */
11722       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11723           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11724         continue;
11725
11726       /* Check quickly whether the next fixup happens to be a matching %lo.  */
11727       if (fixup_has_matching_lo_p (l->fixp))
11728         continue;
11729
11730       seginfo = seg_info (l->seg);
11731
11732       /* Set HI_POS to the position of this relocation in the chain.
11733          Set LO_POS to the position of the chosen low-part relocation.
11734          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11735          relocation that matches an immediately-preceding high-part
11736          relocation.  */
11737       hi_pos = NULL;
11738       lo_pos = NULL;
11739       matched_lo_p = FALSE;
11740       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11741         {
11742           if (*pos == l->fixp)
11743             hi_pos = pos;
11744
11745           if (((*pos)->fx_r_type == BFD_RELOC_LO16
11746                || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
11747               && (*pos)->fx_addsy == l->fixp->fx_addsy
11748               && (*pos)->fx_offset >= l->fixp->fx_offset
11749               && (lo_pos == NULL
11750                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
11751                   || (!matched_lo_p
11752                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11753             lo_pos = pos;
11754
11755           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11756                           && fixup_has_matching_lo_p (*pos));
11757         }
11758
11759       /* If we found a match, remove the high-part relocation from its
11760          current position and insert it before the low-part relocation.
11761          Make the offsets match so that fixup_has_matching_lo_p()
11762          will return true.
11763
11764          We don't warn about unmatched high-part relocations since some
11765          versions of gcc have been known to emit dead "lui ...%hi(...)"
11766          instructions.  */
11767       if (lo_pos != NULL)
11768         {
11769           l->fixp->fx_offset = (*lo_pos)->fx_offset;
11770           if (l->fixp->fx_next != *lo_pos)
11771             {
11772               *hi_pos = l->fixp->fx_next;
11773               l->fixp->fx_next = *lo_pos;
11774               *lo_pos = l->fixp;
11775             }
11776         }
11777     }
11778 }
11779
11780 /* We may have combined relocations without symbols in the N32/N64 ABI.
11781    We have to prevent gas from dropping them.  */
11782
11783 int
11784 mips_force_relocation (fixS *fixp)
11785 {
11786   if (generic_force_reloc (fixp))
11787     return 1;
11788
11789   if (HAVE_NEWABI
11790       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11791       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11792           || fixp->fx_r_type == BFD_RELOC_HI16_S
11793           || fixp->fx_r_type == BFD_RELOC_LO16))
11794     return 1;
11795
11796   return 0;
11797 }
11798
11799 /* Apply a fixup to the object file.  */
11800
11801 void
11802 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11803 {
11804   bfd_byte *buf;
11805   long insn;
11806   reloc_howto_type *howto;
11807
11808   /* We ignore generic BFD relocations we don't know about.  */
11809   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11810   if (! howto)
11811     return;
11812
11813   assert (fixP->fx_size == 4
11814           || fixP->fx_r_type == BFD_RELOC_16
11815           || fixP->fx_r_type == BFD_RELOC_64
11816           || fixP->fx_r_type == BFD_RELOC_CTOR
11817           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11818           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11819           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11820           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
11821
11822   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11823
11824   assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
11825
11826   /* Don't treat parts of a composite relocation as done.  There are two
11827      reasons for this:
11828
11829      (1) The second and third parts will be against 0 (RSS_UNDEF) but
11830          should nevertheless be emitted if the first part is.
11831
11832      (2) In normal usage, composite relocations are never assembly-time
11833          constants.  The easiest way of dealing with the pathological
11834          exceptions is to generate a relocation against STN_UNDEF and
11835          leave everything up to the linker.  */
11836   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
11837     fixP->fx_done = 1;
11838
11839   switch (fixP->fx_r_type)
11840     {
11841     case BFD_RELOC_MIPS_TLS_GD:
11842     case BFD_RELOC_MIPS_TLS_LDM:
11843     case BFD_RELOC_MIPS_TLS_DTPREL32:
11844     case BFD_RELOC_MIPS_TLS_DTPREL64:
11845     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
11846     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
11847     case BFD_RELOC_MIPS_TLS_GOTTPREL:
11848     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
11849     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
11850       S_SET_THREAD_LOCAL (fixP->fx_addsy);
11851       /* fall through */
11852
11853     case BFD_RELOC_MIPS_JMP:
11854     case BFD_RELOC_MIPS_SHIFT5:
11855     case BFD_RELOC_MIPS_SHIFT6:
11856     case BFD_RELOC_MIPS_GOT_DISP:
11857     case BFD_RELOC_MIPS_GOT_PAGE:
11858     case BFD_RELOC_MIPS_GOT_OFST:
11859     case BFD_RELOC_MIPS_SUB:
11860     case BFD_RELOC_MIPS_INSERT_A:
11861     case BFD_RELOC_MIPS_INSERT_B:
11862     case BFD_RELOC_MIPS_DELETE:
11863     case BFD_RELOC_MIPS_HIGHEST:
11864     case BFD_RELOC_MIPS_HIGHER:
11865     case BFD_RELOC_MIPS_SCN_DISP:
11866     case BFD_RELOC_MIPS_REL16:
11867     case BFD_RELOC_MIPS_RELGOT:
11868     case BFD_RELOC_MIPS_JALR:
11869     case BFD_RELOC_HI16:
11870     case BFD_RELOC_HI16_S:
11871     case BFD_RELOC_GPREL16:
11872     case BFD_RELOC_MIPS_LITERAL:
11873     case BFD_RELOC_MIPS_CALL16:
11874     case BFD_RELOC_MIPS_GOT16:
11875     case BFD_RELOC_GPREL32:
11876     case BFD_RELOC_MIPS_GOT_HI16:
11877     case BFD_RELOC_MIPS_GOT_LO16:
11878     case BFD_RELOC_MIPS_CALL_HI16:
11879     case BFD_RELOC_MIPS_CALL_LO16:
11880     case BFD_RELOC_MIPS16_GPREL:
11881     case BFD_RELOC_MIPS16_HI16:
11882     case BFD_RELOC_MIPS16_HI16_S:
11883     case BFD_RELOC_MIPS16_JMP:
11884       /* Nothing needed to do.  The value comes from the reloc entry.  */
11885       break;
11886
11887     case BFD_RELOC_64:
11888       /* This is handled like BFD_RELOC_32, but we output a sign
11889          extended value if we are only 32 bits.  */
11890       if (fixP->fx_done)
11891         {
11892           if (8 <= sizeof (valueT))
11893             md_number_to_chars ((char *) buf, *valP, 8);
11894           else
11895             {
11896               valueT hiv;
11897
11898               if ((*valP & 0x80000000) != 0)
11899                 hiv = 0xffffffff;
11900               else
11901                 hiv = 0;
11902               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11903                                   *valP, 4);
11904               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11905                                   hiv, 4);
11906             }
11907         }
11908       break;
11909
11910     case BFD_RELOC_RVA:
11911     case BFD_RELOC_32:
11912     case BFD_RELOC_16:
11913       /* If we are deleting this reloc entry, we must fill in the
11914          value now.  This can happen if we have a .word which is not
11915          resolved when it appears but is later defined.  */
11916       if (fixP->fx_done)
11917         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
11918       break;
11919
11920     case BFD_RELOC_LO16:
11921     case BFD_RELOC_MIPS16_LO16:
11922       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11923          may be safe to remove, but if so it's not obvious.  */
11924       /* When handling an embedded PIC switch statement, we can wind
11925          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11926       if (fixP->fx_done)
11927         {
11928           if (*valP + 0x8000 > 0xffff)
11929             as_bad_where (fixP->fx_file, fixP->fx_line,
11930                           _("relocation overflow"));
11931           if (target_big_endian)
11932             buf += 2;
11933           md_number_to_chars ((char *) buf, *valP, 2);
11934         }
11935       break;
11936
11937     case BFD_RELOC_16_PCREL_S2:
11938       if ((*valP & 0x3) != 0)
11939         as_bad_where (fixP->fx_file, fixP->fx_line,
11940                       _("Branch to misaligned address (%lx)"), (long) *valP);
11941
11942       /* We need to save the bits in the instruction since fixup_segment()
11943          might be deleting the relocation entry (i.e., a branch within
11944          the current segment).  */
11945       if (! fixP->fx_done)
11946         break;
11947
11948       /* Update old instruction data.  */
11949       if (target_big_endian)
11950         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11951       else
11952         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11953
11954       if (*valP + 0x20000 <= 0x3ffff)
11955         {
11956           insn |= (*valP >> 2) & 0xffff;
11957           md_number_to_chars ((char *) buf, insn, 4);
11958         }
11959       else if (mips_pic == NO_PIC
11960                && fixP->fx_done
11961                && fixP->fx_frag->fr_address >= text_section->vma
11962                && (fixP->fx_frag->fr_address
11963                    < text_section->vma + bfd_get_section_size (text_section))
11964                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
11965                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
11966                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11967         {
11968           /* The branch offset is too large.  If this is an
11969              unconditional branch, and we are not generating PIC code,
11970              we can convert it to an absolute jump instruction.  */
11971           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
11972             insn = 0x0c000000;  /* jal */
11973           else
11974             insn = 0x08000000;  /* j */
11975           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11976           fixP->fx_done = 0;
11977           fixP->fx_addsy = section_symbol (text_section);
11978           *valP += md_pcrel_from (fixP);
11979           md_number_to_chars ((char *) buf, insn, 4);
11980         }
11981       else
11982         {
11983           /* If we got here, we have branch-relaxation disabled,
11984              and there's nothing we can do to fix this instruction
11985              without turning it into a longer sequence.  */
11986           as_bad_where (fixP->fx_file, fixP->fx_line,
11987                         _("Branch out of range"));
11988         }
11989       break;
11990
11991     case BFD_RELOC_VTABLE_INHERIT:
11992       fixP->fx_done = 0;
11993       if (fixP->fx_addsy
11994           && !S_IS_DEFINED (fixP->fx_addsy)
11995           && !S_IS_WEAK (fixP->fx_addsy))
11996         S_SET_WEAK (fixP->fx_addsy);
11997       break;
11998
11999     case BFD_RELOC_VTABLE_ENTRY:
12000       fixP->fx_done = 0;
12001       break;
12002
12003     default:
12004       internalError ();
12005     }
12006
12007   /* Remember value for tc_gen_reloc.  */
12008   fixP->fx_addnumber = *valP;
12009 }
12010
12011 static symbolS *
12012 get_symbol (void)
12013 {
12014   int c;
12015   char *name;
12016   symbolS *p;
12017
12018   name = input_line_pointer;
12019   c = get_symbol_end ();
12020   p = (symbolS *) symbol_find_or_make (name);
12021   *input_line_pointer = c;
12022   return p;
12023 }
12024
12025 /* Align the current frag to a given power of two.  The MIPS assembler
12026    also automatically adjusts any preceding label.  */
12027
12028 static void
12029 mips_align (int to, int fill, symbolS *label)
12030 {
12031   mips_emit_delays ();
12032   frag_align (to, fill, 0);
12033   record_alignment (now_seg, to);
12034   if (label != NULL)
12035     {
12036       assert (S_GET_SEGMENT (label) == now_seg);
12037       symbol_set_frag (label, frag_now);
12038       S_SET_VALUE (label, (valueT) frag_now_fix ());
12039     }
12040 }
12041
12042 /* Align to a given power of two.  .align 0 turns off the automatic
12043    alignment used by the data creating pseudo-ops.  */
12044
12045 static void
12046 s_align (int x ATTRIBUTE_UNUSED)
12047 {
12048   int temp;
12049   long temp_fill;
12050   long max_alignment = 28;
12051
12052   /* o Note that the assembler pulls down any immediately preceding label
12053        to the aligned address.
12054      o It's not documented but auto alignment is reinstated by
12055        a .align pseudo instruction.
12056      o Note also that after auto alignment is turned off the mips assembler
12057        issues an error on attempt to assemble an improperly aligned data item.
12058        We don't.  */
12059
12060   temp = get_absolute_expression ();
12061   if (temp > max_alignment)
12062     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12063   else if (temp < 0)
12064     {
12065       as_warn (_("Alignment negative: 0 assumed."));
12066       temp = 0;
12067     }
12068   if (*input_line_pointer == ',')
12069     {
12070       ++input_line_pointer;
12071       temp_fill = get_absolute_expression ();
12072     }
12073   else
12074     temp_fill = 0;
12075   if (temp)
12076     {
12077       segment_info_type *si = seg_info (now_seg);
12078       struct insn_label_list *l = si->label_list;
12079       /* Auto alignment should be switched on by next section change.  */
12080       auto_align = 1;
12081       mips_align (temp, (int) temp_fill, l != NULL ? l->label : NULL);
12082     }
12083   else
12084     {
12085       auto_align = 0;
12086     }
12087
12088   demand_empty_rest_of_line ();
12089 }
12090
12091 static void
12092 s_change_sec (int sec)
12093 {
12094   segT seg;
12095
12096 #ifdef OBJ_ELF
12097   /* The ELF backend needs to know that we are changing sections, so
12098      that .previous works correctly.  We could do something like check
12099      for an obj_section_change_hook macro, but that might be confusing
12100      as it would not be appropriate to use it in the section changing
12101      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12102      This should be cleaner, somehow.  */
12103   if (IS_ELF)
12104     obj_elf_section_change_hook ();
12105 #endif
12106
12107   mips_emit_delays ();
12108   switch (sec)
12109     {
12110     case 't':
12111       s_text (0);
12112       break;
12113     case 'd':
12114       s_data (0);
12115       break;
12116     case 'b':
12117       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12118       demand_empty_rest_of_line ();
12119       break;
12120
12121     case 'r':
12122       seg = subseg_new (RDATA_SECTION_NAME,
12123                         (subsegT) get_absolute_expression ());
12124       if (IS_ELF)
12125         {
12126           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12127                                                   | SEC_READONLY | SEC_RELOC
12128                                                   | SEC_DATA));
12129           if (strcmp (TARGET_OS, "elf") != 0)
12130             record_alignment (seg, 4);
12131         }
12132       demand_empty_rest_of_line ();
12133       break;
12134
12135     case 's':
12136       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12137       if (IS_ELF)
12138         {
12139           bfd_set_section_flags (stdoutput, seg,
12140                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12141           if (strcmp (TARGET_OS, "elf") != 0)
12142             record_alignment (seg, 4);
12143         }
12144       demand_empty_rest_of_line ();
12145       break;
12146     }
12147
12148   auto_align = 1;
12149 }
12150
12151 void
12152 s_change_section (int ignore ATTRIBUTE_UNUSED)
12153 {
12154 #ifdef OBJ_ELF
12155   char *section_name;
12156   char c;
12157   char next_c = 0;
12158   int section_type;
12159   int section_flag;
12160   int section_entry_size;
12161   int section_alignment;
12162
12163   if (!IS_ELF)
12164     return;
12165
12166   section_name = input_line_pointer;
12167   c = get_symbol_end ();
12168   if (c)
12169     next_c = *(input_line_pointer + 1);
12170
12171   /* Do we have .section Name<,"flags">?  */
12172   if (c != ',' || (c == ',' && next_c == '"'))
12173     {
12174       /* just after name is now '\0'.  */
12175       *input_line_pointer = c;
12176       input_line_pointer = section_name;
12177       obj_elf_section (ignore);
12178       return;
12179     }
12180   input_line_pointer++;
12181
12182   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12183   if (c == ',')
12184     section_type = get_absolute_expression ();
12185   else
12186     section_type = 0;
12187   if (*input_line_pointer++ == ',')
12188     section_flag = get_absolute_expression ();
12189   else
12190     section_flag = 0;
12191   if (*input_line_pointer++ == ',')
12192     section_entry_size = get_absolute_expression ();
12193   else
12194     section_entry_size = 0;
12195   if (*input_line_pointer++ == ',')
12196     section_alignment = get_absolute_expression ();
12197   else
12198     section_alignment = 0;
12199
12200   section_name = xstrdup (section_name);
12201
12202   /* When using the generic form of .section (as implemented by obj-elf.c),
12203      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12204      traditionally had to fall back on the more common @progbits instead.
12205
12206      There's nothing really harmful in this, since bfd will correct
12207      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12208      means that, for backwards compatibility, the special_section entries
12209      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12210
12211      Even so, we shouldn't force users of the MIPS .section syntax to
12212      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12213      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12214      generic type-checking code.  */
12215   if (section_type == SHT_MIPS_DWARF)
12216     section_type = SHT_PROGBITS;
12217
12218   obj_elf_change_section (section_name, section_type, section_flag,
12219                           section_entry_size, 0, 0, 0);
12220
12221   if (now_seg->name != section_name)
12222     free (section_name);
12223 #endif /* OBJ_ELF */
12224 }
12225
12226 void
12227 mips_enable_auto_align (void)
12228 {
12229   auto_align = 1;
12230 }
12231
12232 static void
12233 s_cons (int log_size)
12234 {
12235   segment_info_type *si = seg_info (now_seg);
12236   struct insn_label_list *l = si->label_list;
12237   symbolS *label;
12238
12239   label = l != NULL ? l->label : NULL;
12240   mips_emit_delays ();
12241   if (log_size > 0 && auto_align)
12242     mips_align (log_size, 0, label);
12243   mips_clear_insn_labels ();
12244   cons (1 << log_size);
12245 }
12246
12247 static void
12248 s_float_cons (int type)
12249 {
12250   segment_info_type *si = seg_info (now_seg);
12251   struct insn_label_list *l = si->label_list;
12252   symbolS *label;
12253
12254   label = l != NULL ? l->label : NULL;
12255
12256   mips_emit_delays ();
12257
12258   if (auto_align)
12259     {
12260       if (type == 'd')
12261         mips_align (3, 0, label);
12262       else
12263         mips_align (2, 0, label);
12264     }
12265
12266   mips_clear_insn_labels ();
12267
12268   float_cons (type);
12269 }
12270
12271 /* Handle .globl.  We need to override it because on Irix 5 you are
12272    permitted to say
12273        .globl foo .text
12274    where foo is an undefined symbol, to mean that foo should be
12275    considered to be the address of a function.  */
12276
12277 static void
12278 s_mips_globl (int x ATTRIBUTE_UNUSED)
12279 {
12280   char *name;
12281   int c;
12282   symbolS *symbolP;
12283   flagword flag;
12284
12285   do
12286     {
12287       name = input_line_pointer;
12288       c = get_symbol_end ();
12289       symbolP = symbol_find_or_make (name);
12290       S_SET_EXTERNAL (symbolP);
12291
12292       *input_line_pointer = c;
12293       SKIP_WHITESPACE ();
12294
12295       /* On Irix 5, every global symbol that is not explicitly labelled as
12296          being a function is apparently labelled as being an object.  */
12297       flag = BSF_OBJECT;
12298
12299       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12300           && (*input_line_pointer != ','))
12301         {
12302           char *secname;
12303           asection *sec;
12304
12305           secname = input_line_pointer;
12306           c = get_symbol_end ();
12307           sec = bfd_get_section_by_name (stdoutput, secname);
12308           if (sec == NULL)
12309             as_bad (_("%s: no such section"), secname);
12310           *input_line_pointer = c;
12311
12312           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12313             flag = BSF_FUNCTION;
12314         }
12315
12316       symbol_get_bfdsym (symbolP)->flags |= flag;
12317
12318       c = *input_line_pointer;
12319       if (c == ',')
12320         {
12321           input_line_pointer++;
12322           SKIP_WHITESPACE ();
12323           if (is_end_of_line[(unsigned char) *input_line_pointer])
12324             c = '\n';
12325         }
12326     }
12327   while (c == ',');
12328
12329   demand_empty_rest_of_line ();
12330 }
12331
12332 static void
12333 s_option (int x ATTRIBUTE_UNUSED)
12334 {
12335   char *opt;
12336   char c;
12337
12338   opt = input_line_pointer;
12339   c = get_symbol_end ();
12340
12341   if (*opt == 'O')
12342     {
12343       /* FIXME: What does this mean?  */
12344     }
12345   else if (strncmp (opt, "pic", 3) == 0)
12346     {
12347       int i;
12348
12349       i = atoi (opt + 3);
12350       if (i == 0)
12351         mips_pic = NO_PIC;
12352       else if (i == 2)
12353         {
12354         mips_pic = SVR4_PIC;
12355           mips_abicalls = TRUE;
12356         }
12357       else
12358         as_bad (_(".option pic%d not supported"), i);
12359
12360       if (mips_pic == SVR4_PIC)
12361         {
12362           if (g_switch_seen && g_switch_value != 0)
12363             as_warn (_("-G may not be used with SVR4 PIC code"));
12364           g_switch_value = 0;
12365           bfd_set_gp_size (stdoutput, 0);
12366         }
12367     }
12368   else
12369     as_warn (_("Unrecognized option \"%s\""), opt);
12370
12371   *input_line_pointer = c;
12372   demand_empty_rest_of_line ();
12373 }
12374
12375 /* This structure is used to hold a stack of .set values.  */
12376
12377 struct mips_option_stack
12378 {
12379   struct mips_option_stack *next;
12380   struct mips_set_options options;
12381 };
12382
12383 static struct mips_option_stack *mips_opts_stack;
12384
12385 /* Handle the .set pseudo-op.  */
12386
12387 static void
12388 s_mipsset (int x ATTRIBUTE_UNUSED)
12389 {
12390   char *name = input_line_pointer, ch;
12391
12392   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12393     ++input_line_pointer;
12394   ch = *input_line_pointer;
12395   *input_line_pointer = '\0';
12396
12397   if (strcmp (name, "reorder") == 0)
12398     {
12399       if (mips_opts.noreorder)
12400         end_noreorder ();
12401     }
12402   else if (strcmp (name, "noreorder") == 0)
12403     {
12404       if (!mips_opts.noreorder)
12405         start_noreorder ();
12406     }
12407   else if (strcmp (name, "at") == 0)
12408     {
12409       mips_opts.noat = 0;
12410     }
12411   else if (strcmp (name, "noat") == 0)
12412     {
12413       mips_opts.noat = 1;
12414     }
12415   else if (strcmp (name, "macro") == 0)
12416     {
12417       mips_opts.warn_about_macros = 0;
12418     }
12419   else if (strcmp (name, "nomacro") == 0)
12420     {
12421       if (mips_opts.noreorder == 0)
12422         as_bad (_("`noreorder' must be set before `nomacro'"));
12423       mips_opts.warn_about_macros = 1;
12424     }
12425   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12426     {
12427       mips_opts.nomove = 0;
12428     }
12429   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12430     {
12431       mips_opts.nomove = 1;
12432     }
12433   else if (strcmp (name, "bopt") == 0)
12434     {
12435       mips_opts.nobopt = 0;
12436     }
12437   else if (strcmp (name, "nobopt") == 0)
12438     {
12439       mips_opts.nobopt = 1;
12440     }
12441   else if (strcmp (name, "gp=default") == 0)
12442     mips_opts.gp32 = file_mips_gp32;
12443   else if (strcmp (name, "gp=32") == 0)
12444     mips_opts.gp32 = 1;
12445   else if (strcmp (name, "gp=64") == 0)
12446     {
12447       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12448         as_warn ("%s isa does not support 64-bit registers",
12449                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12450       mips_opts.gp32 = 0;
12451     }
12452   else if (strcmp (name, "fp=default") == 0)
12453     mips_opts.fp32 = file_mips_fp32;
12454   else if (strcmp (name, "fp=32") == 0)
12455     mips_opts.fp32 = 1;
12456   else if (strcmp (name, "fp=64") == 0)
12457     {
12458       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12459         as_warn ("%s isa does not support 64-bit floating point registers",
12460                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12461       mips_opts.fp32 = 0;
12462     }
12463   else if (strcmp (name, "mips16") == 0
12464            || strcmp (name, "MIPS-16") == 0)
12465     mips_opts.mips16 = 1;
12466   else if (strcmp (name, "nomips16") == 0
12467            || strcmp (name, "noMIPS-16") == 0)
12468     mips_opts.mips16 = 0;
12469   else if (strcmp (name, "smartmips") == 0)
12470     {
12471       if (!ISA_SUPPORTS_SMARTMIPS)
12472         as_warn ("%s ISA does not support SmartMIPS ASE", 
12473                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12474       mips_opts.ase_smartmips = 1;
12475     }
12476   else if (strcmp (name, "nosmartmips") == 0)
12477     mips_opts.ase_smartmips = 0;
12478   else if (strcmp (name, "mips3d") == 0)
12479     mips_opts.ase_mips3d = 1;
12480   else if (strcmp (name, "nomips3d") == 0)
12481     mips_opts.ase_mips3d = 0;
12482   else if (strcmp (name, "mdmx") == 0)
12483     mips_opts.ase_mdmx = 1;
12484   else if (strcmp (name, "nomdmx") == 0)
12485     mips_opts.ase_mdmx = 0;
12486   else if (strcmp (name, "dsp") == 0)
12487     {
12488       if (!ISA_SUPPORTS_DSP_ASE)
12489         as_warn ("%s ISA does not support DSP ASE", 
12490                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12491       mips_opts.ase_dsp = 1;
12492       mips_opts.ase_dspr2 = 0;
12493     }
12494   else if (strcmp (name, "nodsp") == 0)
12495     {
12496       mips_opts.ase_dsp = 0;
12497       mips_opts.ase_dspr2 = 0;
12498     }
12499   else if (strcmp (name, "dspr2") == 0)
12500     {
12501       if (!ISA_SUPPORTS_DSPR2_ASE)
12502         as_warn ("%s ISA does not support DSP R2 ASE",
12503                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12504       mips_opts.ase_dspr2 = 1;
12505       mips_opts.ase_dsp = 1;
12506     }
12507   else if (strcmp (name, "nodspr2") == 0)
12508     {
12509       mips_opts.ase_dspr2 = 0;
12510       mips_opts.ase_dsp = 0;
12511     }
12512   else if (strcmp (name, "mt") == 0)
12513     {
12514       if (!ISA_SUPPORTS_MT_ASE)
12515         as_warn ("%s ISA does not support MT ASE", 
12516                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12517       mips_opts.ase_mt = 1;
12518     }
12519   else if (strcmp (name, "nomt") == 0)
12520     mips_opts.ase_mt = 0;
12521   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12522     {
12523       int reset = 0;
12524
12525       /* Permit the user to change the ISA and architecture on the fly.
12526          Needless to say, misuse can cause serious problems.  */
12527       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12528         {
12529           reset = 1;
12530           mips_opts.isa = file_mips_isa;
12531           mips_opts.arch = file_mips_arch;
12532         }
12533       else if (strncmp (name, "arch=", 5) == 0)
12534         {
12535           const struct mips_cpu_info *p;
12536
12537           p = mips_parse_cpu("internal use", name + 5);
12538           if (!p)
12539             as_bad (_("unknown architecture %s"), name + 5);
12540           else
12541             {
12542               mips_opts.arch = p->cpu;
12543               mips_opts.isa = p->isa;
12544             }
12545         }
12546       else if (strncmp (name, "mips", 4) == 0)
12547         {
12548           const struct mips_cpu_info *p;
12549
12550           p = mips_parse_cpu("internal use", name);
12551           if (!p)
12552             as_bad (_("unknown ISA level %s"), name + 4);
12553           else
12554             {
12555               mips_opts.arch = p->cpu;
12556               mips_opts.isa = p->isa;
12557             }
12558         }
12559       else
12560         as_bad (_("unknown ISA or architecture %s"), name);
12561
12562       switch (mips_opts.isa)
12563         {
12564         case  0:
12565           break;
12566         case ISA_MIPS1:
12567         case ISA_MIPS2:
12568         case ISA_MIPS32:
12569         case ISA_MIPS32R2:
12570           mips_opts.gp32 = 1;
12571           mips_opts.fp32 = 1;
12572           break;
12573         case ISA_MIPS3:
12574         case ISA_MIPS4:
12575         case ISA_MIPS5:
12576         case ISA_MIPS64:
12577         case ISA_MIPS64R2:
12578           mips_opts.gp32 = 0;
12579           mips_opts.fp32 = 0;
12580           break;
12581         default:
12582           as_bad (_("unknown ISA level %s"), name + 4);
12583           break;
12584         }
12585       if (reset)
12586         {
12587           mips_opts.gp32 = file_mips_gp32;
12588           mips_opts.fp32 = file_mips_fp32;
12589         }
12590     }
12591   else if (strcmp (name, "autoextend") == 0)
12592     mips_opts.noautoextend = 0;
12593   else if (strcmp (name, "noautoextend") == 0)
12594     mips_opts.noautoextend = 1;
12595   else if (strcmp (name, "push") == 0)
12596     {
12597       struct mips_option_stack *s;
12598
12599       s = (struct mips_option_stack *) xmalloc (sizeof *s);
12600       s->next = mips_opts_stack;
12601       s->options = mips_opts;
12602       mips_opts_stack = s;
12603     }
12604   else if (strcmp (name, "pop") == 0)
12605     {
12606       struct mips_option_stack *s;
12607
12608       s = mips_opts_stack;
12609       if (s == NULL)
12610         as_bad (_(".set pop with no .set push"));
12611       else
12612         {
12613           /* If we're changing the reorder mode we need to handle
12614              delay slots correctly.  */
12615           if (s->options.noreorder && ! mips_opts.noreorder)
12616             start_noreorder ();
12617           else if (! s->options.noreorder && mips_opts.noreorder)
12618             end_noreorder ();
12619
12620           mips_opts = s->options;
12621           mips_opts_stack = s->next;
12622           free (s);
12623         }
12624     }
12625   else if (strcmp (name, "sym32") == 0)
12626     mips_opts.sym32 = TRUE;
12627   else if (strcmp (name, "nosym32") == 0)
12628     mips_opts.sym32 = FALSE;
12629   else if (strchr (name, ','))
12630     {
12631       /* Generic ".set" directive; use the generic handler.  */
12632       *input_line_pointer = ch;
12633       input_line_pointer = name;
12634       s_set (0);
12635       return;
12636     }
12637   else
12638     {
12639       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
12640     }
12641   *input_line_pointer = ch;
12642   demand_empty_rest_of_line ();
12643 }
12644
12645 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
12646    .option pic2.  It means to generate SVR4 PIC calls.  */
12647
12648 static void
12649 s_abicalls (int ignore ATTRIBUTE_UNUSED)
12650 {
12651   mips_pic = SVR4_PIC;
12652   mips_abicalls = TRUE;
12653
12654   if (g_switch_seen && g_switch_value != 0)
12655     as_warn (_("-G may not be used with SVR4 PIC code"));
12656   g_switch_value = 0;
12657
12658   bfd_set_gp_size (stdoutput, 0);
12659   demand_empty_rest_of_line ();
12660 }
12661
12662 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
12663    PIC code.  It sets the $gp register for the function based on the
12664    function address, which is in the register named in the argument.
12665    This uses a relocation against _gp_disp, which is handled specially
12666    by the linker.  The result is:
12667         lui     $gp,%hi(_gp_disp)
12668         addiu   $gp,$gp,%lo(_gp_disp)
12669         addu    $gp,$gp,.cpload argument
12670    The .cpload argument is normally $25 == $t9.
12671
12672    The -mno-shared option changes this to:
12673         lui     $gp,%hi(__gnu_local_gp)
12674         addiu   $gp,$gp,%lo(__gnu_local_gp)
12675    and the argument is ignored.  This saves an instruction, but the
12676    resulting code is not position independent; it uses an absolute
12677    address for __gnu_local_gp.  Thus code assembled with -mno-shared
12678    can go into an ordinary executable, but not into a shared library.  */
12679
12680 static void
12681 s_cpload (int ignore ATTRIBUTE_UNUSED)
12682 {
12683   expressionS ex;
12684   int reg;
12685   int in_shared;
12686
12687   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12688      .cpload is ignored.  */
12689   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12690     {
12691       s_ignore (0);
12692       return;
12693     }
12694
12695   /* .cpload should be in a .set noreorder section.  */
12696   if (mips_opts.noreorder == 0)
12697     as_warn (_(".cpload not in noreorder section"));
12698
12699   reg = tc_get_register (0);
12700
12701   /* If we need to produce a 64-bit address, we are better off using
12702      the default instruction sequence.  */
12703   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
12704
12705   ex.X_op = O_symbol;
12706   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
12707                                          "__gnu_local_gp");
12708   ex.X_op_symbol = NULL;
12709   ex.X_add_number = 0;
12710
12711   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12712   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12713
12714   macro_start ();
12715   macro_build_lui (&ex, mips_gp_register);
12716   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12717                mips_gp_register, BFD_RELOC_LO16);
12718   if (in_shared)
12719     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
12720                  mips_gp_register, reg);
12721   macro_end ();
12722
12723   demand_empty_rest_of_line ();
12724 }
12725
12726 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
12727      .cpsetup $reg1, offset|$reg2, label
12728
12729    If offset is given, this results in:
12730      sd         $gp, offset($sp)
12731      lui        $gp, %hi(%neg(%gp_rel(label)))
12732      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12733      daddu      $gp, $gp, $reg1
12734
12735    If $reg2 is given, this results in:
12736      daddu      $reg2, $gp, $0
12737      lui        $gp, %hi(%neg(%gp_rel(label)))
12738      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
12739      daddu      $gp, $gp, $reg1
12740    $reg1 is normally $25 == $t9.
12741
12742    The -mno-shared option replaces the last three instructions with
12743         lui     $gp,%hi(_gp)
12744         addiu   $gp,$gp,%lo(_gp)  */
12745
12746 static void
12747 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
12748 {
12749   expressionS ex_off;
12750   expressionS ex_sym;
12751   int reg1;
12752
12753   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
12754      We also need NewABI support.  */
12755   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12756     {
12757       s_ignore (0);
12758       return;
12759     }
12760
12761   reg1 = tc_get_register (0);
12762   SKIP_WHITESPACE ();
12763   if (*input_line_pointer != ',')
12764     {
12765       as_bad (_("missing argument separator ',' for .cpsetup"));
12766       return;
12767     }
12768   else
12769     ++input_line_pointer;
12770   SKIP_WHITESPACE ();
12771   if (*input_line_pointer == '$')
12772     {
12773       mips_cpreturn_register = tc_get_register (0);
12774       mips_cpreturn_offset = -1;
12775     }
12776   else
12777     {
12778       mips_cpreturn_offset = get_absolute_expression ();
12779       mips_cpreturn_register = -1;
12780     }
12781   SKIP_WHITESPACE ();
12782   if (*input_line_pointer != ',')
12783     {
12784       as_bad (_("missing argument separator ',' for .cpsetup"));
12785       return;
12786     }
12787   else
12788     ++input_line_pointer;
12789   SKIP_WHITESPACE ();
12790   expression (&ex_sym);
12791
12792   macro_start ();
12793   if (mips_cpreturn_register == -1)
12794     {
12795       ex_off.X_op = O_constant;
12796       ex_off.X_add_symbol = NULL;
12797       ex_off.X_op_symbol = NULL;
12798       ex_off.X_add_number = mips_cpreturn_offset;
12799
12800       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
12801                    BFD_RELOC_LO16, SP);
12802     }
12803   else
12804     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
12805                  mips_gp_register, 0);
12806
12807   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
12808     {
12809       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
12810                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
12811                    BFD_RELOC_HI16_S);
12812
12813       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
12814                    mips_gp_register, -1, BFD_RELOC_GPREL16,
12815                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
12816
12817       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
12818                    mips_gp_register, reg1);
12819     }
12820   else
12821     {
12822       expressionS ex;
12823
12824       ex.X_op = O_symbol;
12825       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
12826       ex.X_op_symbol = NULL;
12827       ex.X_add_number = 0;
12828
12829       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
12830       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
12831
12832       macro_build_lui (&ex, mips_gp_register);
12833       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
12834                    mips_gp_register, BFD_RELOC_LO16);
12835     }
12836
12837   macro_end ();
12838
12839   demand_empty_rest_of_line ();
12840 }
12841
12842 static void
12843 s_cplocal (int ignore ATTRIBUTE_UNUSED)
12844 {
12845   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
12846      .cplocal is ignored.  */
12847   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12848     {
12849       s_ignore (0);
12850       return;
12851     }
12852
12853   mips_gp_register = tc_get_register (0);
12854   demand_empty_rest_of_line ();
12855 }
12856
12857 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
12858    offset from $sp.  The offset is remembered, and after making a PIC
12859    call $gp is restored from that location.  */
12860
12861 static void
12862 s_cprestore (int ignore ATTRIBUTE_UNUSED)
12863 {
12864   expressionS ex;
12865
12866   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
12867      .cprestore is ignored.  */
12868   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
12869     {
12870       s_ignore (0);
12871       return;
12872     }
12873
12874   mips_cprestore_offset = get_absolute_expression ();
12875   mips_cprestore_valid = 1;
12876
12877   ex.X_op = O_constant;
12878   ex.X_add_symbol = NULL;
12879   ex.X_op_symbol = NULL;
12880   ex.X_add_number = mips_cprestore_offset;
12881
12882   macro_start ();
12883   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
12884                                 SP, HAVE_64BIT_ADDRESSES);
12885   macro_end ();
12886
12887   demand_empty_rest_of_line ();
12888 }
12889
12890 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
12891    was given in the preceding .cpsetup, it results in:
12892      ld         $gp, offset($sp)
12893
12894    If a register $reg2 was given there, it results in:
12895      daddu      $gp, $reg2, $0  */
12896
12897 static void
12898 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
12899 {
12900   expressionS ex;
12901
12902   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
12903      We also need NewABI support.  */
12904   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12905     {
12906       s_ignore (0);
12907       return;
12908     }
12909
12910   macro_start ();
12911   if (mips_cpreturn_register == -1)
12912     {
12913       ex.X_op = O_constant;
12914       ex.X_add_symbol = NULL;
12915       ex.X_op_symbol = NULL;
12916       ex.X_add_number = mips_cpreturn_offset;
12917
12918       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
12919     }
12920   else
12921     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
12922                  mips_cpreturn_register, 0);
12923   macro_end ();
12924
12925   demand_empty_rest_of_line ();
12926 }
12927
12928 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
12929    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
12930    use in DWARF debug information.  */
12931
12932 static void
12933 s_dtprel_internal (size_t bytes)
12934 {
12935   expressionS ex;
12936   char *p;
12937
12938   expression (&ex);
12939
12940   if (ex.X_op != O_symbol)
12941     {
12942       as_bad (_("Unsupported use of %s"), (bytes == 8
12943                                            ? ".dtpreldword"
12944                                            : ".dtprelword"));
12945       ignore_rest_of_line ();
12946     }
12947
12948   p = frag_more (bytes);
12949   md_number_to_chars (p, 0, bytes);
12950   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
12951                (bytes == 8
12952                 ? BFD_RELOC_MIPS_TLS_DTPREL64
12953                 : BFD_RELOC_MIPS_TLS_DTPREL32));
12954
12955   demand_empty_rest_of_line ();
12956 }
12957
12958 /* Handle .dtprelword.  */
12959
12960 static void
12961 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
12962 {
12963   s_dtprel_internal (4);
12964 }
12965
12966 /* Handle .dtpreldword.  */
12967
12968 static void
12969 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
12970 {
12971   s_dtprel_internal (8);
12972 }
12973
12974 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
12975    code.  It sets the offset to use in gp_rel relocations.  */
12976
12977 static void
12978 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
12979 {
12980   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
12981      We also need NewABI support.  */
12982   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
12983     {
12984       s_ignore (0);
12985       return;
12986     }
12987
12988   mips_gprel_offset = get_absolute_expression ();
12989
12990   demand_empty_rest_of_line ();
12991 }
12992
12993 /* Handle the .gpword pseudo-op.  This is used when generating PIC
12994    code.  It generates a 32 bit GP relative reloc.  */
12995
12996 static void
12997 s_gpword (int ignore ATTRIBUTE_UNUSED)
12998 {
12999   segment_info_type *si;
13000   struct insn_label_list *l;
13001   symbolS *label;
13002   expressionS ex;
13003   char *p;
13004
13005   /* When not generating PIC code, this is treated as .word.  */
13006   if (mips_pic != SVR4_PIC)
13007     {
13008       s_cons (2);
13009       return;
13010     }
13011
13012   si = seg_info (now_seg);
13013   l = si->label_list;
13014   label = l != NULL ? l->label : NULL;
13015   mips_emit_delays ();
13016   if (auto_align)
13017     mips_align (2, 0, label);
13018   mips_clear_insn_labels ();
13019
13020   expression (&ex);
13021
13022   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13023     {
13024       as_bad (_("Unsupported use of .gpword"));
13025       ignore_rest_of_line ();
13026     }
13027
13028   p = frag_more (4);
13029   md_number_to_chars (p, 0, 4);
13030   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13031                BFD_RELOC_GPREL32);
13032
13033   demand_empty_rest_of_line ();
13034 }
13035
13036 static void
13037 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13038 {
13039   segment_info_type *si;
13040   struct insn_label_list *l;
13041   symbolS *label;
13042   expressionS ex;
13043   char *p;
13044
13045   /* When not generating PIC code, this is treated as .dword.  */
13046   if (mips_pic != SVR4_PIC)
13047     {
13048       s_cons (3);
13049       return;
13050     }
13051
13052   si = seg_info (now_seg);
13053   l = si->label_list;
13054   label = l != NULL ? l->label : NULL;
13055   mips_emit_delays ();
13056   if (auto_align)
13057     mips_align (3, 0, label);
13058   mips_clear_insn_labels ();
13059
13060   expression (&ex);
13061
13062   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13063     {
13064       as_bad (_("Unsupported use of .gpdword"));
13065       ignore_rest_of_line ();
13066     }
13067
13068   p = frag_more (8);
13069   md_number_to_chars (p, 0, 8);
13070   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13071                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13072
13073   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13074   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13075            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13076
13077   demand_empty_rest_of_line ();
13078 }
13079
13080 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13081    tables in SVR4 PIC code.  */
13082
13083 static void
13084 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13085 {
13086   int reg;
13087
13088   /* This is ignored when not generating SVR4 PIC code.  */
13089   if (mips_pic != SVR4_PIC)
13090     {
13091       s_ignore (0);
13092       return;
13093     }
13094
13095   /* Add $gp to the register named as an argument.  */
13096   macro_start ();
13097   reg = tc_get_register (0);
13098   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13099   macro_end ();
13100
13101   demand_empty_rest_of_line ();
13102 }
13103
13104 /* Handle the .insn pseudo-op.  This marks instruction labels in
13105    mips16 mode.  This permits the linker to handle them specially,
13106    such as generating jalx instructions when needed.  We also make
13107    them odd for the duration of the assembly, in order to generate the
13108    right sort of code.  We will make them even in the adjust_symtab
13109    routine, while leaving them marked.  This is convenient for the
13110    debugger and the disassembler.  The linker knows to make them odd
13111    again.  */
13112
13113 static void
13114 s_insn (int ignore ATTRIBUTE_UNUSED)
13115 {
13116   mips16_mark_labels ();
13117
13118   demand_empty_rest_of_line ();
13119 }
13120
13121 /* Handle a .stabn directive.  We need these in order to mark a label
13122    as being a mips16 text label correctly.  Sometimes the compiler
13123    will emit a label, followed by a .stabn, and then switch sections.
13124    If the label and .stabn are in mips16 mode, then the label is
13125    really a mips16 text label.  */
13126
13127 static void
13128 s_mips_stab (int type)
13129 {
13130   if (type == 'n')
13131     mips16_mark_labels ();
13132
13133   s_stab (type);
13134 }
13135
13136 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13137
13138 static void
13139 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13140 {
13141   char *name;
13142   int c;
13143   symbolS *symbolP;
13144   expressionS exp;
13145
13146   name = input_line_pointer;
13147   c = get_symbol_end ();
13148   symbolP = symbol_find_or_make (name);
13149   S_SET_WEAK (symbolP);
13150   *input_line_pointer = c;
13151
13152   SKIP_WHITESPACE ();
13153
13154   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13155     {
13156       if (S_IS_DEFINED (symbolP))
13157         {
13158           as_bad ("ignoring attempt to redefine symbol %s",
13159                   S_GET_NAME (symbolP));
13160           ignore_rest_of_line ();
13161           return;
13162         }
13163
13164       if (*input_line_pointer == ',')
13165         {
13166           ++input_line_pointer;
13167           SKIP_WHITESPACE ();
13168         }
13169
13170       expression (&exp);
13171       if (exp.X_op != O_symbol)
13172         {
13173           as_bad ("bad .weakext directive");
13174           ignore_rest_of_line ();
13175           return;
13176         }
13177       symbol_set_value_expression (symbolP, &exp);
13178     }
13179
13180   demand_empty_rest_of_line ();
13181 }
13182
13183 /* Parse a register string into a number.  Called from the ECOFF code
13184    to parse .frame.  The argument is non-zero if this is the frame
13185    register, so that we can record it in mips_frame_reg.  */
13186
13187 int
13188 tc_get_register (int frame)
13189 {
13190   unsigned int reg;
13191
13192   SKIP_WHITESPACE ();
13193   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13194     reg = 0;
13195   if (frame)
13196     {
13197       mips_frame_reg = reg != 0 ? reg : SP;
13198       mips_frame_reg_valid = 1;
13199       mips_cprestore_valid = 0;
13200     }
13201   return reg;
13202 }
13203
13204 valueT
13205 md_section_align (asection *seg, valueT addr)
13206 {
13207   int align = bfd_get_section_alignment (stdoutput, seg);
13208
13209   if (IS_ELF)
13210     {
13211       /* We don't need to align ELF sections to the full alignment.
13212          However, Irix 5 may prefer that we align them at least to a 16
13213          byte boundary.  We don't bother to align the sections if we
13214          are targeted for an embedded system.  */
13215       if (strcmp (TARGET_OS, "elf") == 0)
13216         return addr;
13217       if (align > 4)
13218         align = 4;
13219     }
13220
13221   return ((addr + (1 << align) - 1) & (-1 << align));
13222 }
13223
13224 /* Utility routine, called from above as well.  If called while the
13225    input file is still being read, it's only an approximation.  (For
13226    example, a symbol may later become defined which appeared to be
13227    undefined earlier.)  */
13228
13229 static int
13230 nopic_need_relax (symbolS *sym, int before_relaxing)
13231 {
13232   if (sym == 0)
13233     return 0;
13234
13235   if (g_switch_value > 0)
13236     {
13237       const char *symname;
13238       int change;
13239
13240       /* Find out whether this symbol can be referenced off the $gp
13241          register.  It can be if it is smaller than the -G size or if
13242          it is in the .sdata or .sbss section.  Certain symbols can
13243          not be referenced off the $gp, although it appears as though
13244          they can.  */
13245       symname = S_GET_NAME (sym);
13246       if (symname != (const char *) NULL
13247           && (strcmp (symname, "eprol") == 0
13248               || strcmp (symname, "etext") == 0
13249               || strcmp (symname, "_gp") == 0
13250               || strcmp (symname, "edata") == 0
13251               || strcmp (symname, "_fbss") == 0
13252               || strcmp (symname, "_fdata") == 0
13253               || strcmp (symname, "_ftext") == 0
13254               || strcmp (symname, "end") == 0
13255               || strcmp (symname, "_gp_disp") == 0))
13256         change = 1;
13257       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13258                && (0
13259 #ifndef NO_ECOFF_DEBUGGING
13260                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13261                        && (symbol_get_obj (sym)->ecoff_extern_size
13262                            <= g_switch_value))
13263 #endif
13264                    /* We must defer this decision until after the whole
13265                       file has been read, since there might be a .extern
13266                       after the first use of this symbol.  */
13267                    || (before_relaxing
13268 #ifndef NO_ECOFF_DEBUGGING
13269                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13270 #endif
13271                        && S_GET_VALUE (sym) == 0)
13272                    || (S_GET_VALUE (sym) != 0
13273                        && S_GET_VALUE (sym) <= g_switch_value)))
13274         change = 0;
13275       else
13276         {
13277           const char *segname;
13278
13279           segname = segment_name (S_GET_SEGMENT (sym));
13280           assert (strcmp (segname, ".lit8") != 0
13281                   && strcmp (segname, ".lit4") != 0);
13282           change = (strcmp (segname, ".sdata") != 0
13283                     && strcmp (segname, ".sbss") != 0
13284                     && strncmp (segname, ".sdata.", 7) != 0
13285                     && strncmp (segname, ".sbss.", 6) != 0
13286                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13287                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13288         }
13289       return change;
13290     }
13291   else
13292     /* We are not optimizing for the $gp register.  */
13293     return 1;
13294 }
13295
13296
13297 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13298
13299 static bfd_boolean
13300 pic_need_relax (symbolS *sym, asection *segtype)
13301 {
13302   asection *symsec;
13303
13304   /* Handle the case of a symbol equated to another symbol.  */
13305   while (symbol_equated_reloc_p (sym))
13306     {
13307       symbolS *n;
13308
13309       /* It's possible to get a loop here in a badly written program.  */
13310       n = symbol_get_value_expression (sym)->X_add_symbol;
13311       if (n == sym)
13312         break;
13313       sym = n;
13314     }
13315
13316   if (symbol_section_p (sym))
13317     return TRUE;
13318
13319   symsec = S_GET_SEGMENT (sym);
13320
13321   /* This must duplicate the test in adjust_reloc_syms.  */
13322   return (symsec != &bfd_und_section
13323           && symsec != &bfd_abs_section
13324           && !bfd_is_com_section (symsec)
13325           && !s_is_linkonce (sym, segtype)
13326 #ifdef OBJ_ELF
13327           /* A global or weak symbol is treated as external.  */
13328           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13329 #endif
13330           );
13331 }
13332
13333
13334 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13335    extended opcode.  SEC is the section the frag is in.  */
13336
13337 static int
13338 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13339 {
13340   int type;
13341   const struct mips16_immed_operand *op;
13342   offsetT val;
13343   int mintiny, maxtiny;
13344   segT symsec;
13345   fragS *sym_frag;
13346
13347   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13348     return 0;
13349   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13350     return 1;
13351
13352   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13353   op = mips16_immed_operands;
13354   while (op->type != type)
13355     {
13356       ++op;
13357       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13358     }
13359
13360   if (op->unsp)
13361     {
13362       if (type == '<' || type == '>' || type == '[' || type == ']')
13363         {
13364           mintiny = 1;
13365           maxtiny = 1 << op->nbits;
13366         }
13367       else
13368         {
13369           mintiny = 0;
13370           maxtiny = (1 << op->nbits) - 1;
13371         }
13372     }
13373   else
13374     {
13375       mintiny = - (1 << (op->nbits - 1));
13376       maxtiny = (1 << (op->nbits - 1)) - 1;
13377     }
13378
13379   sym_frag = symbol_get_frag (fragp->fr_symbol);
13380   val = S_GET_VALUE (fragp->fr_symbol);
13381   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13382
13383   if (op->pcrel)
13384     {
13385       addressT addr;
13386
13387       /* We won't have the section when we are called from
13388          mips_relax_frag.  However, we will always have been called
13389          from md_estimate_size_before_relax first.  If this is a
13390          branch to a different section, we mark it as such.  If SEC is
13391          NULL, and the frag is not marked, then it must be a branch to
13392          the same section.  */
13393       if (sec == NULL)
13394         {
13395           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13396             return 1;
13397         }
13398       else
13399         {
13400           /* Must have been called from md_estimate_size_before_relax.  */
13401           if (symsec != sec)
13402             {
13403               fragp->fr_subtype =
13404                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13405
13406               /* FIXME: We should support this, and let the linker
13407                  catch branches and loads that are out of range.  */
13408               as_bad_where (fragp->fr_file, fragp->fr_line,
13409                             _("unsupported PC relative reference to different section"));
13410
13411               return 1;
13412             }
13413           if (fragp != sym_frag && sym_frag->fr_address == 0)
13414             /* Assume non-extended on the first relaxation pass.
13415                The address we have calculated will be bogus if this is
13416                a forward branch to another frag, as the forward frag
13417                will have fr_address == 0.  */
13418             return 0;
13419         }
13420
13421       /* In this case, we know for sure that the symbol fragment is in
13422          the same section.  If the relax_marker of the symbol fragment
13423          differs from the relax_marker of this fragment, we have not
13424          yet adjusted the symbol fragment fr_address.  We want to add
13425          in STRETCH in order to get a better estimate of the address.
13426          This particularly matters because of the shift bits.  */
13427       if (stretch != 0
13428           && sym_frag->relax_marker != fragp->relax_marker)
13429         {
13430           fragS *f;
13431
13432           /* Adjust stretch for any alignment frag.  Note that if have
13433              been expanding the earlier code, the symbol may be
13434              defined in what appears to be an earlier frag.  FIXME:
13435              This doesn't handle the fr_subtype field, which specifies
13436              a maximum number of bytes to skip when doing an
13437              alignment.  */
13438           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13439             {
13440               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13441                 {
13442                   if (stretch < 0)
13443                     stretch = - ((- stretch)
13444                                  & ~ ((1 << (int) f->fr_offset) - 1));
13445                   else
13446                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13447                   if (stretch == 0)
13448                     break;
13449                 }
13450             }
13451           if (f != NULL)
13452             val += stretch;
13453         }
13454
13455       addr = fragp->fr_address + fragp->fr_fix;
13456
13457       /* The base address rules are complicated.  The base address of
13458          a branch is the following instruction.  The base address of a
13459          PC relative load or add is the instruction itself, but if it
13460          is in a delay slot (in which case it can not be extended) use
13461          the address of the instruction whose delay slot it is in.  */
13462       if (type == 'p' || type == 'q')
13463         {
13464           addr += 2;
13465
13466           /* If we are currently assuming that this frag should be
13467              extended, then, the current address is two bytes
13468              higher.  */
13469           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13470             addr += 2;
13471
13472           /* Ignore the low bit in the target, since it will be set
13473              for a text label.  */
13474           if ((val & 1) != 0)
13475             --val;
13476         }
13477       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13478         addr -= 4;
13479       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13480         addr -= 2;
13481
13482       val -= addr & ~ ((1 << op->shift) - 1);
13483
13484       /* Branch offsets have an implicit 0 in the lowest bit.  */
13485       if (type == 'p' || type == 'q')
13486         val /= 2;
13487
13488       /* If any of the shifted bits are set, we must use an extended
13489          opcode.  If the address depends on the size of this
13490          instruction, this can lead to a loop, so we arrange to always
13491          use an extended opcode.  We only check this when we are in
13492          the main relaxation loop, when SEC is NULL.  */
13493       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13494         {
13495           fragp->fr_subtype =
13496             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13497           return 1;
13498         }
13499
13500       /* If we are about to mark a frag as extended because the value
13501          is precisely maxtiny + 1, then there is a chance of an
13502          infinite loop as in the following code:
13503              la $4,foo
13504              .skip      1020
13505              .align     2
13506            foo:
13507          In this case when the la is extended, foo is 0x3fc bytes
13508          away, so the la can be shrunk, but then foo is 0x400 away, so
13509          the la must be extended.  To avoid this loop, we mark the
13510          frag as extended if it was small, and is about to become
13511          extended with a value of maxtiny + 1.  */
13512       if (val == ((maxtiny + 1) << op->shift)
13513           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13514           && sec == NULL)
13515         {
13516           fragp->fr_subtype =
13517             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13518           return 1;
13519         }
13520     }
13521   else if (symsec != absolute_section && sec != NULL)
13522     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13523
13524   if ((val & ((1 << op->shift) - 1)) != 0
13525       || val < (mintiny << op->shift)
13526       || val > (maxtiny << op->shift))
13527     return 1;
13528   else
13529     return 0;
13530 }
13531
13532 /* Compute the length of a branch sequence, and adjust the
13533    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13534    worst-case length is computed, with UPDATE being used to indicate
13535    whether an unconditional (-1), branch-likely (+1) or regular (0)
13536    branch is to be computed.  */
13537 static int
13538 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13539 {
13540   bfd_boolean toofar;
13541   int length;
13542
13543   if (fragp
13544       && S_IS_DEFINED (fragp->fr_symbol)
13545       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13546     {
13547       addressT addr;
13548       offsetT val;
13549
13550       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13551
13552       addr = fragp->fr_address + fragp->fr_fix + 4;
13553
13554       val -= addr;
13555
13556       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13557     }
13558   else if (fragp)
13559     /* If the symbol is not defined or it's in a different segment,
13560        assume the user knows what's going on and emit a short
13561        branch.  */
13562     toofar = FALSE;
13563   else
13564     toofar = TRUE;
13565
13566   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13567     fragp->fr_subtype
13568       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13569                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13570                              RELAX_BRANCH_LINK (fragp->fr_subtype),
13571                              toofar);
13572
13573   length = 4;
13574   if (toofar)
13575     {
13576       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
13577         length += 8;
13578
13579       if (mips_pic != NO_PIC)
13580         {
13581           /* Additional space for PIC loading of target address.  */
13582           length += 8;
13583           if (mips_opts.isa == ISA_MIPS1)
13584             /* Additional space for $at-stabilizing nop.  */
13585             length += 4;
13586         }
13587
13588       /* If branch is conditional.  */
13589       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
13590         length += 8;
13591     }
13592
13593   return length;
13594 }
13595
13596 /* Estimate the size of a frag before relaxing.  Unless this is the
13597    mips16, we are not really relaxing here, and the final size is
13598    encoded in the subtype information.  For the mips16, we have to
13599    decide whether we are using an extended opcode or not.  */
13600
13601 int
13602 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
13603 {
13604   int change;
13605
13606   if (RELAX_BRANCH_P (fragp->fr_subtype))
13607     {
13608
13609       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
13610
13611       return fragp->fr_var;
13612     }
13613
13614   if (RELAX_MIPS16_P (fragp->fr_subtype))
13615     /* We don't want to modify the EXTENDED bit here; it might get us
13616        into infinite loops.  We change it only in mips_relax_frag().  */
13617     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
13618
13619   if (mips_pic == NO_PIC)
13620     change = nopic_need_relax (fragp->fr_symbol, 0);
13621   else if (mips_pic == SVR4_PIC)
13622     change = pic_need_relax (fragp->fr_symbol, segtype);
13623   else if (mips_pic == VXWORKS_PIC)
13624     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
13625     change = 0;
13626   else
13627     abort ();
13628
13629   if (change)
13630     {
13631       fragp->fr_subtype |= RELAX_USE_SECOND;
13632       return -RELAX_FIRST (fragp->fr_subtype);
13633     }
13634   else
13635     return -RELAX_SECOND (fragp->fr_subtype);
13636 }
13637
13638 /* This is called to see whether a reloc against a defined symbol
13639    should be converted into a reloc against a section.  */
13640
13641 int
13642 mips_fix_adjustable (fixS *fixp)
13643 {
13644   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
13645       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13646     return 0;
13647
13648   if (fixp->fx_addsy == NULL)
13649     return 1;
13650
13651   /* If symbol SYM is in a mergeable section, relocations of the form
13652      SYM + 0 can usually be made section-relative.  The mergeable data
13653      is then identified by the section offset rather than by the symbol.
13654
13655      However, if we're generating REL LO16 relocations, the offset is split
13656      between the LO16 and parterning high part relocation.  The linker will
13657      need to recalculate the complete offset in order to correctly identify
13658      the merge data.
13659
13660      The linker has traditionally not looked for the parterning high part
13661      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
13662      placed anywhere.  Rather than break backwards compatibility by changing
13663      this, it seems better not to force the issue, and instead keep the
13664      original symbol.  This will work with either linker behavior.  */
13665   if ((fixp->fx_r_type == BFD_RELOC_LO16
13666        || fixp->fx_r_type == BFD_RELOC_MIPS16_LO16
13667        || reloc_needs_lo_p (fixp->fx_r_type))
13668       && HAVE_IN_PLACE_ADDENDS
13669       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
13670     return 0;
13671
13672 #ifdef OBJ_ELF
13673   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
13674      to a floating-point stub.  The same is true for non-R_MIPS16_26
13675      relocations against MIPS16 functions; in this case, the stub becomes
13676      the function's canonical address.
13677
13678      Floating-point stubs are stored in unique .mips16.call.* or
13679      .mips16.fn.* sections.  If a stub T for function F is in section S,
13680      the first relocation in section S must be against F; this is how the
13681      linker determines the target function.  All relocations that might
13682      resolve to T must also be against F.  We therefore have the following
13683      restrictions, which are given in an intentionally-redundant way:
13684
13685        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
13686           symbols.
13687
13688        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
13689           if that stub might be used.
13690
13691        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
13692           symbols.
13693
13694        4. We cannot reduce a stub's relocations against MIPS16 symbols if
13695           that stub might be used.
13696
13697      There is a further restriction:
13698
13699        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
13700           on targets with in-place addends; the relocation field cannot
13701           encode the low bit.
13702
13703      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
13704      against a MIPS16 symbol.
13705
13706      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
13707      relocation against some symbol R, no relocation against R may be
13708      reduced.  (Note that this deals with (2) as well as (1) because
13709      relocations against global symbols will never be reduced on ELF
13710      targets.)  This approach is a little simpler than trying to detect
13711      stub sections, and gives the "all or nothing" per-symbol consistency
13712      that we have for MIPS16 symbols.  */
13713   if (IS_ELF
13714       && fixp->fx_subsy == NULL
13715       && (S_GET_OTHER (fixp->fx_addsy) == STO_MIPS16
13716           || *symbol_get_tc (fixp->fx_addsy)))
13717     return 0;
13718 #endif
13719
13720   return 1;
13721 }
13722
13723 /* Translate internal representation of relocation info to BFD target
13724    format.  */
13725
13726 arelent **
13727 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
13728 {
13729   static arelent *retval[4];
13730   arelent *reloc;
13731   bfd_reloc_code_real_type code;
13732
13733   memset (retval, 0, sizeof(retval));
13734   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
13735   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
13736   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
13737   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
13738
13739   if (fixp->fx_pcrel)
13740     {
13741       assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
13742
13743       /* At this point, fx_addnumber is "symbol offset - pcrel address".
13744          Relocations want only the symbol offset.  */
13745       reloc->addend = fixp->fx_addnumber + reloc->address;
13746       if (!IS_ELF)
13747         {
13748           /* A gruesome hack which is a result of the gruesome gas
13749              reloc handling.  What's worse, for COFF (as opposed to
13750              ECOFF), we might need yet another copy of reloc->address.
13751              See bfd_install_relocation.  */
13752           reloc->addend += reloc->address;
13753         }
13754     }
13755   else
13756     reloc->addend = fixp->fx_addnumber;
13757
13758   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
13759      entry to be used in the relocation's section offset.  */
13760   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
13761     {
13762       reloc->address = reloc->addend;
13763       reloc->addend = 0;
13764     }
13765
13766   code = fixp->fx_r_type;
13767
13768   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
13769   if (reloc->howto == NULL)
13770     {
13771       as_bad_where (fixp->fx_file, fixp->fx_line,
13772                     _("Can not represent %s relocation in this object file format"),
13773                     bfd_get_reloc_code_name (code));
13774       retval[0] = NULL;
13775     }
13776
13777   return retval;
13778 }
13779
13780 /* Relax a machine dependent frag.  This returns the amount by which
13781    the current size of the frag should change.  */
13782
13783 int
13784 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
13785 {
13786   if (RELAX_BRANCH_P (fragp->fr_subtype))
13787     {
13788       offsetT old_var = fragp->fr_var;
13789
13790       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
13791
13792       return fragp->fr_var - old_var;
13793     }
13794
13795   if (! RELAX_MIPS16_P (fragp->fr_subtype))
13796     return 0;
13797
13798   if (mips16_extended_frag (fragp, NULL, stretch))
13799     {
13800       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13801         return 0;
13802       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
13803       return 2;
13804     }
13805   else
13806     {
13807       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13808         return 0;
13809       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
13810       return -2;
13811     }
13812
13813   return 0;
13814 }
13815
13816 /* Convert a machine dependent frag.  */
13817
13818 void
13819 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
13820 {
13821   if (RELAX_BRANCH_P (fragp->fr_subtype))
13822     {
13823       bfd_byte *buf;
13824       unsigned long insn;
13825       expressionS exp;
13826       fixS *fixp;
13827
13828       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
13829
13830       if (target_big_endian)
13831         insn = bfd_getb32 (buf);
13832       else
13833         insn = bfd_getl32 (buf);
13834
13835       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13836         {
13837           /* We generate a fixup instead of applying it right now
13838              because, if there are linker relaxations, we're going to
13839              need the relocations.  */
13840           exp.X_op = O_symbol;
13841           exp.X_add_symbol = fragp->fr_symbol;
13842           exp.X_add_number = fragp->fr_offset;
13843
13844           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13845                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
13846           fixp->fx_file = fragp->fr_file;
13847           fixp->fx_line = fragp->fr_line;
13848
13849           md_number_to_chars ((char *) buf, insn, 4);
13850           buf += 4;
13851         }
13852       else
13853         {
13854           int i;
13855
13856           as_warn_where (fragp->fr_file, fragp->fr_line,
13857                          _("relaxed out-of-range branch into a jump"));
13858
13859           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
13860             goto uncond;
13861
13862           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13863             {
13864               /* Reverse the branch.  */
13865               switch ((insn >> 28) & 0xf)
13866                 {
13867                 case 4:
13868                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
13869                      have the condition reversed by tweaking a single
13870                      bit, and their opcodes all have 0x4???????.  */
13871                   assert ((insn & 0xf1000000) == 0x41000000);
13872                   insn ^= 0x00010000;
13873                   break;
13874
13875                 case 0:
13876                   /* bltz       0x04000000      bgez    0x04010000
13877                      bltzal     0x04100000      bgezal  0x04110000  */
13878                   assert ((insn & 0xfc0e0000) == 0x04000000);
13879                   insn ^= 0x00010000;
13880                   break;
13881
13882                 case 1:
13883                   /* beq        0x10000000      bne     0x14000000
13884                      blez       0x18000000      bgtz    0x1c000000  */
13885                   insn ^= 0x04000000;
13886                   break;
13887
13888                 default:
13889                   abort ();
13890                 }
13891             }
13892
13893           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
13894             {
13895               /* Clear the and-link bit.  */
13896               assert ((insn & 0xfc1c0000) == 0x04100000);
13897
13898               /* bltzal         0x04100000      bgezal  0x04110000
13899                  bltzall        0x04120000      bgezall 0x04130000  */
13900               insn &= ~0x00100000;
13901             }
13902
13903           /* Branch over the branch (if the branch was likely) or the
13904              full jump (not likely case).  Compute the offset from the
13905              current instruction to branch to.  */
13906           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13907             i = 16;
13908           else
13909             {
13910               /* How many bytes in instructions we've already emitted?  */
13911               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13912               /* How many bytes in instructions from here to the end?  */
13913               i = fragp->fr_var - i;
13914             }
13915           /* Convert to instruction count.  */
13916           i >>= 2;
13917           /* Branch counts from the next instruction.  */
13918           i--;
13919           insn |= i;
13920           /* Branch over the jump.  */
13921           md_number_to_chars ((char *) buf, insn, 4);
13922           buf += 4;
13923
13924           /* nop */
13925           md_number_to_chars ((char *) buf, 0, 4);
13926           buf += 4;
13927
13928           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
13929             {
13930               /* beql $0, $0, 2f */
13931               insn = 0x50000000;
13932               /* Compute the PC offset from the current instruction to
13933                  the end of the variable frag.  */
13934               /* How many bytes in instructions we've already emitted?  */
13935               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
13936               /* How many bytes in instructions from here to the end?  */
13937               i = fragp->fr_var - i;
13938               /* Convert to instruction count.  */
13939               i >>= 2;
13940               /* Don't decrement i, because we want to branch over the
13941                  delay slot.  */
13942
13943               insn |= i;
13944               md_number_to_chars ((char *) buf, insn, 4);
13945               buf += 4;
13946
13947               md_number_to_chars ((char *) buf, 0, 4);
13948               buf += 4;
13949             }
13950
13951         uncond:
13952           if (mips_pic == NO_PIC)
13953             {
13954               /* j or jal.  */
13955               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
13956                       ? 0x0c000000 : 0x08000000);
13957               exp.X_op = O_symbol;
13958               exp.X_add_symbol = fragp->fr_symbol;
13959               exp.X_add_number = fragp->fr_offset;
13960
13961               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13962                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
13963               fixp->fx_file = fragp->fr_file;
13964               fixp->fx_line = fragp->fr_line;
13965
13966               md_number_to_chars ((char *) buf, insn, 4);
13967               buf += 4;
13968             }
13969           else
13970             {
13971               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
13972               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
13973               exp.X_op = O_symbol;
13974               exp.X_add_symbol = fragp->fr_symbol;
13975               exp.X_add_number = fragp->fr_offset;
13976
13977               if (fragp->fr_offset)
13978                 {
13979                   exp.X_add_symbol = make_expr_symbol (&exp);
13980                   exp.X_add_number = 0;
13981                 }
13982
13983               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
13984                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
13985               fixp->fx_file = fragp->fr_file;
13986               fixp->fx_line = fragp->fr_line;
13987
13988               md_number_to_chars ((char *) buf, insn, 4);
13989               buf += 4;
13990
13991               if (mips_opts.isa == ISA_MIPS1)
13992                 {
13993                   /* nop */
13994                   md_number_to_chars ((char *) buf, 0, 4);
13995                   buf += 4;
13996                 }
13997
13998               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
13999               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14000
14001               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14002                                   4, &exp, FALSE, BFD_RELOC_LO16);
14003               fixp->fx_file = fragp->fr_file;
14004               fixp->fx_line = fragp->fr_line;
14005
14006               md_number_to_chars ((char *) buf, insn, 4);
14007               buf += 4;
14008
14009               /* j(al)r $at.  */
14010               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14011                 insn = 0x0020f809;
14012               else
14013                 insn = 0x00200008;
14014
14015               md_number_to_chars ((char *) buf, insn, 4);
14016               buf += 4;
14017             }
14018         }
14019
14020       assert (buf == (bfd_byte *)fragp->fr_literal
14021               + fragp->fr_fix + fragp->fr_var);
14022
14023       fragp->fr_fix += fragp->fr_var;
14024
14025       return;
14026     }
14027
14028   if (RELAX_MIPS16_P (fragp->fr_subtype))
14029     {
14030       int type;
14031       const struct mips16_immed_operand *op;
14032       bfd_boolean small, ext;
14033       offsetT val;
14034       bfd_byte *buf;
14035       unsigned long insn;
14036       bfd_boolean use_extend;
14037       unsigned short extend;
14038
14039       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14040       op = mips16_immed_operands;
14041       while (op->type != type)
14042         ++op;
14043
14044       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14045         {
14046           small = FALSE;
14047           ext = TRUE;
14048         }
14049       else
14050         {
14051           small = TRUE;
14052           ext = FALSE;
14053         }
14054
14055       resolve_symbol_value (fragp->fr_symbol);
14056       val = S_GET_VALUE (fragp->fr_symbol);
14057       if (op->pcrel)
14058         {
14059           addressT addr;
14060
14061           addr = fragp->fr_address + fragp->fr_fix;
14062
14063           /* The rules for the base address of a PC relative reloc are
14064              complicated; see mips16_extended_frag.  */
14065           if (type == 'p' || type == 'q')
14066             {
14067               addr += 2;
14068               if (ext)
14069                 addr += 2;
14070               /* Ignore the low bit in the target, since it will be
14071                  set for a text label.  */
14072               if ((val & 1) != 0)
14073                 --val;
14074             }
14075           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14076             addr -= 4;
14077           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14078             addr -= 2;
14079
14080           addr &= ~ (addressT) ((1 << op->shift) - 1);
14081           val -= addr;
14082
14083           /* Make sure the section winds up with the alignment we have
14084              assumed.  */
14085           if (op->shift > 0)
14086             record_alignment (asec, op->shift);
14087         }
14088
14089       if (ext
14090           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14091               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14092         as_warn_where (fragp->fr_file, fragp->fr_line,
14093                        _("extended instruction in delay slot"));
14094
14095       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14096
14097       if (target_big_endian)
14098         insn = bfd_getb16 (buf);
14099       else
14100         insn = bfd_getl16 (buf);
14101
14102       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14103                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14104                     small, ext, &insn, &use_extend, &extend);
14105
14106       if (use_extend)
14107         {
14108           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14109           fragp->fr_fix += 2;
14110           buf += 2;
14111         }
14112
14113       md_number_to_chars ((char *) buf, insn, 2);
14114       fragp->fr_fix += 2;
14115       buf += 2;
14116     }
14117   else
14118     {
14119       int first, second;
14120       fixS *fixp;
14121
14122       first = RELAX_FIRST (fragp->fr_subtype);
14123       second = RELAX_SECOND (fragp->fr_subtype);
14124       fixp = (fixS *) fragp->fr_opcode;
14125
14126       /* Possibly emit a warning if we've chosen the longer option.  */
14127       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14128           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14129         {
14130           const char *msg = macro_warning (fragp->fr_subtype);
14131           if (msg != 0)
14132             as_warn_where (fragp->fr_file, fragp->fr_line, msg);
14133         }
14134
14135       /* Go through all the fixups for the first sequence.  Disable them
14136          (by marking them as done) if we're going to use the second
14137          sequence instead.  */
14138       while (fixp
14139              && fixp->fx_frag == fragp
14140              && fixp->fx_where < fragp->fr_fix - second)
14141         {
14142           if (fragp->fr_subtype & RELAX_USE_SECOND)
14143             fixp->fx_done = 1;
14144           fixp = fixp->fx_next;
14145         }
14146
14147       /* Go through the fixups for the second sequence.  Disable them if
14148          we're going to use the first sequence, otherwise adjust their
14149          addresses to account for the relaxation.  */
14150       while (fixp && fixp->fx_frag == fragp)
14151         {
14152           if (fragp->fr_subtype & RELAX_USE_SECOND)
14153             fixp->fx_where -= first;
14154           else
14155             fixp->fx_done = 1;
14156           fixp = fixp->fx_next;
14157         }
14158
14159       /* Now modify the frag contents.  */
14160       if (fragp->fr_subtype & RELAX_USE_SECOND)
14161         {
14162           char *start;
14163
14164           start = fragp->fr_literal + fragp->fr_fix - first - second;
14165           memmove (start, start + first, second);
14166           fragp->fr_fix -= first;
14167         }
14168       else
14169         fragp->fr_fix -= second;
14170     }
14171 }
14172
14173 #ifdef OBJ_ELF
14174
14175 /* This function is called after the relocs have been generated.
14176    We've been storing mips16 text labels as odd.  Here we convert them
14177    back to even for the convenience of the debugger.  */
14178
14179 void
14180 mips_frob_file_after_relocs (void)
14181 {
14182   asymbol **syms;
14183   unsigned int count, i;
14184
14185   if (!IS_ELF)
14186     return;
14187
14188   syms = bfd_get_outsymbols (stdoutput);
14189   count = bfd_get_symcount (stdoutput);
14190   for (i = 0; i < count; i++, syms++)
14191     {
14192       if (elf_symbol (*syms)->internal_elf_sym.st_other == STO_MIPS16
14193           && ((*syms)->value & 1) != 0)
14194         {
14195           (*syms)->value &= ~1;
14196           /* If the symbol has an odd size, it was probably computed
14197              incorrectly, so adjust that as well.  */
14198           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14199             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14200         }
14201     }
14202 }
14203
14204 #endif
14205
14206 /* This function is called whenever a label is defined.  It is used
14207    when handling branch delays; if a branch has a label, we assume we
14208    can not move it.  */
14209
14210 void
14211 mips_define_label (symbolS *sym)
14212 {
14213   segment_info_type *si = seg_info (now_seg);
14214   struct insn_label_list *l;
14215
14216   if (free_insn_labels == NULL)
14217     l = (struct insn_label_list *) xmalloc (sizeof *l);
14218   else
14219     {
14220       l = free_insn_labels;
14221       free_insn_labels = l->next;
14222     }
14223
14224   l->label = sym;
14225   l->next = si->label_list;
14226   si->label_list = l;
14227
14228 #ifdef OBJ_ELF
14229   dwarf2_emit_label (sym);
14230 #endif
14231 }
14232 \f
14233 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14234
14235 /* Some special processing for a MIPS ELF file.  */
14236
14237 void
14238 mips_elf_final_processing (void)
14239 {
14240   /* Write out the register information.  */
14241   if (mips_abi != N64_ABI)
14242     {
14243       Elf32_RegInfo s;
14244
14245       s.ri_gprmask = mips_gprmask;
14246       s.ri_cprmask[0] = mips_cprmask[0];
14247       s.ri_cprmask[1] = mips_cprmask[1];
14248       s.ri_cprmask[2] = mips_cprmask[2];
14249       s.ri_cprmask[3] = mips_cprmask[3];
14250       /* The gp_value field is set by the MIPS ELF backend.  */
14251
14252       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14253                                        ((Elf32_External_RegInfo *)
14254                                         mips_regmask_frag));
14255     }
14256   else
14257     {
14258       Elf64_Internal_RegInfo s;
14259
14260       s.ri_gprmask = mips_gprmask;
14261       s.ri_pad = 0;
14262       s.ri_cprmask[0] = mips_cprmask[0];
14263       s.ri_cprmask[1] = mips_cprmask[1];
14264       s.ri_cprmask[2] = mips_cprmask[2];
14265       s.ri_cprmask[3] = mips_cprmask[3];
14266       /* The gp_value field is set by the MIPS ELF backend.  */
14267
14268       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14269                                        ((Elf64_External_RegInfo *)
14270                                         mips_regmask_frag));
14271     }
14272
14273   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14274      sort of BFD interface for this.  */
14275   if (mips_any_noreorder)
14276     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14277   if (mips_pic != NO_PIC)
14278     {
14279     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14280       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14281     }
14282   if (mips_abicalls)
14283     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14284
14285   /* Set MIPS ELF flags for ASEs.  */
14286   /* We may need to define a new flag for DSP ASE, and set this flag when
14287      file_ase_dsp is true.  */
14288   /* Same for DSP R2.  */
14289   /* We may need to define a new flag for MT ASE, and set this flag when
14290      file_ase_mt is true.  */
14291   if (file_ase_mips16)
14292     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14293 #if 0 /* XXX FIXME */
14294   if (file_ase_mips3d)
14295     elf_elfheader (stdoutput)->e_flags |= ???;
14296 #endif
14297   if (file_ase_mdmx)
14298     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14299
14300   /* Set the MIPS ELF ABI flags.  */
14301   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14302     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14303   else if (mips_abi == O64_ABI)
14304     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14305   else if (mips_abi == EABI_ABI)
14306     {
14307       if (!file_mips_gp32)
14308         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14309       else
14310         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14311     }
14312   else if (mips_abi == N32_ABI)
14313     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14314
14315   /* Nothing to do for N64_ABI.  */
14316
14317   if (mips_32bitmode)
14318     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14319
14320 #if 0 /* XXX FIXME */
14321   /* 32 bit code with 64 bit FP registers.  */
14322   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14323     elf_elfheader (stdoutput)->e_flags |= ???;
14324 #endif
14325 }
14326
14327 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14328 \f
14329 typedef struct proc {
14330   symbolS *func_sym;
14331   symbolS *func_end_sym;
14332   unsigned long reg_mask;
14333   unsigned long reg_offset;
14334   unsigned long fpreg_mask;
14335   unsigned long fpreg_offset;
14336   unsigned long frame_offset;
14337   unsigned long frame_reg;
14338   unsigned long pc_reg;
14339 } procS;
14340
14341 static procS cur_proc;
14342 static procS *cur_proc_ptr;
14343 static int numprocs;
14344
14345 /* Fill in an rs_align_code fragment.  */
14346
14347 void
14348 mips_handle_align (fragS *fragp)
14349 {
14350   if (fragp->fr_type != rs_align_code)
14351     return;
14352
14353   if (mips_opts.mips16)
14354     {
14355       static const unsigned char be_nop[] = { 0x65, 0x00 };
14356       static const unsigned char le_nop[] = { 0x00, 0x65 };
14357
14358       int bytes;
14359       char *p;
14360
14361       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14362       p = fragp->fr_literal + fragp->fr_fix;
14363
14364       if (bytes & 1)
14365         {
14366           *p++ = 0;
14367           fragp->fr_fix++;
14368         }
14369
14370       memcpy (p, (target_big_endian ? be_nop : le_nop), 2);
14371       fragp->fr_var = 2;
14372     }
14373
14374   /* For mips32, a nop is a zero, which we trivially get by doing nothing.  */
14375 }
14376
14377 static void
14378 md_obj_begin (void)
14379 {
14380 }
14381
14382 static void
14383 md_obj_end (void)
14384 {
14385   /* Check for premature end, nesting errors, etc.  */
14386   if (cur_proc_ptr)
14387     as_warn (_("missing .end at end of assembly"));
14388 }
14389
14390 static long
14391 get_number (void)
14392 {
14393   int negative = 0;
14394   long val = 0;
14395
14396   if (*input_line_pointer == '-')
14397     {
14398       ++input_line_pointer;
14399       negative = 1;
14400     }
14401   if (!ISDIGIT (*input_line_pointer))
14402     as_bad (_("expected simple number"));
14403   if (input_line_pointer[0] == '0')
14404     {
14405       if (input_line_pointer[1] == 'x')
14406         {
14407           input_line_pointer += 2;
14408           while (ISXDIGIT (*input_line_pointer))
14409             {
14410               val <<= 4;
14411               val |= hex_value (*input_line_pointer++);
14412             }
14413           return negative ? -val : val;
14414         }
14415       else
14416         {
14417           ++input_line_pointer;
14418           while (ISDIGIT (*input_line_pointer))
14419             {
14420               val <<= 3;
14421               val |= *input_line_pointer++ - '0';
14422             }
14423           return negative ? -val : val;
14424         }
14425     }
14426   if (!ISDIGIT (*input_line_pointer))
14427     {
14428       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14429               *input_line_pointer, *input_line_pointer);
14430       as_warn (_("invalid number"));
14431       return -1;
14432     }
14433   while (ISDIGIT (*input_line_pointer))
14434     {
14435       val *= 10;
14436       val += *input_line_pointer++ - '0';
14437     }
14438   return negative ? -val : val;
14439 }
14440
14441 /* The .file directive; just like the usual .file directive, but there
14442    is an initial number which is the ECOFF file index.  In the non-ECOFF
14443    case .file implies DWARF-2.  */
14444
14445 static void
14446 s_mips_file (int x ATTRIBUTE_UNUSED)
14447 {
14448   static int first_file_directive = 0;
14449
14450   if (ECOFF_DEBUGGING)
14451     {
14452       get_number ();
14453       s_app_file (0);
14454     }
14455   else
14456     {
14457       char *filename;
14458
14459       filename = dwarf2_directive_file (0);
14460
14461       /* Versions of GCC up to 3.1 start files with a ".file"
14462          directive even for stabs output.  Make sure that this
14463          ".file" is handled.  Note that you need a version of GCC
14464          after 3.1 in order to support DWARF-2 on MIPS.  */
14465       if (filename != NULL && ! first_file_directive)
14466         {
14467           (void) new_logical_line (filename, -1);
14468           s_app_file_string (filename, 0);
14469         }
14470       first_file_directive = 1;
14471     }
14472 }
14473
14474 /* The .loc directive, implying DWARF-2.  */
14475
14476 static void
14477 s_mips_loc (int x ATTRIBUTE_UNUSED)
14478 {
14479   if (!ECOFF_DEBUGGING)
14480     dwarf2_directive_loc (0);
14481 }
14482
14483 /* The .end directive.  */
14484
14485 static void
14486 s_mips_end (int x ATTRIBUTE_UNUSED)
14487 {
14488   symbolS *p;
14489
14490   /* Following functions need their own .frame and .cprestore directives.  */
14491   mips_frame_reg_valid = 0;
14492   mips_cprestore_valid = 0;
14493
14494   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14495     {
14496       p = get_symbol ();
14497       demand_empty_rest_of_line ();
14498     }
14499   else
14500     p = NULL;
14501
14502   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14503     as_warn (_(".end not in text section"));
14504
14505   if (!cur_proc_ptr)
14506     {
14507       as_warn (_(".end directive without a preceding .ent directive."));
14508       demand_empty_rest_of_line ();
14509       return;
14510     }
14511
14512   if (p != NULL)
14513     {
14514       assert (S_GET_NAME (p));
14515       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14516         as_warn (_(".end symbol does not match .ent symbol."));
14517
14518       if (debug_type == DEBUG_STABS)
14519         stabs_generate_asm_endfunc (S_GET_NAME (p),
14520                                     S_GET_NAME (p));
14521     }
14522   else
14523     as_warn (_(".end directive missing or unknown symbol"));
14524
14525 #ifdef OBJ_ELF
14526   /* Create an expression to calculate the size of the function.  */
14527   if (p && cur_proc_ptr)
14528     {
14529       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14530       expressionS *exp = xmalloc (sizeof (expressionS));
14531
14532       obj->size = exp;
14533       exp->X_op = O_subtract;
14534       exp->X_add_symbol = symbol_temp_new_now ();
14535       exp->X_op_symbol = p;
14536       exp->X_add_number = 0;
14537
14538       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14539     }
14540
14541   /* Generate a .pdr section.  */
14542   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14543     {
14544       segT saved_seg = now_seg;
14545       subsegT saved_subseg = now_subseg;
14546       valueT dot;
14547       expressionS exp;
14548       char *fragp;
14549
14550       dot = frag_now_fix ();
14551
14552 #ifdef md_flush_pending_output
14553       md_flush_pending_output ();
14554 #endif
14555
14556       assert (pdr_seg);
14557       subseg_set (pdr_seg, 0);
14558
14559       /* Write the symbol.  */
14560       exp.X_op = O_symbol;
14561       exp.X_add_symbol = p;
14562       exp.X_add_number = 0;
14563       emit_expr (&exp, 4);
14564
14565       fragp = frag_more (7 * 4);
14566
14567       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14568       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14569       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14570       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14571       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14572       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14573       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14574
14575       subseg_set (saved_seg, saved_subseg);
14576     }
14577 #endif /* OBJ_ELF */
14578
14579   cur_proc_ptr = NULL;
14580 }
14581
14582 /* The .aent and .ent directives.  */
14583
14584 static void
14585 s_mips_ent (int aent)
14586 {
14587   symbolS *symbolP;
14588
14589   symbolP = get_symbol ();
14590   if (*input_line_pointer == ',')
14591     ++input_line_pointer;
14592   SKIP_WHITESPACE ();
14593   if (ISDIGIT (*input_line_pointer)
14594       || *input_line_pointer == '-')
14595     get_number ();
14596
14597   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14598     as_warn (_(".ent or .aent not in text section."));
14599
14600   if (!aent && cur_proc_ptr)
14601     as_warn (_("missing .end"));
14602
14603   if (!aent)
14604     {
14605       /* This function needs its own .frame and .cprestore directives.  */
14606       mips_frame_reg_valid = 0;
14607       mips_cprestore_valid = 0;
14608
14609       cur_proc_ptr = &cur_proc;
14610       memset (cur_proc_ptr, '\0', sizeof (procS));
14611
14612       cur_proc_ptr->func_sym = symbolP;
14613
14614       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14615
14616       ++numprocs;
14617
14618       if (debug_type == DEBUG_STABS)
14619         stabs_generate_asm_func (S_GET_NAME (symbolP),
14620                                  S_GET_NAME (symbolP));
14621     }
14622
14623   demand_empty_rest_of_line ();
14624 }
14625
14626 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14627    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14628    s_mips_frame is used so that we can set the PDR information correctly.
14629    We can't use the ecoff routines because they make reference to the ecoff
14630    symbol table (in the mdebug section).  */
14631
14632 static void
14633 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14634 {
14635 #ifdef OBJ_ELF
14636   if (IS_ELF && !ECOFF_DEBUGGING)
14637     {
14638       long val;
14639
14640       if (cur_proc_ptr == (procS *) NULL)
14641         {
14642           as_warn (_(".frame outside of .ent"));
14643           demand_empty_rest_of_line ();
14644           return;
14645         }
14646
14647       cur_proc_ptr->frame_reg = tc_get_register (1);
14648
14649       SKIP_WHITESPACE ();
14650       if (*input_line_pointer++ != ','
14651           || get_absolute_expression_and_terminator (&val) != ',')
14652         {
14653           as_warn (_("Bad .frame directive"));
14654           --input_line_pointer;
14655           demand_empty_rest_of_line ();
14656           return;
14657         }
14658
14659       cur_proc_ptr->frame_offset = val;
14660       cur_proc_ptr->pc_reg = tc_get_register (0);
14661
14662       demand_empty_rest_of_line ();
14663     }
14664   else
14665 #endif /* OBJ_ELF */
14666     s_ignore (ignore);
14667 }
14668
14669 /* The .fmask and .mask directives. If the mdebug section is present
14670    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14671    embedded targets, s_mips_mask is used so that we can set the PDR
14672    information correctly. We can't use the ecoff routines because they
14673    make reference to the ecoff symbol table (in the mdebug section).  */
14674
14675 static void
14676 s_mips_mask (int reg_type)
14677 {
14678 #ifdef OBJ_ELF
14679   if (IS_ELF && !ECOFF_DEBUGGING)
14680     {
14681       long mask, off;
14682
14683       if (cur_proc_ptr == (procS *) NULL)
14684         {
14685           as_warn (_(".mask/.fmask outside of .ent"));
14686           demand_empty_rest_of_line ();
14687           return;
14688         }
14689
14690       if (get_absolute_expression_and_terminator (&mask) != ',')
14691         {
14692           as_warn (_("Bad .mask/.fmask directive"));
14693           --input_line_pointer;
14694           demand_empty_rest_of_line ();
14695           return;
14696         }
14697
14698       off = get_absolute_expression ();
14699
14700       if (reg_type == 'F')
14701         {
14702           cur_proc_ptr->fpreg_mask = mask;
14703           cur_proc_ptr->fpreg_offset = off;
14704         }
14705       else
14706         {
14707           cur_proc_ptr->reg_mask = mask;
14708           cur_proc_ptr->reg_offset = off;
14709         }
14710
14711       demand_empty_rest_of_line ();
14712     }
14713   else
14714 #endif /* OBJ_ELF */
14715     s_ignore (reg_type);
14716 }
14717
14718 /* A table describing all the processors gas knows about.  Names are
14719    matched in the order listed.
14720
14721    To ease comparison, please keep this table in the same order as
14722    gcc's mips_cpu_info_table[].  */
14723 static const struct mips_cpu_info mips_cpu_info_table[] =
14724 {
14725   /* Entries for generic ISAs */
14726   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
14727   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
14728   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
14729   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
14730   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
14731   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
14732   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
14733   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
14734   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
14735
14736   /* MIPS I */
14737   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
14738   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
14739   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
14740
14741   /* MIPS II */
14742   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
14743
14744   /* MIPS III */
14745   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
14746   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
14747   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
14748   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
14749   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
14750   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
14751   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
14752   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
14753   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
14754   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
14755   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
14756   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
14757
14758   /* MIPS IV */
14759   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
14760   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
14761   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
14762   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
14763   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
14764   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
14765   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
14766   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
14767   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
14768   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
14769   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
14770   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
14771   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
14772
14773   /* MIPS 32 */
14774   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14775   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14776   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14777   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
14778
14779   /* MIPS 32 Release 2 */
14780   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14781   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14782   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14783   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
14784   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14785   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14786   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14787   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14788   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14789   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14790   /* Deprecated forms of the above.  */
14791   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14792   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14793   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
14794   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14795   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14796   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14797   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14798   /* Deprecated forms of the above.  */
14799   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14800   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14801   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
14802   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14803                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14804   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14805                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14806   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14807                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14808   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14809                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14810   /* Deprecated forms of the above.  */
14811   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14812                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14813   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14814                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14815   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
14816   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14817                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14818   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14819                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14820   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14821                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14822   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14823                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14824   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14825                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14826   /* Deprecated forms of the above.  */
14827   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14828                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14829   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14830                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14831
14832   /* MIPS 64 */
14833   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
14834   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
14835   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
14836   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
14837
14838   /* MIPS 64 Release 2 */
14839
14840   /* Broadcom SB-1 CPU core */
14841   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14842                                                 ISA_MIPS64,     CPU_SB1 },
14843   /* Broadcom SB-1A CPU core */
14844   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14845                                                 ISA_MIPS64,     CPU_SB1 },
14846
14847   /* End marker */
14848   { NULL, 0, 0, 0 }
14849 };
14850
14851
14852 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14853    with a final "000" replaced by "k".  Ignore case.
14854
14855    Note: this function is shared between GCC and GAS.  */
14856
14857 static bfd_boolean
14858 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14859 {
14860   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14861     given++, canonical++;
14862
14863   return ((*given == 0 && *canonical == 0)
14864           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14865 }
14866
14867
14868 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14869    CPU name.  We've traditionally allowed a lot of variation here.
14870
14871    Note: this function is shared between GCC and GAS.  */
14872
14873 static bfd_boolean
14874 mips_matching_cpu_name_p (const char *canonical, const char *given)
14875 {
14876   /* First see if the name matches exactly, or with a final "000"
14877      turned into "k".  */
14878   if (mips_strict_matching_cpu_name_p (canonical, given))
14879     return TRUE;
14880
14881   /* If not, try comparing based on numerical designation alone.
14882      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14883   if (TOLOWER (*given) == 'r')
14884     given++;
14885   if (!ISDIGIT (*given))
14886     return FALSE;
14887
14888   /* Skip over some well-known prefixes in the canonical name,
14889      hoping to find a number there too.  */
14890   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14891     canonical += 2;
14892   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14893     canonical += 2;
14894   else if (TOLOWER (canonical[0]) == 'r')
14895     canonical += 1;
14896
14897   return mips_strict_matching_cpu_name_p (canonical, given);
14898 }
14899
14900
14901 /* Parse an option that takes the name of a processor as its argument.
14902    OPTION is the name of the option and CPU_STRING is the argument.
14903    Return the corresponding processor enumeration if the CPU_STRING is
14904    recognized, otherwise report an error and return null.
14905
14906    A similar function exists in GCC.  */
14907
14908 static const struct mips_cpu_info *
14909 mips_parse_cpu (const char *option, const char *cpu_string)
14910 {
14911   const struct mips_cpu_info *p;
14912
14913   /* 'from-abi' selects the most compatible architecture for the given
14914      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14915      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14916      version.  Look first at the -mgp options, if given, otherwise base
14917      the choice on MIPS_DEFAULT_64BIT.
14918
14919      Treat NO_ABI like the EABIs.  One reason to do this is that the
14920      plain 'mips' and 'mips64' configs have 'from-abi' as their default
14921      architecture.  This code picks MIPS I for 'mips' and MIPS III for
14922      'mips64', just as we did in the days before 'from-abi'.  */
14923   if (strcasecmp (cpu_string, "from-abi") == 0)
14924     {
14925       if (ABI_NEEDS_32BIT_REGS (mips_abi))
14926         return mips_cpu_info_from_isa (ISA_MIPS1);
14927
14928       if (ABI_NEEDS_64BIT_REGS (mips_abi))
14929         return mips_cpu_info_from_isa (ISA_MIPS3);
14930
14931       if (file_mips_gp32 >= 0)
14932         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14933
14934       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14935                                      ? ISA_MIPS3
14936                                      : ISA_MIPS1);
14937     }
14938
14939   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14940   if (strcasecmp (cpu_string, "default") == 0)
14941     return 0;
14942
14943   for (p = mips_cpu_info_table; p->name != 0; p++)
14944     if (mips_matching_cpu_name_p (p->name, cpu_string))
14945       return p;
14946
14947   as_bad ("Bad value (%s) for %s", cpu_string, option);
14948   return 0;
14949 }
14950
14951 /* Return the canonical processor information for ISA (a member of the
14952    ISA_MIPS* enumeration).  */
14953
14954 static const struct mips_cpu_info *
14955 mips_cpu_info_from_isa (int isa)
14956 {
14957   int i;
14958
14959   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14960     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
14961         && isa == mips_cpu_info_table[i].isa)
14962       return (&mips_cpu_info_table[i]);
14963
14964   return NULL;
14965 }
14966
14967 static const struct mips_cpu_info *
14968 mips_cpu_info_from_arch (int arch)
14969 {
14970   int i;
14971
14972   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14973     if (arch == mips_cpu_info_table[i].cpu)
14974       return (&mips_cpu_info_table[i]);
14975
14976   return NULL;
14977 }
14978 \f
14979 static void
14980 show (FILE *stream, const char *string, int *col_p, int *first_p)
14981 {
14982   if (*first_p)
14983     {
14984       fprintf (stream, "%24s", "");
14985       *col_p = 24;
14986     }
14987   else
14988     {
14989       fprintf (stream, ", ");
14990       *col_p += 2;
14991     }
14992
14993   if (*col_p + strlen (string) > 72)
14994     {
14995       fprintf (stream, "\n%24s", "");
14996       *col_p = 24;
14997     }
14998
14999   fprintf (stream, "%s", string);
15000   *col_p += strlen (string);
15001
15002   *first_p = 0;
15003 }
15004
15005 void
15006 md_show_usage (FILE *stream)
15007 {
15008   int column, first;
15009   size_t i;
15010
15011   fprintf (stream, _("\
15012 MIPS options:\n\
15013 -EB                     generate big endian output\n\
15014 -EL                     generate little endian output\n\
15015 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15016 -G NUM                  allow referencing objects up to NUM bytes\n\
15017                         implicitly with the gp register [default 8]\n"));
15018   fprintf (stream, _("\
15019 -mips1                  generate MIPS ISA I instructions\n\
15020 -mips2                  generate MIPS ISA II instructions\n\
15021 -mips3                  generate MIPS ISA III instructions\n\
15022 -mips4                  generate MIPS ISA IV instructions\n\
15023 -mips5                  generate MIPS ISA V instructions\n\
15024 -mips32                 generate MIPS32 ISA instructions\n\
15025 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15026 -mips64                 generate MIPS64 ISA instructions\n\
15027 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15028 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15029
15030   first = 1;
15031
15032   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15033     show (stream, mips_cpu_info_table[i].name, &column, &first);
15034   show (stream, "from-abi", &column, &first);
15035   fputc ('\n', stream);
15036
15037   fprintf (stream, _("\
15038 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15039 -no-mCPU                don't generate code specific to CPU.\n\
15040                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15041
15042   first = 1;
15043
15044   show (stream, "3900", &column, &first);
15045   show (stream, "4010", &column, &first);
15046   show (stream, "4100", &column, &first);
15047   show (stream, "4650", &column, &first);
15048   fputc ('\n', stream);
15049
15050   fprintf (stream, _("\
15051 -mips16                 generate mips16 instructions\n\
15052 -no-mips16              do not generate mips16 instructions\n"));
15053   fprintf (stream, _("\
15054 -msmartmips             generate smartmips instructions\n\
15055 -mno-smartmips          do not generate smartmips instructions\n"));  
15056   fprintf (stream, _("\
15057 -mdsp                   generate DSP instructions\n\
15058 -mno-dsp                do not generate DSP instructions\n"));
15059   fprintf (stream, _("\
15060 -mdspr2                 generate DSP R2 instructions\n\
15061 -mno-dspr2              do not generate DSP R2 instructions\n"));
15062   fprintf (stream, _("\
15063 -mmt                    generate MT instructions\n\
15064 -mno-mt                 do not generate MT instructions\n"));
15065   fprintf (stream, _("\
15066 -mfix-vr4120            work around certain VR4120 errata\n\
15067 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15068 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15069 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15070 -msym32                 assume all symbols have 32-bit values\n\
15071 -O0                     remove unneeded NOPs, do not swap branches\n\
15072 -O                      remove unneeded NOPs and swap branches\n\
15073 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15074 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15075 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15076 #ifdef OBJ_ELF
15077   fprintf (stream, _("\
15078 -KPIC, -call_shared     generate SVR4 position independent code\n\
15079 -mvxworks-pic           generate VxWorks position independent code\n\
15080 -non_shared             do not generate position independent code\n\
15081 -xgot                   assume a 32 bit GOT\n\
15082 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15083 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15084                         position dependent (non shared) code\n\
15085 -mabi=ABI               create ABI conformant object file for:\n"));
15086
15087   first = 1;
15088
15089   show (stream, "32", &column, &first);
15090   show (stream, "o64", &column, &first);
15091   show (stream, "n32", &column, &first);
15092   show (stream, "64", &column, &first);
15093   show (stream, "eabi", &column, &first);
15094
15095   fputc ('\n', stream);
15096
15097   fprintf (stream, _("\
15098 -32                     create o32 ABI object file (default)\n\
15099 -n32                    create n32 ABI object file\n\
15100 -64                     create 64 ABI object file\n"));
15101 #endif
15102 }
15103
15104 enum dwarf2_format
15105 mips_dwarf2_format (void)
15106 {
15107   if (HAVE_64BIT_SYMBOLS)
15108     {
15109 #ifdef TE_IRIX
15110       return dwarf2_format_64bit_irix;
15111 #else
15112       return dwarf2_format_64bit;
15113 #endif
15114     }
15115   else
15116     return dwarf2_format_32bit;
15117 }
15118
15119 int
15120 mips_dwarf2_addr_size (void)
15121 {
15122   if (HAVE_64BIT_SYMBOLS)
15123     return 8;
15124   else
15125     return 4;
15126 }
15127
15128 /* Standard calling conventions leave the CFA at SP on entry.  */
15129 void
15130 mips_cfi_frame_initial_instructions (void)
15131 {
15132   cfi_add_CFA_def_cfa_register (SP);
15133 }
15134
15135 int
15136 tc_mips_regname_to_dw2regnum (char *regname)
15137 {
15138   unsigned int regnum = -1;
15139   unsigned int reg;
15140
15141   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15142     regnum = reg;
15143
15144   return regnum;
15145 }