f19299e1c3000ea867d598325e1d6d1b929d2570
[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 ATREG 1
93 #define TREG 24
94 #define PIC_CALL_REG 25
95 #define KT0 26
96 #define KT1 27
97 #define GP  28
98 #define SP  29
99 #define FP  30
100 #define RA  31
101
102 #define ILLEGAL_REG (32)
103
104 #define AT  mips_opts.at
105
106 /* Allow override of standard little-endian ECOFF format.  */
107
108 #ifndef ECOFF_LITTLE_FORMAT
109 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
110 #endif
111
112 extern int target_big_endian;
113
114 /* The name of the readonly data section.  */
115 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
116                             ? ".rdata" \
117                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
118                             ? ".rdata" \
119                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
120                             ? ".rodata" \
121                             : (abort (), ""))
122
123 /* Information about an instruction, including its format, operands
124    and fixups.  */
125 struct mips_cl_insn
126 {
127   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
128   const struct mips_opcode *insn_mo;
129
130   /* True if this is a mips16 instruction and if we want the extended
131      form of INSN_MO.  */
132   bfd_boolean use_extend;
133
134   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
135   unsigned short extend;
136
137   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
138      a copy of INSN_MO->match with the operands filled in.  */
139   unsigned long insn_opcode;
140
141   /* The frag that contains the instruction.  */
142   struct frag *frag;
143
144   /* The offset into FRAG of the first instruction byte.  */
145   long where;
146
147   /* The relocs associated with the instruction, if any.  */
148   fixS *fixp[3];
149
150   /* True if this entry cannot be moved from its current position.  */
151   unsigned int fixed_p : 1;
152
153   /* True if this instruction occurred in a .set noreorder block.  */
154   unsigned int noreorder_p : 1;
155
156   /* True for mips16 instructions that jump to an absolute address.  */
157   unsigned int mips16_absolute_jump_p : 1;
158 };
159
160 /* The ABI to use.  */
161 enum mips_abi_level
162 {
163   NO_ABI = 0,
164   O32_ABI,
165   O64_ABI,
166   N32_ABI,
167   N64_ABI,
168   EABI_ABI
169 };
170
171 /* MIPS ABI we are using for this output file.  */
172 static enum mips_abi_level mips_abi = NO_ABI;
173
174 /* Whether or not we have code that can call pic code.  */
175 int mips_abicalls = FALSE;
176
177 /* Whether or not we have code which can be put into a shared
178    library.  */
179 static bfd_boolean mips_in_shared = TRUE;
180
181 /* This is the set of options which may be modified by the .set
182    pseudo-op.  We use a struct so that .set push and .set pop are more
183    reliable.  */
184
185 struct mips_set_options
186 {
187   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
188      if it has not been initialized.  Changed by `.set mipsN', and the
189      -mipsN command line option, and the default CPU.  */
190   int isa;
191   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
192      if they have not been initialized.  Changed by `.set <asename>', by
193      command line options, and based on the default architecture.  */
194   int ase_mips3d;
195   int ase_mdmx;
196   int ase_smartmips;
197   int ase_dsp;
198   int ase_dspr2;
199   int ase_mt;
200   /* Whether we are assembling for the mips16 processor.  0 if we are
201      not, 1 if we are, and -1 if the value has not been initialized.
202      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
203      -nomips16 command line options, and the default CPU.  */
204   int mips16;
205   /* Non-zero if we should not reorder instructions.  Changed by `.set
206      reorder' and `.set noreorder'.  */
207   int noreorder;
208   /* Non-zero if we should not permit the register designated "assembler
209      temporary" to be used in instructions.  The value is the register
210      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
211      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
212   unsigned int at;
213   /* Non-zero if we should warn when a macro instruction expands into
214      more than one machine instruction.  Changed by `.set nomacro' and
215      `.set macro'.  */
216   int warn_about_macros;
217   /* Non-zero if we should not move instructions.  Changed by `.set
218      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
219   int nomove;
220   /* Non-zero if we should not optimize branches by moving the target
221      of the branch into the delay slot.  Actually, we don't perform
222      this optimization anyhow.  Changed by `.set bopt' and `.set
223      nobopt'.  */
224   int nobopt;
225   /* Non-zero if we should not autoextend mips16 instructions.
226      Changed by `.set autoextend' and `.set noautoextend'.  */
227   int noautoextend;
228   /* Restrict general purpose registers and floating point registers
229      to 32 bit.  This is initially determined when -mgp32 or -mfp32
230      is passed but can changed if the assembler code uses .set mipsN.  */
231   int gp32;
232   int fp32;
233   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
234      command line option, and the default CPU.  */
235   int arch;
236   /* True if ".set sym32" is in effect.  */
237   bfd_boolean sym32;
238 };
239
240 /* True if -mgp32 was passed.  */
241 static int file_mips_gp32 = -1;
242
243 /* True if -mfp32 was passed.  */
244 static int file_mips_fp32 = -1;
245
246 /* This is the struct we use to hold the current set of options.  Note
247    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
248    -1 to indicate that they have not been initialized.  */
249
250 static struct mips_set_options mips_opts =
251 {
252   ISA_UNKNOWN, -1, -1, 0, -1, -1, -1, -1, 0, ATREG, 0, 0, 0, 0, 0, 0, CPU_UNKNOWN, FALSE
253 };
254
255 /* These variables are filled in with the masks of registers used.
256    The object format code reads them and puts them in the appropriate
257    place.  */
258 unsigned long mips_gprmask;
259 unsigned long mips_cprmask[4];
260
261 /* MIPS ISA we are using for this output file.  */
262 static int file_mips_isa = ISA_UNKNOWN;
263
264 /* True if -mips16 was passed or implied by arguments passed on the
265    command line (e.g., by -march).  */
266 static int file_ase_mips16;
267
268 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
269                               || mips_opts.isa == ISA_MIPS32R2          \
270                               || mips_opts.isa == ISA_MIPS64            \
271                               || mips_opts.isa == ISA_MIPS64R2)
272
273 /* True if -mips3d was passed or implied by arguments passed on the
274    command line (e.g., by -march).  */
275 static int file_ase_mips3d;
276
277 /* True if -mdmx was passed or implied by arguments passed on the
278    command line (e.g., by -march).  */
279 static int file_ase_mdmx;
280
281 /* True if -msmartmips was passed or implied by arguments passed on the
282    command line (e.g., by -march).  */
283 static int file_ase_smartmips;
284
285 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
286                                 || mips_opts.isa == ISA_MIPS32R2)
287
288 /* True if -mdsp was passed or implied by arguments passed on the
289    command line (e.g., by -march).  */
290 static int file_ase_dsp;
291
292 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
293                               || mips_opts.isa == ISA_MIPS64R2)
294
295 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
296
297 /* True if -mdspr2 was passed or implied by arguments passed on the
298    command line (e.g., by -march).  */
299 static int file_ase_dspr2;
300
301 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
302                                 || mips_opts.isa == ISA_MIPS64R2)
303
304 /* True if -mmt was passed or implied by arguments passed on the
305    command line (e.g., by -march).  */
306 static int file_ase_mt;
307
308 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
309                              || mips_opts.isa == ISA_MIPS64R2)
310
311 /* The argument of the -march= flag.  The architecture we are assembling.  */
312 static int file_mips_arch = CPU_UNKNOWN;
313 static const char *mips_arch_string;
314
315 /* The argument of the -mtune= flag.  The architecture for which we
316    are optimizing.  */
317 static int mips_tune = CPU_UNKNOWN;
318 static const char *mips_tune_string;
319
320 /* True when generating 32-bit code for a 64-bit processor.  */
321 static int mips_32bitmode = 0;
322
323 /* True if the given ABI requires 32-bit registers.  */
324 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
325
326 /* Likewise 64-bit registers.  */
327 #define ABI_NEEDS_64BIT_REGS(ABI)       \
328   ((ABI) == N32_ABI                     \
329    || (ABI) == N64_ABI                  \
330    || (ABI) == O64_ABI)
331
332 /*  Return true if ISA supports 64 bit wide gp registers.  */
333 #define ISA_HAS_64BIT_REGS(ISA)         \
334   ((ISA) == ISA_MIPS3                   \
335    || (ISA) == ISA_MIPS4                \
336    || (ISA) == ISA_MIPS5                \
337    || (ISA) == ISA_MIPS64               \
338    || (ISA) == ISA_MIPS64R2)
339
340 /*  Return true if ISA supports 64 bit wide float registers.  */
341 #define ISA_HAS_64BIT_FPRS(ISA)         \
342   ((ISA) == ISA_MIPS3                   \
343    || (ISA) == ISA_MIPS4                \
344    || (ISA) == ISA_MIPS5                \
345    || (ISA) == ISA_MIPS32R2             \
346    || (ISA) == ISA_MIPS64               \
347    || (ISA) == ISA_MIPS64R2)
348
349 /* Return true if ISA supports 64-bit right rotate (dror et al.)
350    instructions.  */
351 #define ISA_HAS_DROR(ISA)               \
352   ((ISA) == ISA_MIPS64R2)
353
354 /* Return true if ISA supports 32-bit right rotate (ror et al.)
355    instructions.  */
356 #define ISA_HAS_ROR(ISA)                \
357   ((ISA) == ISA_MIPS32R2                \
358    || (ISA) == ISA_MIPS64R2             \
359    || mips_opts.ase_smartmips)
360
361 /* Return true if ISA supports single-precision floats in odd registers.  */
362 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
363   ((ISA) == ISA_MIPS32                  \
364    || (ISA) == ISA_MIPS32R2             \
365    || (ISA) == ISA_MIPS64               \
366    || (ISA) == ISA_MIPS64R2)
367
368 /* Return true if ISA supports move to/from high part of a 64-bit
369    floating-point register. */
370 #define ISA_HAS_MXHC1(ISA)              \
371   ((ISA) == ISA_MIPS32R2                \
372    || (ISA) == ISA_MIPS64R2)
373
374 #define HAVE_32BIT_GPRS                            \
375     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
376
377 #define HAVE_32BIT_FPRS                            \
378     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
379
380 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
381 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
382
383 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
384
385 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
386
387 /* True if relocations are stored in-place.  */
388 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
389
390 /* The ABI-derived address size.  */
391 #define HAVE_64BIT_ADDRESSES \
392   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
393 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
394
395 /* The size of symbolic constants (i.e., expressions of the form
396    "SYMBOL" or "SYMBOL + OFFSET").  */
397 #define HAVE_32BIT_SYMBOLS \
398   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
399 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
400
401 /* Addresses are loaded in different ways, depending on the address size
402    in use.  The n32 ABI Documentation also mandates the use of additions
403    with overflow checking, but existing implementations don't follow it.  */
404 #define ADDRESS_ADD_INSN                                                \
405    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
406
407 #define ADDRESS_ADDI_INSN                                               \
408    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
409
410 #define ADDRESS_LOAD_INSN                                               \
411    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
412
413 #define ADDRESS_STORE_INSN                                              \
414    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
415
416 /* Return true if the given CPU supports the MIPS16 ASE.  */
417 #define CPU_HAS_MIPS16(cpu)                                             \
418    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
419     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
420
421 /* True if CPU has a dror instruction.  */
422 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
423
424 /* True if CPU has a ror instruction.  */
425 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
426
427 /* True if mflo and mfhi can be immediately followed by instructions
428    which write to the HI and LO registers.
429
430    According to MIPS specifications, MIPS ISAs I, II, and III need
431    (at least) two instructions between the reads of HI/LO and
432    instructions which write them, and later ISAs do not.  Contradicting
433    the MIPS specifications, some MIPS IV processor user manuals (e.g.
434    the UM for the NEC Vr5000) document needing the instructions between
435    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
436    MIPS64 and later ISAs to have the interlocks, plus any specific
437    earlier-ISA CPUs for which CPU documentation declares that the
438    instructions are really interlocked.  */
439 #define hilo_interlocks \
440   (mips_opts.isa == ISA_MIPS32                        \
441    || mips_opts.isa == ISA_MIPS32R2                   \
442    || mips_opts.isa == ISA_MIPS64                     \
443    || mips_opts.isa == ISA_MIPS64R2                   \
444    || mips_opts.arch == CPU_R4010                     \
445    || mips_opts.arch == CPU_R10000                    \
446    || mips_opts.arch == CPU_R12000                    \
447    || mips_opts.arch == CPU_RM7000                    \
448    || mips_opts.arch == CPU_VR5500                    \
449    )
450
451 /* Whether the processor uses hardware interlocks to protect reads
452    from the GPRs after they are loaded from memory, and thus does not
453    require nops to be inserted.  This applies to instructions marked
454    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
455    level I.  */
456 #define gpr_interlocks \
457   (mips_opts.isa != ISA_MIPS1  \
458    || mips_opts.arch == CPU_R3900)
459
460 /* Whether the processor uses hardware interlocks to avoid delays
461    required by coprocessor instructions, and thus does not require
462    nops to be inserted.  This applies to instructions marked
463    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
464    between instructions marked INSN_WRITE_COND_CODE and ones marked
465    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
466    levels I, II, and III.  */
467 /* Itbl support may require additional care here.  */
468 #define cop_interlocks                                \
469   ((mips_opts.isa != ISA_MIPS1                        \
470     && mips_opts.isa != ISA_MIPS2                     \
471     && mips_opts.isa != ISA_MIPS3)                    \
472    || mips_opts.arch == CPU_R4300                     \
473    )
474
475 /* Whether the processor uses hardware interlocks to protect reads
476    from coprocessor registers after they are loaded from memory, and
477    thus does not require nops to be inserted.  This applies to
478    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
479    requires at MIPS ISA level I.  */
480 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
481
482 /* Is this a mfhi or mflo instruction?  */
483 #define MF_HILO_INSN(PINFO) \
484           ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
485
486 /* MIPS PIC level.  */
487
488 enum mips_pic_level mips_pic;
489
490 /* 1 if we should generate 32 bit offsets from the $gp register in
491    SVR4_PIC mode.  Currently has no meaning in other modes.  */
492 static int mips_big_got = 0;
493
494 /* 1 if trap instructions should used for overflow rather than break
495    instructions.  */
496 static int mips_trap = 0;
497
498 /* 1 if double width floating point constants should not be constructed
499    by assembling two single width halves into two single width floating
500    point registers which just happen to alias the double width destination
501    register.  On some architectures this aliasing can be disabled by a bit
502    in the status register, and the setting of this bit cannot be determined
503    automatically at assemble time.  */
504 static int mips_disable_float_construction;
505
506 /* Non-zero if any .set noreorder directives were used.  */
507
508 static int mips_any_noreorder;
509
510 /* Non-zero if nops should be inserted when the register referenced in
511    an mfhi/mflo instruction is read in the next two instructions.  */
512 static int mips_7000_hilo_fix;
513
514 /* The size of objects in the small data section.  */
515 static unsigned int g_switch_value = 8;
516 /* Whether the -G option was used.  */
517 static int g_switch_seen = 0;
518
519 #define N_RMASK 0xc4
520 #define N_VFP   0xd4
521
522 /* If we can determine in advance that GP optimization won't be
523    possible, we can skip the relaxation stuff that tries to produce
524    GP-relative references.  This makes delay slot optimization work
525    better.
526
527    This function can only provide a guess, but it seems to work for
528    gcc output.  It needs to guess right for gcc, otherwise gcc
529    will put what it thinks is a GP-relative instruction in a branch
530    delay slot.
531
532    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
533    fixed it for the non-PIC mode.  KR 95/04/07  */
534 static int nopic_need_relax (symbolS *, int);
535
536 /* handle of the OPCODE hash table */
537 static struct hash_control *op_hash = NULL;
538
539 /* The opcode hash table we use for the mips16.  */
540 static struct hash_control *mips16_op_hash = NULL;
541
542 /* This array holds the chars that always start a comment.  If the
543     pre-processor is disabled, these aren't very useful */
544 const char comment_chars[] = "#";
545
546 /* This array holds the chars that only start a comment at the beginning of
547    a line.  If the line seems to have the form '# 123 filename'
548    .line and .file directives will appear in the pre-processed output */
549 /* Note that input_file.c hand checks for '#' at the beginning of the
550    first line of the input file.  This is because the compiler outputs
551    #NO_APP at the beginning of its output.  */
552 /* Also note that C style comments are always supported.  */
553 const char line_comment_chars[] = "#";
554
555 /* This array holds machine specific line separator characters.  */
556 const char line_separator_chars[] = ";";
557
558 /* Chars that can be used to separate mant from exp in floating point nums */
559 const char EXP_CHARS[] = "eE";
560
561 /* Chars that mean this number is a floating point constant */
562 /* As in 0f12.456 */
563 /* or    0d1.2345e12 */
564 const char FLT_CHARS[] = "rRsSfFdDxXpP";
565
566 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
567    changed in read.c .  Ideally it shouldn't have to know about it at all,
568    but nothing is ideal around here.
569  */
570
571 static char *insn_error;
572
573 static int auto_align = 1;
574
575 /* When outputting SVR4 PIC code, the assembler needs to know the
576    offset in the stack frame from which to restore the $gp register.
577    This is set by the .cprestore pseudo-op, and saved in this
578    variable.  */
579 static offsetT mips_cprestore_offset = -1;
580
581 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
582    more optimizations, it can use a register value instead of a memory-saved
583    offset and even an other register than $gp as global pointer.  */
584 static offsetT mips_cpreturn_offset = -1;
585 static int mips_cpreturn_register = -1;
586 static int mips_gp_register = GP;
587 static int mips_gprel_offset = 0;
588
589 /* Whether mips_cprestore_offset has been set in the current function
590    (or whether it has already been warned about, if not).  */
591 static int mips_cprestore_valid = 0;
592
593 /* This is the register which holds the stack frame, as set by the
594    .frame pseudo-op.  This is needed to implement .cprestore.  */
595 static int mips_frame_reg = SP;
596
597 /* Whether mips_frame_reg has been set in the current function
598    (or whether it has already been warned about, if not).  */
599 static int mips_frame_reg_valid = 0;
600
601 /* To output NOP instructions correctly, we need to keep information
602    about the previous two instructions.  */
603
604 /* Whether we are optimizing.  The default value of 2 means to remove
605    unneeded NOPs and swap branch instructions when possible.  A value
606    of 1 means to not swap branches.  A value of 0 means to always
607    insert NOPs.  */
608 static int mips_optimize = 2;
609
610 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
611    equivalent to seeing no -g option at all.  */
612 static int mips_debug = 0;
613
614 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
615 #define MAX_VR4130_NOPS 4
616
617 /* The maximum number of NOPs needed to fill delay slots.  */
618 #define MAX_DELAY_NOPS 2
619
620 /* The maximum number of NOPs needed for any purpose.  */
621 #define MAX_NOPS 4
622
623 /* A list of previous instructions, with index 0 being the most recent.
624    We need to look back MAX_NOPS instructions when filling delay slots
625    or working around processor errata.  We need to look back one
626    instruction further if we're thinking about using history[0] to
627    fill a branch delay slot.  */
628 static struct mips_cl_insn history[1 + MAX_NOPS];
629
630 /* Nop instructions used by emit_nop.  */
631 static struct mips_cl_insn nop_insn, mips16_nop_insn;
632
633 /* The appropriate nop for the current mode.  */
634 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
635
636 /* If this is set, it points to a frag holding nop instructions which
637    were inserted before the start of a noreorder section.  If those
638    nops turn out to be unnecessary, the size of the frag can be
639    decreased.  */
640 static fragS *prev_nop_frag;
641
642 /* The number of nop instructions we created in prev_nop_frag.  */
643 static int prev_nop_frag_holds;
644
645 /* The number of nop instructions that we know we need in
646    prev_nop_frag.  */
647 static int prev_nop_frag_required;
648
649 /* The number of instructions we've seen since prev_nop_frag.  */
650 static int prev_nop_frag_since;
651
652 /* For ECOFF and ELF, relocations against symbols are done in two
653    parts, with a HI relocation and a LO relocation.  Each relocation
654    has only 16 bits of space to store an addend.  This means that in
655    order for the linker to handle carries correctly, it must be able
656    to locate both the HI and the LO relocation.  This means that the
657    relocations must appear in order in the relocation table.
658
659    In order to implement this, we keep track of each unmatched HI
660    relocation.  We then sort them so that they immediately precede the
661    corresponding LO relocation.  */
662
663 struct mips_hi_fixup
664 {
665   /* Next HI fixup.  */
666   struct mips_hi_fixup *next;
667   /* This fixup.  */
668   fixS *fixp;
669   /* The section this fixup is in.  */
670   segT seg;
671 };
672
673 /* The list of unmatched HI relocs.  */
674
675 static struct mips_hi_fixup *mips_hi_fixup_list;
676
677 /* The frag containing the last explicit relocation operator.
678    Null if explicit relocations have not been used.  */
679
680 static fragS *prev_reloc_op_frag;
681
682 /* Map normal MIPS register numbers to mips16 register numbers.  */
683
684 #define X ILLEGAL_REG
685 static const int mips32_to_16_reg_map[] =
686 {
687   X, X, 2, 3, 4, 5, 6, 7,
688   X, X, X, X, X, X, X, X,
689   0, 1, X, X, X, X, X, X,
690   X, X, X, X, X, X, X, X
691 };
692 #undef X
693
694 /* Map mips16 register numbers to normal MIPS register numbers.  */
695
696 static const unsigned int mips16_to_32_reg_map[] =
697 {
698   16, 17, 2, 3, 4, 5, 6, 7
699 };
700
701 /* Classifies the kind of instructions we're interested in when
702    implementing -mfix-vr4120.  */
703 enum fix_vr4120_class {
704   FIX_VR4120_MACC,
705   FIX_VR4120_DMACC,
706   FIX_VR4120_MULT,
707   FIX_VR4120_DMULT,
708   FIX_VR4120_DIV,
709   FIX_VR4120_MTHILO,
710   NUM_FIX_VR4120_CLASSES
711 };
712
713 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
714    there must be at least one other instruction between an instruction
715    of type X and an instruction of type Y.  */
716 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
717
718 /* True if -mfix-vr4120 is in force.  */
719 static int mips_fix_vr4120;
720
721 /* ...likewise -mfix-vr4130.  */
722 static int mips_fix_vr4130;
723
724 /* We don't relax branches by default, since this causes us to expand
725    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
726    fail to compute the offset before expanding the macro to the most
727    efficient expansion.  */
728
729 static int mips_relax_branch;
730 \f
731 /* The expansion of many macros depends on the type of symbol that
732    they refer to.  For example, when generating position-dependent code,
733    a macro that refers to a symbol may have two different expansions,
734    one which uses GP-relative addresses and one which uses absolute
735    addresses.  When generating SVR4-style PIC, a macro may have
736    different expansions for local and global symbols.
737
738    We handle these situations by generating both sequences and putting
739    them in variant frags.  In position-dependent code, the first sequence
740    will be the GP-relative one and the second sequence will be the
741    absolute one.  In SVR4 PIC, the first sequence will be for global
742    symbols and the second will be for local symbols.
743
744    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
745    SECOND are the lengths of the two sequences in bytes.  These fields
746    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
747    the subtype has the following flags:
748
749    RELAX_USE_SECOND
750         Set if it has been decided that we should use the second
751         sequence instead of the first.
752
753    RELAX_SECOND_LONGER
754         Set in the first variant frag if the macro's second implementation
755         is longer than its first.  This refers to the macro as a whole,
756         not an individual relaxation.
757
758    RELAX_NOMACRO
759         Set in the first variant frag if the macro appeared in a .set nomacro
760         block and if one alternative requires a warning but the other does not.
761
762    RELAX_DELAY_SLOT
763         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
764         delay slot.
765
766    The frag's "opcode" points to the first fixup for relaxable code.
767
768    Relaxable macros are generated using a sequence such as:
769
770       relax_start (SYMBOL);
771       ... generate first expansion ...
772       relax_switch ();
773       ... generate second expansion ...
774       relax_end ();
775
776    The code and fixups for the unwanted alternative are discarded
777    by md_convert_frag.  */
778 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
779
780 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
781 #define RELAX_SECOND(X) ((X) & 0xff)
782 #define RELAX_USE_SECOND 0x10000
783 #define RELAX_SECOND_LONGER 0x20000
784 #define RELAX_NOMACRO 0x40000
785 #define RELAX_DELAY_SLOT 0x80000
786
787 /* Branch without likely bit.  If label is out of range, we turn:
788
789         beq reg1, reg2, label
790         delay slot
791
792    into
793
794         bne reg1, reg2, 0f
795         nop
796         j label
797      0: delay slot
798
799    with the following opcode replacements:
800
801         beq <-> bne
802         blez <-> bgtz
803         bltz <-> bgez
804         bc1f <-> bc1t
805
806         bltzal <-> bgezal  (with jal label instead of j label)
807
808    Even though keeping the delay slot instruction in the delay slot of
809    the branch would be more efficient, it would be very tricky to do
810    correctly, because we'd have to introduce a variable frag *after*
811    the delay slot instruction, and expand that instead.  Let's do it
812    the easy way for now, even if the branch-not-taken case now costs
813    one additional instruction.  Out-of-range branches are not supposed
814    to be common, anyway.
815
816    Branch likely.  If label is out of range, we turn:
817
818         beql reg1, reg2, label
819         delay slot (annulled if branch not taken)
820
821    into
822
823         beql reg1, reg2, 1f
824         nop
825         beql $0, $0, 2f
826         nop
827      1: j[al] label
828         delay slot (executed only if branch taken)
829      2:
830
831    It would be possible to generate a shorter sequence by losing the
832    likely bit, generating something like:
833
834         bne reg1, reg2, 0f
835         nop
836         j[al] label
837         delay slot (executed only if branch taken)
838      0:
839
840         beql -> bne
841         bnel -> beq
842         blezl -> bgtz
843         bgtzl -> blez
844         bltzl -> bgez
845         bgezl -> bltz
846         bc1fl -> bc1t
847         bc1tl -> bc1f
848
849         bltzall -> bgezal  (with jal label instead of j label)
850         bgezall -> bltzal  (ditto)
851
852
853    but it's not clear that it would actually improve performance.  */
854 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
855   ((relax_substateT) \
856    (0xc0000000 \
857     | ((toofar) ? 1 : 0) \
858     | ((link) ? 2 : 0) \
859     | ((likely) ? 4 : 0) \
860     | ((uncond) ? 8 : 0)))
861 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
862 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
863 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
864 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
865 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
866
867 /* For mips16 code, we use an entirely different form of relaxation.
868    mips16 supports two versions of most instructions which take
869    immediate values: a small one which takes some small value, and a
870    larger one which takes a 16 bit value.  Since branches also follow
871    this pattern, relaxing these values is required.
872
873    We can assemble both mips16 and normal MIPS code in a single
874    object.  Therefore, we need to support this type of relaxation at
875    the same time that we support the relaxation described above.  We
876    use the high bit of the subtype field to distinguish these cases.
877
878    The information we store for this type of relaxation is the
879    argument code found in the opcode file for this relocation, whether
880    the user explicitly requested a small or extended form, and whether
881    the relocation is in a jump or jal delay slot.  That tells us the
882    size of the value, and how it should be stored.  We also store
883    whether the fragment is considered to be extended or not.  We also
884    store whether this is known to be a branch to a different section,
885    whether we have tried to relax this frag yet, and whether we have
886    ever extended a PC relative fragment because of a shift count.  */
887 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
888   (0x80000000                                                   \
889    | ((type) & 0xff)                                            \
890    | ((small) ? 0x100 : 0)                                      \
891    | ((ext) ? 0x200 : 0)                                        \
892    | ((dslot) ? 0x400 : 0)                                      \
893    | ((jal_dslot) ? 0x800 : 0))
894 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
895 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
896 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
897 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
898 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
899 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
900 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
901 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
902 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
903 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
904 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
905 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
906
907 /* Is the given value a sign-extended 32-bit value?  */
908 #define IS_SEXT_32BIT_NUM(x)                                            \
909   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
910    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
911
912 /* Is the given value a sign-extended 16-bit value?  */
913 #define IS_SEXT_16BIT_NUM(x)                                            \
914   (((x) &~ (offsetT) 0x7fff) == 0                                       \
915    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
916
917 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
918 #define IS_ZEXT_32BIT_NUM(x)                                            \
919   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
920    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
921
922 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
923    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
924 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
925   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
926               | (((VALUE) & (MASK)) << (SHIFT)))
927
928 /* Extract bits MASK << SHIFT from STRUCT and shift them right
929    SHIFT places.  */
930 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
931   (((STRUCT) >> (SHIFT)) & (MASK))
932
933 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
934    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
935
936    include/opcode/mips.h specifies operand fields using the macros
937    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
938    with "MIPS16OP" instead of "OP".  */
939 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
940   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
941 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
942   INSERT_BITS ((INSN).insn_opcode, VALUE, \
943                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
944
945 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
946 #define EXTRACT_OPERAND(FIELD, INSN) \
947   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
948 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
949   EXTRACT_BITS ((INSN).insn_opcode, \
950                 MIPS16OP_MASK_##FIELD, \
951                 MIPS16OP_SH_##FIELD)
952 \f
953 /* Global variables used when generating relaxable macros.  See the
954    comment above RELAX_ENCODE for more details about how relaxation
955    is used.  */
956 static struct {
957   /* 0 if we're not emitting a relaxable macro.
958      1 if we're emitting the first of the two relaxation alternatives.
959      2 if we're emitting the second alternative.  */
960   int sequence;
961
962   /* The first relaxable fixup in the current frag.  (In other words,
963      the first fixup that refers to relaxable code.)  */
964   fixS *first_fixup;
965
966   /* sizes[0] says how many bytes of the first alternative are stored in
967      the current frag.  Likewise sizes[1] for the second alternative.  */
968   unsigned int sizes[2];
969
970   /* The symbol on which the choice of sequence depends.  */
971   symbolS *symbol;
972 } mips_relax;
973 \f
974 /* Global variables used to decide whether a macro needs a warning.  */
975 static struct {
976   /* True if the macro is in a branch delay slot.  */
977   bfd_boolean delay_slot_p;
978
979   /* For relaxable macros, sizes[0] is the length of the first alternative
980      in bytes and sizes[1] is the length of the second alternative.
981      For non-relaxable macros, both elements give the length of the
982      macro in bytes.  */
983   unsigned int sizes[2];
984
985   /* The first variant frag for this macro.  */
986   fragS *first_frag;
987 } mips_macro_warning;
988 \f
989 /* Prototypes for static functions.  */
990
991 #define internalError()                                                 \
992     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
993
994 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
995
996 static void append_insn
997   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
998 static void mips_no_prev_insn (void);
999 static void mips16_macro_build
1000   (expressionS *, const char *, const char *, va_list);
1001 static void load_register (int, expressionS *, int);
1002 static void macro_start (void);
1003 static void macro_end (void);
1004 static void macro (struct mips_cl_insn * ip);
1005 static void mips16_macro (struct mips_cl_insn * ip);
1006 #ifdef LOSING_COMPILER
1007 static void macro2 (struct mips_cl_insn * ip);
1008 #endif
1009 static void mips_ip (char *str, struct mips_cl_insn * ip);
1010 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1011 static void mips16_immed
1012   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1013    unsigned long *, bfd_boolean *, unsigned short *);
1014 static size_t my_getSmallExpression
1015   (expressionS *, bfd_reloc_code_real_type *, char *);
1016 static void my_getExpression (expressionS *, char *);
1017 static void s_align (int);
1018 static void s_change_sec (int);
1019 static void s_change_section (int);
1020 static void s_cons (int);
1021 static void s_float_cons (int);
1022 static void s_mips_globl (int);
1023 static void s_option (int);
1024 static void s_mipsset (int);
1025 static void s_abicalls (int);
1026 static void s_cpload (int);
1027 static void s_cpsetup (int);
1028 static void s_cplocal (int);
1029 static void s_cprestore (int);
1030 static void s_cpreturn (int);
1031 static void s_dtprelword (int);
1032 static void s_dtpreldword (int);
1033 static void s_gpvalue (int);
1034 static void s_gpword (int);
1035 static void s_gpdword (int);
1036 static void s_cpadd (int);
1037 static void s_insn (int);
1038 static void md_obj_begin (void);
1039 static void md_obj_end (void);
1040 static void s_mips_ent (int);
1041 static void s_mips_end (int);
1042 static void s_mips_frame (int);
1043 static void s_mips_mask (int reg_type);
1044 static void s_mips_stab (int);
1045 static void s_mips_weakext (int);
1046 static void s_mips_file (int);
1047 static void s_mips_loc (int);
1048 static bfd_boolean pic_need_relax (symbolS *, asection *);
1049 static int relaxed_branch_length (fragS *, asection *, int);
1050 static int validate_mips_insn (const struct mips_opcode *);
1051
1052 /* Table and functions used to map between CPU/ISA names, and
1053    ISA levels, and CPU numbers.  */
1054
1055 struct mips_cpu_info
1056 {
1057   const char *name;           /* CPU or ISA name.  */
1058   int flags;                  /* ASEs available, or ISA flag.  */
1059   int isa;                    /* ISA level.  */
1060   int cpu;                    /* CPU number (default CPU if ISA).  */
1061 };
1062
1063 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1064 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1065 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1066 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1067 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1068 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1069 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1070
1071 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1072 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1073 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1074 \f
1075 /* Pseudo-op table.
1076
1077    The following pseudo-ops from the Kane and Heinrich MIPS book
1078    should be defined here, but are currently unsupported: .alias,
1079    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1080
1081    The following pseudo-ops from the Kane and Heinrich MIPS book are
1082    specific to the type of debugging information being generated, and
1083    should be defined by the object format: .aent, .begin, .bend,
1084    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1085    .vreg.
1086
1087    The following pseudo-ops from the Kane and Heinrich MIPS book are
1088    not MIPS CPU specific, but are also not specific to the object file
1089    format.  This file is probably the best place to define them, but
1090    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1091
1092 static const pseudo_typeS mips_pseudo_table[] =
1093 {
1094   /* MIPS specific pseudo-ops.  */
1095   {"option", s_option, 0},
1096   {"set", s_mipsset, 0},
1097   {"rdata", s_change_sec, 'r'},
1098   {"sdata", s_change_sec, 's'},
1099   {"livereg", s_ignore, 0},
1100   {"abicalls", s_abicalls, 0},
1101   {"cpload", s_cpload, 0},
1102   {"cpsetup", s_cpsetup, 0},
1103   {"cplocal", s_cplocal, 0},
1104   {"cprestore", s_cprestore, 0},
1105   {"cpreturn", s_cpreturn, 0},
1106   {"dtprelword", s_dtprelword, 0},
1107   {"dtpreldword", s_dtpreldword, 0},
1108   {"gpvalue", s_gpvalue, 0},
1109   {"gpword", s_gpword, 0},
1110   {"gpdword", s_gpdword, 0},
1111   {"cpadd", s_cpadd, 0},
1112   {"insn", s_insn, 0},
1113
1114   /* Relatively generic pseudo-ops that happen to be used on MIPS
1115      chips.  */
1116   {"asciiz", stringer, 8 + 1},
1117   {"bss", s_change_sec, 'b'},
1118   {"err", s_err, 0},
1119   {"half", s_cons, 1},
1120   {"dword", s_cons, 3},
1121   {"weakext", s_mips_weakext, 0},
1122   {"origin", s_org, 0},
1123   {"repeat", s_rept, 0},
1124
1125   /* These pseudo-ops are defined in read.c, but must be overridden
1126      here for one reason or another.  */
1127   {"align", s_align, 0},
1128   {"byte", s_cons, 0},
1129   {"data", s_change_sec, 'd'},
1130   {"double", s_float_cons, 'd'},
1131   {"float", s_float_cons, 'f'},
1132   {"globl", s_mips_globl, 0},
1133   {"global", s_mips_globl, 0},
1134   {"hword", s_cons, 1},
1135   {"int", s_cons, 2},
1136   {"long", s_cons, 2},
1137   {"octa", s_cons, 4},
1138   {"quad", s_cons, 3},
1139   {"section", s_change_section, 0},
1140   {"short", s_cons, 1},
1141   {"single", s_float_cons, 'f'},
1142   {"stabn", s_mips_stab, 'n'},
1143   {"text", s_change_sec, 't'},
1144   {"word", s_cons, 2},
1145
1146   { "extern", ecoff_directive_extern, 0},
1147
1148   { NULL, NULL, 0 },
1149 };
1150
1151 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1152 {
1153   /* These pseudo-ops should be defined by the object file format.
1154      However, a.out doesn't support them, so we have versions here.  */
1155   {"aent", s_mips_ent, 1},
1156   {"bgnb", s_ignore, 0},
1157   {"end", s_mips_end, 0},
1158   {"endb", s_ignore, 0},
1159   {"ent", s_mips_ent, 0},
1160   {"file", s_mips_file, 0},
1161   {"fmask", s_mips_mask, 'F'},
1162   {"frame", s_mips_frame, 0},
1163   {"loc", s_mips_loc, 0},
1164   {"mask", s_mips_mask, 'R'},
1165   {"verstamp", s_ignore, 0},
1166   { NULL, NULL, 0 },
1167 };
1168
1169 extern void pop_insert (const pseudo_typeS *);
1170
1171 void
1172 mips_pop_insert (void)
1173 {
1174   pop_insert (mips_pseudo_table);
1175   if (! ECOFF_DEBUGGING)
1176     pop_insert (mips_nonecoff_pseudo_table);
1177 }
1178 \f
1179 /* Symbols labelling the current insn.  */
1180
1181 struct insn_label_list
1182 {
1183   struct insn_label_list *next;
1184   symbolS *label;
1185 };
1186
1187 static struct insn_label_list *free_insn_labels;
1188 #define label_list tc_segment_info_data.labels
1189
1190 static void mips_clear_insn_labels (void);
1191
1192 static inline void
1193 mips_clear_insn_labels (void)
1194 {
1195   register struct insn_label_list **pl;
1196   segment_info_type *si;
1197
1198   if (now_seg)
1199     {
1200       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1201         ;
1202       
1203       si = seg_info (now_seg);
1204       *pl = si->label_list;
1205       si->label_list = NULL;
1206     }
1207 }
1208
1209 \f
1210 static char *expr_end;
1211
1212 /* Expressions which appear in instructions.  These are set by
1213    mips_ip.  */
1214
1215 static expressionS imm_expr;
1216 static expressionS imm2_expr;
1217 static expressionS offset_expr;
1218
1219 /* Relocs associated with imm_expr and offset_expr.  */
1220
1221 static bfd_reloc_code_real_type imm_reloc[3]
1222   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1223 static bfd_reloc_code_real_type offset_reloc[3]
1224   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1225
1226 /* These are set by mips16_ip if an explicit extension is used.  */
1227
1228 static bfd_boolean mips16_small, mips16_ext;
1229
1230 #ifdef OBJ_ELF
1231 /* The pdr segment for per procedure frame/regmask info.  Not used for
1232    ECOFF debugging.  */
1233
1234 static segT pdr_seg;
1235 #endif
1236
1237 /* The default target format to use.  */
1238
1239 const char *
1240 mips_target_format (void)
1241 {
1242   switch (OUTPUT_FLAVOR)
1243     {
1244     case bfd_target_ecoff_flavour:
1245       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1246     case bfd_target_coff_flavour:
1247       return "pe-mips";
1248     case bfd_target_elf_flavour:
1249 #ifdef TE_VXWORKS
1250       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1251         return (target_big_endian
1252                 ? "elf32-bigmips-vxworks"
1253                 : "elf32-littlemips-vxworks");
1254 #endif
1255 #ifdef TE_TMIPS
1256       /* This is traditional mips.  */
1257       return (target_big_endian
1258               ? (HAVE_64BIT_OBJECTS
1259                  ? "elf64-tradbigmips"
1260                  : (HAVE_NEWABI
1261                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1262               : (HAVE_64BIT_OBJECTS
1263                  ? "elf64-tradlittlemips"
1264                  : (HAVE_NEWABI
1265                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1266 #else
1267       return (target_big_endian
1268               ? (HAVE_64BIT_OBJECTS
1269                  ? "elf64-bigmips"
1270                  : (HAVE_NEWABI
1271                     ? "elf32-nbigmips" : "elf32-bigmips"))
1272               : (HAVE_64BIT_OBJECTS
1273                  ? "elf64-littlemips"
1274                  : (HAVE_NEWABI
1275                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1276 #endif
1277     default:
1278       abort ();
1279       return NULL;
1280     }
1281 }
1282
1283 /* Return the length of instruction INSN.  */
1284
1285 static inline unsigned int
1286 insn_length (const struct mips_cl_insn *insn)
1287 {
1288   if (!mips_opts.mips16)
1289     return 4;
1290   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1291 }
1292
1293 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1294
1295 static void
1296 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1297 {
1298   size_t i;
1299
1300   insn->insn_mo = mo;
1301   insn->use_extend = FALSE;
1302   insn->extend = 0;
1303   insn->insn_opcode = mo->match;
1304   insn->frag = NULL;
1305   insn->where = 0;
1306   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1307     insn->fixp[i] = NULL;
1308   insn->fixed_p = (mips_opts.noreorder > 0);
1309   insn->noreorder_p = (mips_opts.noreorder > 0);
1310   insn->mips16_absolute_jump_p = 0;
1311 }
1312
1313 /* Record the current MIPS16 mode in now_seg.  */
1314
1315 static void
1316 mips_record_mips16_mode (void)
1317 {
1318   segment_info_type *si;
1319
1320   si = seg_info (now_seg);
1321   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1322     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1323 }
1324
1325 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1326
1327 static void
1328 install_insn (const struct mips_cl_insn *insn)
1329 {
1330   char *f = insn->frag->fr_literal + insn->where;
1331   if (!mips_opts.mips16)
1332     md_number_to_chars (f, insn->insn_opcode, 4);
1333   else if (insn->mips16_absolute_jump_p)
1334     {
1335       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1336       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1337     }
1338   else
1339     {
1340       if (insn->use_extend)
1341         {
1342           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1343           f += 2;
1344         }
1345       md_number_to_chars (f, insn->insn_opcode, 2);
1346     }
1347   mips_record_mips16_mode ();
1348 }
1349
1350 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1351    and install the opcode in the new location.  */
1352
1353 static void
1354 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1355 {
1356   size_t i;
1357
1358   insn->frag = frag;
1359   insn->where = where;
1360   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1361     if (insn->fixp[i] != NULL)
1362       {
1363         insn->fixp[i]->fx_frag = frag;
1364         insn->fixp[i]->fx_where = where;
1365       }
1366   install_insn (insn);
1367 }
1368
1369 /* Add INSN to the end of the output.  */
1370
1371 static void
1372 add_fixed_insn (struct mips_cl_insn *insn)
1373 {
1374   char *f = frag_more (insn_length (insn));
1375   move_insn (insn, frag_now, f - frag_now->fr_literal);
1376 }
1377
1378 /* Start a variant frag and move INSN to the start of the variant part,
1379    marking it as fixed.  The other arguments are as for frag_var.  */
1380
1381 static void
1382 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1383                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1384 {
1385   frag_grow (max_chars);
1386   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1387   insn->fixed_p = 1;
1388   frag_var (rs_machine_dependent, max_chars, var,
1389             subtype, symbol, offset, NULL);
1390 }
1391
1392 /* Insert N copies of INSN into the history buffer, starting at
1393    position FIRST.  Neither FIRST nor N need to be clipped.  */
1394
1395 static void
1396 insert_into_history (unsigned int first, unsigned int n,
1397                      const struct mips_cl_insn *insn)
1398 {
1399   if (mips_relax.sequence != 2)
1400     {
1401       unsigned int i;
1402
1403       for (i = ARRAY_SIZE (history); i-- > first;)
1404         if (i >= first + n)
1405           history[i] = history[i - n];
1406         else
1407           history[i] = *insn;
1408     }
1409 }
1410
1411 /* Emit a nop instruction, recording it in the history buffer.  */
1412
1413 static void
1414 emit_nop (void)
1415 {
1416   add_fixed_insn (NOP_INSN);
1417   insert_into_history (0, 1, NOP_INSN);
1418 }
1419
1420 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1421    the idea is to make it obvious at a glance that each errata is
1422    included.  */
1423
1424 static void
1425 init_vr4120_conflicts (void)
1426 {
1427 #define CONFLICT(FIRST, SECOND) \
1428     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1429
1430   /* Errata 21 - [D]DIV[U] after [D]MACC */
1431   CONFLICT (MACC, DIV);
1432   CONFLICT (DMACC, DIV);
1433
1434   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1435   CONFLICT (DMULT, DMULT);
1436   CONFLICT (DMULT, DMACC);
1437   CONFLICT (DMACC, DMULT);
1438   CONFLICT (DMACC, DMACC);
1439
1440   /* Errata 24 - MT{LO,HI} after [D]MACC */
1441   CONFLICT (MACC, MTHILO);
1442   CONFLICT (DMACC, MTHILO);
1443
1444   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1445      instruction is executed immediately after a MACC or DMACC
1446      instruction, the result of [either instruction] is incorrect."  */
1447   CONFLICT (MACC, MULT);
1448   CONFLICT (MACC, DMULT);
1449   CONFLICT (DMACC, MULT);
1450   CONFLICT (DMACC, DMULT);
1451
1452   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1453      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1454      DDIV or DDIVU instruction, the result of the MACC or
1455      DMACC instruction is incorrect.".  */
1456   CONFLICT (DMULT, MACC);
1457   CONFLICT (DMULT, DMACC);
1458   CONFLICT (DIV, MACC);
1459   CONFLICT (DIV, DMACC);
1460
1461 #undef CONFLICT
1462 }
1463
1464 struct regname {
1465   const char *name;
1466   unsigned int num;
1467 };
1468
1469 #define RTYPE_MASK      0x1ff00
1470 #define RTYPE_NUM       0x00100
1471 #define RTYPE_FPU       0x00200
1472 #define RTYPE_FCC       0x00400
1473 #define RTYPE_VEC       0x00800
1474 #define RTYPE_GP        0x01000
1475 #define RTYPE_CP0       0x02000
1476 #define RTYPE_PC        0x04000
1477 #define RTYPE_ACC       0x08000
1478 #define RTYPE_CCC       0x10000
1479 #define RNUM_MASK       0x000ff
1480 #define RWARN           0x80000
1481
1482 #define GENERIC_REGISTER_NUMBERS \
1483     {"$0",      RTYPE_NUM | 0},  \
1484     {"$1",      RTYPE_NUM | 1},  \
1485     {"$2",      RTYPE_NUM | 2},  \
1486     {"$3",      RTYPE_NUM | 3},  \
1487     {"$4",      RTYPE_NUM | 4},  \
1488     {"$5",      RTYPE_NUM | 5},  \
1489     {"$6",      RTYPE_NUM | 6},  \
1490     {"$7",      RTYPE_NUM | 7},  \
1491     {"$8",      RTYPE_NUM | 8},  \
1492     {"$9",      RTYPE_NUM | 9},  \
1493     {"$10",     RTYPE_NUM | 10}, \
1494     {"$11",     RTYPE_NUM | 11}, \
1495     {"$12",     RTYPE_NUM | 12}, \
1496     {"$13",     RTYPE_NUM | 13}, \
1497     {"$14",     RTYPE_NUM | 14}, \
1498     {"$15",     RTYPE_NUM | 15}, \
1499     {"$16",     RTYPE_NUM | 16}, \
1500     {"$17",     RTYPE_NUM | 17}, \
1501     {"$18",     RTYPE_NUM | 18}, \
1502     {"$19",     RTYPE_NUM | 19}, \
1503     {"$20",     RTYPE_NUM | 20}, \
1504     {"$21",     RTYPE_NUM | 21}, \
1505     {"$22",     RTYPE_NUM | 22}, \
1506     {"$23",     RTYPE_NUM | 23}, \
1507     {"$24",     RTYPE_NUM | 24}, \
1508     {"$25",     RTYPE_NUM | 25}, \
1509     {"$26",     RTYPE_NUM | 26}, \
1510     {"$27",     RTYPE_NUM | 27}, \
1511     {"$28",     RTYPE_NUM | 28}, \
1512     {"$29",     RTYPE_NUM | 29}, \
1513     {"$30",     RTYPE_NUM | 30}, \
1514     {"$31",     RTYPE_NUM | 31} 
1515
1516 #define FPU_REGISTER_NAMES       \
1517     {"$f0",     RTYPE_FPU | 0},  \
1518     {"$f1",     RTYPE_FPU | 1},  \
1519     {"$f2",     RTYPE_FPU | 2},  \
1520     {"$f3",     RTYPE_FPU | 3},  \
1521     {"$f4",     RTYPE_FPU | 4},  \
1522     {"$f5",     RTYPE_FPU | 5},  \
1523     {"$f6",     RTYPE_FPU | 6},  \
1524     {"$f7",     RTYPE_FPU | 7},  \
1525     {"$f8",     RTYPE_FPU | 8},  \
1526     {"$f9",     RTYPE_FPU | 9},  \
1527     {"$f10",    RTYPE_FPU | 10}, \
1528     {"$f11",    RTYPE_FPU | 11}, \
1529     {"$f12",    RTYPE_FPU | 12}, \
1530     {"$f13",    RTYPE_FPU | 13}, \
1531     {"$f14",    RTYPE_FPU | 14}, \
1532     {"$f15",    RTYPE_FPU | 15}, \
1533     {"$f16",    RTYPE_FPU | 16}, \
1534     {"$f17",    RTYPE_FPU | 17}, \
1535     {"$f18",    RTYPE_FPU | 18}, \
1536     {"$f19",    RTYPE_FPU | 19}, \
1537     {"$f20",    RTYPE_FPU | 20}, \
1538     {"$f21",    RTYPE_FPU | 21}, \
1539     {"$f22",    RTYPE_FPU | 22}, \
1540     {"$f23",    RTYPE_FPU | 23}, \
1541     {"$f24",    RTYPE_FPU | 24}, \
1542     {"$f25",    RTYPE_FPU | 25}, \
1543     {"$f26",    RTYPE_FPU | 26}, \
1544     {"$f27",    RTYPE_FPU | 27}, \
1545     {"$f28",    RTYPE_FPU | 28}, \
1546     {"$f29",    RTYPE_FPU | 29}, \
1547     {"$f30",    RTYPE_FPU | 30}, \
1548     {"$f31",    RTYPE_FPU | 31}
1549
1550 #define FPU_CONDITION_CODE_NAMES \
1551     {"$fcc0",   RTYPE_FCC | 0},  \
1552     {"$fcc1",   RTYPE_FCC | 1},  \
1553     {"$fcc2",   RTYPE_FCC | 2},  \
1554     {"$fcc3",   RTYPE_FCC | 3},  \
1555     {"$fcc4",   RTYPE_FCC | 4},  \
1556     {"$fcc5",   RTYPE_FCC | 5},  \
1557     {"$fcc6",   RTYPE_FCC | 6},  \
1558     {"$fcc7",   RTYPE_FCC | 7}
1559
1560 #define COPROC_CONDITION_CODE_NAMES         \
1561     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1562     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1563     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1564     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1565     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1566     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1567     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1568     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1569
1570 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1571     {"$a4",     RTYPE_GP | 8},  \
1572     {"$a5",     RTYPE_GP | 9},  \
1573     {"$a6",     RTYPE_GP | 10}, \
1574     {"$a7",     RTYPE_GP | 11}, \
1575     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1576     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1577     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1578     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1579     {"$t0",     RTYPE_GP | 12}, \
1580     {"$t1",     RTYPE_GP | 13}, \
1581     {"$t2",     RTYPE_GP | 14}, \
1582     {"$t3",     RTYPE_GP | 15}
1583
1584 #define O32_SYMBOLIC_REGISTER_NAMES \
1585     {"$t0",     RTYPE_GP | 8},  \
1586     {"$t1",     RTYPE_GP | 9},  \
1587     {"$t2",     RTYPE_GP | 10}, \
1588     {"$t3",     RTYPE_GP | 11}, \
1589     {"$t4",     RTYPE_GP | 12}, \
1590     {"$t5",     RTYPE_GP | 13}, \
1591     {"$t6",     RTYPE_GP | 14}, \
1592     {"$t7",     RTYPE_GP | 15}, \
1593     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1594     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1595     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1596     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1597
1598 /* Remaining symbolic register names */
1599 #define SYMBOLIC_REGISTER_NAMES \
1600     {"$zero",   RTYPE_GP | 0},  \
1601     {"$at",     RTYPE_GP | 1},  \
1602     {"$AT",     RTYPE_GP | 1},  \
1603     {"$v0",     RTYPE_GP | 2},  \
1604     {"$v1",     RTYPE_GP | 3},  \
1605     {"$a0",     RTYPE_GP | 4},  \
1606     {"$a1",     RTYPE_GP | 5},  \
1607     {"$a2",     RTYPE_GP | 6},  \
1608     {"$a3",     RTYPE_GP | 7},  \
1609     {"$s0",     RTYPE_GP | 16}, \
1610     {"$s1",     RTYPE_GP | 17}, \
1611     {"$s2",     RTYPE_GP | 18}, \
1612     {"$s3",     RTYPE_GP | 19}, \
1613     {"$s4",     RTYPE_GP | 20}, \
1614     {"$s5",     RTYPE_GP | 21}, \
1615     {"$s6",     RTYPE_GP | 22}, \
1616     {"$s7",     RTYPE_GP | 23}, \
1617     {"$t8",     RTYPE_GP | 24}, \
1618     {"$t9",     RTYPE_GP | 25}, \
1619     {"$k0",     RTYPE_GP | 26}, \
1620     {"$kt0",    RTYPE_GP | 26}, \
1621     {"$k1",     RTYPE_GP | 27}, \
1622     {"$kt1",    RTYPE_GP | 27}, \
1623     {"$gp",     RTYPE_GP | 28}, \
1624     {"$sp",     RTYPE_GP | 29}, \
1625     {"$s8",     RTYPE_GP | 30}, \
1626     {"$fp",     RTYPE_GP | 30}, \
1627     {"$ra",     RTYPE_GP | 31}
1628
1629 #define MIPS16_SPECIAL_REGISTER_NAMES \
1630     {"$pc",     RTYPE_PC | 0}
1631
1632 #define MDMX_VECTOR_REGISTER_NAMES \
1633     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1634     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1635     {"$v2",     RTYPE_VEC | 2},  \
1636     {"$v3",     RTYPE_VEC | 3},  \
1637     {"$v4",     RTYPE_VEC | 4},  \
1638     {"$v5",     RTYPE_VEC | 5},  \
1639     {"$v6",     RTYPE_VEC | 6},  \
1640     {"$v7",     RTYPE_VEC | 7},  \
1641     {"$v8",     RTYPE_VEC | 8},  \
1642     {"$v9",     RTYPE_VEC | 9},  \
1643     {"$v10",    RTYPE_VEC | 10}, \
1644     {"$v11",    RTYPE_VEC | 11}, \
1645     {"$v12",    RTYPE_VEC | 12}, \
1646     {"$v13",    RTYPE_VEC | 13}, \
1647     {"$v14",    RTYPE_VEC | 14}, \
1648     {"$v15",    RTYPE_VEC | 15}, \
1649     {"$v16",    RTYPE_VEC | 16}, \
1650     {"$v17",    RTYPE_VEC | 17}, \
1651     {"$v18",    RTYPE_VEC | 18}, \
1652     {"$v19",    RTYPE_VEC | 19}, \
1653     {"$v20",    RTYPE_VEC | 20}, \
1654     {"$v21",    RTYPE_VEC | 21}, \
1655     {"$v22",    RTYPE_VEC | 22}, \
1656     {"$v23",    RTYPE_VEC | 23}, \
1657     {"$v24",    RTYPE_VEC | 24}, \
1658     {"$v25",    RTYPE_VEC | 25}, \
1659     {"$v26",    RTYPE_VEC | 26}, \
1660     {"$v27",    RTYPE_VEC | 27}, \
1661     {"$v28",    RTYPE_VEC | 28}, \
1662     {"$v29",    RTYPE_VEC | 29}, \
1663     {"$v30",    RTYPE_VEC | 30}, \
1664     {"$v31",    RTYPE_VEC | 31}
1665
1666 #define MIPS_DSP_ACCUMULATOR_NAMES \
1667     {"$ac0",    RTYPE_ACC | 0}, \
1668     {"$ac1",    RTYPE_ACC | 1}, \
1669     {"$ac2",    RTYPE_ACC | 2}, \
1670     {"$ac3",    RTYPE_ACC | 3}
1671
1672 static const struct regname reg_names[] = {
1673   GENERIC_REGISTER_NUMBERS,
1674   FPU_REGISTER_NAMES,
1675   FPU_CONDITION_CODE_NAMES,
1676   COPROC_CONDITION_CODE_NAMES,
1677
1678   /* The $txx registers depends on the abi,
1679      these will be added later into the symbol table from
1680      one of the tables below once mips_abi is set after 
1681      parsing of arguments from the command line. */
1682   SYMBOLIC_REGISTER_NAMES,
1683
1684   MIPS16_SPECIAL_REGISTER_NAMES,
1685   MDMX_VECTOR_REGISTER_NAMES,
1686   MIPS_DSP_ACCUMULATOR_NAMES,
1687   {0, 0}
1688 };
1689
1690 static const struct regname reg_names_o32[] = {
1691   O32_SYMBOLIC_REGISTER_NAMES,
1692   {0, 0}
1693 };
1694
1695 static const struct regname reg_names_n32n64[] = {
1696   N32N64_SYMBOLIC_REGISTER_NAMES,
1697   {0, 0}
1698 };
1699
1700 static int
1701 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1702 {
1703   symbolS *symbolP;
1704   char *e;
1705   char save_c;
1706   int reg = -1;
1707
1708   /* Find end of name.  */
1709   e = *s;
1710   if (is_name_beginner (*e))
1711     ++e;
1712   while (is_part_of_name (*e))
1713     ++e;
1714
1715   /* Terminate name.  */
1716   save_c = *e;
1717   *e = '\0';
1718
1719   /* Look for a register symbol.  */
1720   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1721     {
1722       int r = S_GET_VALUE (symbolP);
1723       if (r & types)
1724         reg = r & RNUM_MASK;
1725       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1726         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1727         reg = (r & RNUM_MASK) - 2;
1728     }
1729   /* Else see if this is a register defined in an itbl entry.  */
1730   else if ((types & RTYPE_GP) && itbl_have_entries)
1731     {
1732       char *n = *s;
1733       unsigned long r;
1734
1735       if (*n == '$')
1736         ++n;
1737       if (itbl_get_reg_val (n, &r))
1738         reg = r & RNUM_MASK;
1739     }
1740
1741   /* Advance to next token if a register was recognised.  */
1742   if (reg >= 0)
1743     *s = e;
1744   else if (types & RWARN)
1745     as_warn ("Unrecognized register name `%s'", *s);
1746
1747   *e = save_c;
1748   if (regnop)
1749     *regnop = reg;
1750   return reg >= 0;
1751 }
1752
1753 /* This function is called once, at assembler startup time.  It should set up
1754    all the tables, etc. that the MD part of the assembler will need.  */
1755
1756 void
1757 md_begin (void)
1758 {
1759   const char *retval = NULL;
1760   int i = 0;
1761   int broken = 0;
1762
1763   if (mips_pic != NO_PIC)
1764     {
1765       if (g_switch_seen && g_switch_value != 0)
1766         as_bad (_("-G may not be used in position-independent code"));
1767       g_switch_value = 0;
1768     }
1769
1770   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1771     as_warn (_("Could not set architecture and machine"));
1772
1773   op_hash = hash_new ();
1774
1775   for (i = 0; i < NUMOPCODES;)
1776     {
1777       const char *name = mips_opcodes[i].name;
1778
1779       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1780       if (retval != NULL)
1781         {
1782           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1783                    mips_opcodes[i].name, retval);
1784           /* Probably a memory allocation problem?  Give up now.  */
1785           as_fatal (_("Broken assembler.  No assembly attempted."));
1786         }
1787       do
1788         {
1789           if (mips_opcodes[i].pinfo != INSN_MACRO)
1790             {
1791               if (!validate_mips_insn (&mips_opcodes[i]))
1792                 broken = 1;
1793               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1794                 {
1795                   create_insn (&nop_insn, mips_opcodes + i);
1796                   nop_insn.fixed_p = 1;
1797                 }
1798             }
1799           ++i;
1800         }
1801       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1802     }
1803
1804   mips16_op_hash = hash_new ();
1805
1806   i = 0;
1807   while (i < bfd_mips16_num_opcodes)
1808     {
1809       const char *name = mips16_opcodes[i].name;
1810
1811       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1812       if (retval != NULL)
1813         as_fatal (_("internal: can't hash `%s': %s"),
1814                   mips16_opcodes[i].name, retval);
1815       do
1816         {
1817           if (mips16_opcodes[i].pinfo != INSN_MACRO
1818               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1819                   != mips16_opcodes[i].match))
1820             {
1821               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1822                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1823               broken = 1;
1824             }
1825           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1826             {
1827               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1828               mips16_nop_insn.fixed_p = 1;
1829             }
1830           ++i;
1831         }
1832       while (i < bfd_mips16_num_opcodes
1833              && strcmp (mips16_opcodes[i].name, name) == 0);
1834     }
1835
1836   if (broken)
1837     as_fatal (_("Broken assembler.  No assembly attempted."));
1838
1839   /* We add all the general register names to the symbol table.  This
1840      helps us detect invalid uses of them.  */
1841   for (i = 0; reg_names[i].name; i++) 
1842     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1843                                      reg_names[i].num, // & RNUM_MASK,
1844                                      &zero_address_frag));
1845   if (HAVE_NEWABI)
1846     for (i = 0; reg_names_n32n64[i].name; i++) 
1847       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1848                                        reg_names_n32n64[i].num, // & RNUM_MASK,
1849                                        &zero_address_frag));
1850   else
1851     for (i = 0; reg_names_o32[i].name; i++) 
1852       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1853                                        reg_names_o32[i].num, // & RNUM_MASK,
1854                                        &zero_address_frag));
1855
1856   mips_no_prev_insn ();
1857
1858   mips_gprmask = 0;
1859   mips_cprmask[0] = 0;
1860   mips_cprmask[1] = 0;
1861   mips_cprmask[2] = 0;
1862   mips_cprmask[3] = 0;
1863
1864   /* set the default alignment for the text section (2**2) */
1865   record_alignment (text_section, 2);
1866
1867   bfd_set_gp_size (stdoutput, g_switch_value);
1868
1869 #ifdef OBJ_ELF
1870   if (IS_ELF)
1871     {
1872       /* On a native system other than VxWorks, sections must be aligned
1873          to 16 byte boundaries.  When configured for an embedded ELF
1874          target, we don't bother.  */
1875       if (strcmp (TARGET_OS, "elf") != 0
1876           && strcmp (TARGET_OS, "vxworks") != 0)
1877         {
1878           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
1879           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
1880           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
1881         }
1882
1883       /* Create a .reginfo section for register masks and a .mdebug
1884          section for debugging information.  */
1885       {
1886         segT seg;
1887         subsegT subseg;
1888         flagword flags;
1889         segT sec;
1890
1891         seg = now_seg;
1892         subseg = now_subseg;
1893
1894         /* The ABI says this section should be loaded so that the
1895            running program can access it.  However, we don't load it
1896            if we are configured for an embedded target */
1897         flags = SEC_READONLY | SEC_DATA;
1898         if (strcmp (TARGET_OS, "elf") != 0)
1899           flags |= SEC_ALLOC | SEC_LOAD;
1900
1901         if (mips_abi != N64_ABI)
1902           {
1903             sec = subseg_new (".reginfo", (subsegT) 0);
1904
1905             bfd_set_section_flags (stdoutput, sec, flags);
1906             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
1907
1908             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
1909           }
1910         else
1911           {
1912             /* The 64-bit ABI uses a .MIPS.options section rather than
1913                .reginfo section.  */
1914             sec = subseg_new (".MIPS.options", (subsegT) 0);
1915             bfd_set_section_flags (stdoutput, sec, flags);
1916             bfd_set_section_alignment (stdoutput, sec, 3);
1917
1918             /* Set up the option header.  */
1919             {
1920               Elf_Internal_Options opthdr;
1921               char *f;
1922
1923               opthdr.kind = ODK_REGINFO;
1924               opthdr.size = (sizeof (Elf_External_Options)
1925                              + sizeof (Elf64_External_RegInfo));
1926               opthdr.section = 0;
1927               opthdr.info = 0;
1928               f = frag_more (sizeof (Elf_External_Options));
1929               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
1930                                              (Elf_External_Options *) f);
1931
1932               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
1933             }
1934           }
1935
1936         if (ECOFF_DEBUGGING)
1937           {
1938             sec = subseg_new (".mdebug", (subsegT) 0);
1939             (void) bfd_set_section_flags (stdoutput, sec,
1940                                           SEC_HAS_CONTENTS | SEC_READONLY);
1941             (void) bfd_set_section_alignment (stdoutput, sec, 2);
1942           }
1943         else if (mips_flag_pdr)
1944           {
1945             pdr_seg = subseg_new (".pdr", (subsegT) 0);
1946             (void) bfd_set_section_flags (stdoutput, pdr_seg,
1947                                           SEC_READONLY | SEC_RELOC
1948                                           | SEC_DEBUGGING);
1949             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
1950           }
1951
1952         subseg_set (seg, subseg);
1953       }
1954     }
1955 #endif /* OBJ_ELF */
1956
1957   if (! ECOFF_DEBUGGING)
1958     md_obj_begin ();
1959
1960   if (mips_fix_vr4120)
1961     init_vr4120_conflicts ();
1962 }
1963
1964 void
1965 md_mips_end (void)
1966 {
1967   if (! ECOFF_DEBUGGING)
1968     md_obj_end ();
1969 }
1970
1971 void
1972 md_assemble (char *str)
1973 {
1974   struct mips_cl_insn insn;
1975   bfd_reloc_code_real_type unused_reloc[3]
1976     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1977
1978   imm_expr.X_op = O_absent;
1979   imm2_expr.X_op = O_absent;
1980   offset_expr.X_op = O_absent;
1981   imm_reloc[0] = BFD_RELOC_UNUSED;
1982   imm_reloc[1] = BFD_RELOC_UNUSED;
1983   imm_reloc[2] = BFD_RELOC_UNUSED;
1984   offset_reloc[0] = BFD_RELOC_UNUSED;
1985   offset_reloc[1] = BFD_RELOC_UNUSED;
1986   offset_reloc[2] = BFD_RELOC_UNUSED;
1987
1988   if (mips_opts.mips16)
1989     mips16_ip (str, &insn);
1990   else
1991     {
1992       mips_ip (str, &insn);
1993       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
1994             str, insn.insn_opcode));
1995     }
1996
1997   if (insn_error)
1998     {
1999       as_bad ("%s `%s'", insn_error, str);
2000       return;
2001     }
2002
2003   if (insn.insn_mo->pinfo == INSN_MACRO)
2004     {
2005       macro_start ();
2006       if (mips_opts.mips16)
2007         mips16_macro (&insn);
2008       else
2009         macro (&insn);
2010       macro_end ();
2011     }
2012   else
2013     {
2014       if (imm_expr.X_op != O_absent)
2015         append_insn (&insn, &imm_expr, imm_reloc);
2016       else if (offset_expr.X_op != O_absent)
2017         append_insn (&insn, &offset_expr, offset_reloc);
2018       else
2019         append_insn (&insn, NULL, unused_reloc);
2020     }
2021 }
2022
2023 /* Return true if the given relocation might need a matching %lo().
2024    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2025    need a matching %lo() when applied to local symbols.  */
2026
2027 static inline bfd_boolean
2028 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2029 {
2030   return (HAVE_IN_PLACE_ADDENDS
2031           && (reloc == BFD_RELOC_HI16_S
2032               || reloc == BFD_RELOC_MIPS16_HI16_S
2033               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2034                  all GOT16 relocations evaluate to "G".  */
2035               || (reloc == BFD_RELOC_MIPS_GOT16 && mips_pic != VXWORKS_PIC)));
2036 }
2037
2038 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2039    relocation.  */
2040
2041 static inline bfd_boolean
2042 fixup_has_matching_lo_p (fixS *fixp)
2043 {
2044   return (fixp->fx_next != NULL
2045           && (fixp->fx_next->fx_r_type == BFD_RELOC_LO16
2046              || fixp->fx_next->fx_r_type == BFD_RELOC_MIPS16_LO16)
2047           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2048           && fixp->fx_offset == fixp->fx_next->fx_offset);
2049 }
2050
2051 /* See whether instruction IP reads register REG.  CLASS is the type
2052    of register.  */
2053
2054 static int
2055 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2056                enum mips_regclass class)
2057 {
2058   if (class == MIPS16_REG)
2059     {
2060       assert (mips_opts.mips16);
2061       reg = mips16_to_32_reg_map[reg];
2062       class = MIPS_GR_REG;
2063     }
2064
2065   /* Don't report on general register ZERO, since it never changes.  */
2066   if (class == MIPS_GR_REG && reg == ZERO)
2067     return 0;
2068
2069   if (class == MIPS_FP_REG)
2070     {
2071       assert (! mips_opts.mips16);
2072       /* If we are called with either $f0 or $f1, we must check $f0.
2073          This is not optimal, because it will introduce an unnecessary
2074          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2075          need to distinguish reading both $f0 and $f1 or just one of
2076          them.  Note that we don't have to check the other way,
2077          because there is no instruction that sets both $f0 and $f1
2078          and requires a delay.  */
2079       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2080           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2081               == (reg &~ (unsigned) 1)))
2082         return 1;
2083       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2084           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2085               == (reg &~ (unsigned) 1)))
2086         return 1;
2087     }
2088   else if (! mips_opts.mips16)
2089     {
2090       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2091           && EXTRACT_OPERAND (RS, *ip) == reg)
2092         return 1;
2093       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2094           && EXTRACT_OPERAND (RT, *ip) == reg)
2095         return 1;
2096     }
2097   else
2098     {
2099       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2100           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2101         return 1;
2102       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2103           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2104         return 1;
2105       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2106           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2107               == reg))
2108         return 1;
2109       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2110         return 1;
2111       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2112         return 1;
2113       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2114         return 1;
2115       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2116           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2117         return 1;
2118     }
2119
2120   return 0;
2121 }
2122
2123 /* This function returns true if modifying a register requires a
2124    delay.  */
2125
2126 static int
2127 reg_needs_delay (unsigned int reg)
2128 {
2129   unsigned long prev_pinfo;
2130
2131   prev_pinfo = history[0].insn_mo->pinfo;
2132   if (! mips_opts.noreorder
2133       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2134            && ! gpr_interlocks)
2135           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2136               && ! cop_interlocks)))
2137     {
2138       /* A load from a coprocessor or from memory.  All load delays
2139          delay the use of general register rt for one instruction.  */
2140       /* Itbl support may require additional care here.  */
2141       know (prev_pinfo & INSN_WRITE_GPR_T);
2142       if (reg == EXTRACT_OPERAND (RT, history[0]))
2143         return 1;
2144     }
2145
2146   return 0;
2147 }
2148
2149 /* Move all labels in insn_labels to the current insertion point.  */
2150
2151 static void
2152 mips_move_labels (void)
2153 {
2154   segment_info_type *si = seg_info (now_seg);
2155   struct insn_label_list *l;
2156   valueT val;
2157
2158   for (l = si->label_list; l != NULL; l = l->next)
2159     {
2160       assert (S_GET_SEGMENT (l->label) == now_seg);
2161       symbol_set_frag (l->label, frag_now);
2162       val = (valueT) frag_now_fix ();
2163       /* mips16 text labels are stored as odd.  */
2164       if (mips_opts.mips16)
2165         ++val;
2166       S_SET_VALUE (l->label, val);
2167     }
2168 }
2169
2170 static bfd_boolean
2171 s_is_linkonce (symbolS *sym, segT from_seg)
2172 {
2173   bfd_boolean linkonce = FALSE;
2174   segT symseg = S_GET_SEGMENT (sym);
2175
2176   if (symseg != from_seg && !S_IS_LOCAL (sym))
2177     {
2178       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2179         linkonce = TRUE;
2180 #ifdef OBJ_ELF
2181       /* The GNU toolchain uses an extension for ELF: a section
2182          beginning with the magic string .gnu.linkonce is a
2183          linkonce section.  */
2184       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2185                    sizeof ".gnu.linkonce" - 1) == 0)
2186         linkonce = TRUE;
2187 #endif
2188     }
2189   return linkonce;
2190 }
2191
2192 /* Mark instruction labels in mips16 mode.  This permits the linker to
2193    handle them specially, such as generating jalx instructions when
2194    needed.  We also make them odd for the duration of the assembly, in
2195    order to generate the right sort of code.  We will make them even
2196    in the adjust_symtab routine, while leaving them marked.  This is
2197    convenient for the debugger and the disassembler.  The linker knows
2198    to make them odd again.  */
2199
2200 static void
2201 mips16_mark_labels (void)
2202 {
2203   segment_info_type *si = seg_info (now_seg);
2204   struct insn_label_list *l;
2205
2206   if (!mips_opts.mips16)
2207     return;
2208
2209   for (l = si->label_list; l != NULL; l = l->next)
2210    {
2211       symbolS *label = l->label;
2212
2213 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2214       if (IS_ELF)
2215         S_SET_OTHER (label, STO_MIPS16);
2216 #endif
2217       if ((S_GET_VALUE (label) & 1) == 0
2218         /* Don't adjust the address if the label is global or weak, or
2219            in a link-once section, since we'll be emitting symbol reloc
2220            references to it which will be patched up by the linker, and
2221            the final value of the symbol may or may not be MIPS16.  */
2222           && ! S_IS_WEAK (label)
2223           && ! S_IS_EXTERNAL (label)
2224           && ! s_is_linkonce (label, now_seg))
2225         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2226     }
2227 }
2228
2229 /* End the current frag.  Make it a variant frag and record the
2230    relaxation info.  */
2231
2232 static void
2233 relax_close_frag (void)
2234 {
2235   mips_macro_warning.first_frag = frag_now;
2236   frag_var (rs_machine_dependent, 0, 0,
2237             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2238             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2239
2240   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2241   mips_relax.first_fixup = 0;
2242 }
2243
2244 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2245    See the comment above RELAX_ENCODE for more details.  */
2246
2247 static void
2248 relax_start (symbolS *symbol)
2249 {
2250   assert (mips_relax.sequence == 0);
2251   mips_relax.sequence = 1;
2252   mips_relax.symbol = symbol;
2253 }
2254
2255 /* Start generating the second version of a relaxable sequence.
2256    See the comment above RELAX_ENCODE for more details.  */
2257
2258 static void
2259 relax_switch (void)
2260 {
2261   assert (mips_relax.sequence == 1);
2262   mips_relax.sequence = 2;
2263 }
2264
2265 /* End the current relaxable sequence.  */
2266
2267 static void
2268 relax_end (void)
2269 {
2270   assert (mips_relax.sequence == 2);
2271   relax_close_frag ();
2272   mips_relax.sequence = 0;
2273 }
2274
2275 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2276    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2277    by VR4120 errata.  */
2278
2279 static unsigned int
2280 classify_vr4120_insn (const char *name)
2281 {
2282   if (strncmp (name, "macc", 4) == 0)
2283     return FIX_VR4120_MACC;
2284   if (strncmp (name, "dmacc", 5) == 0)
2285     return FIX_VR4120_DMACC;
2286   if (strncmp (name, "mult", 4) == 0)
2287     return FIX_VR4120_MULT;
2288   if (strncmp (name, "dmult", 5) == 0)
2289     return FIX_VR4120_DMULT;
2290   if (strstr (name, "div"))
2291     return FIX_VR4120_DIV;
2292   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2293     return FIX_VR4120_MTHILO;
2294   return NUM_FIX_VR4120_CLASSES;
2295 }
2296
2297 /* Return the number of instructions that must separate INSN1 and INSN2,
2298    where INSN1 is the earlier instruction.  Return the worst-case value
2299    for any INSN2 if INSN2 is null.  */
2300
2301 static unsigned int
2302 insns_between (const struct mips_cl_insn *insn1,
2303                const struct mips_cl_insn *insn2)
2304 {
2305   unsigned long pinfo1, pinfo2;
2306
2307   /* This function needs to know which pinfo flags are set for INSN2
2308      and which registers INSN2 uses.  The former is stored in PINFO2 and
2309      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2310      will have every flag set and INSN2_USES_REG will always return true.  */
2311   pinfo1 = insn1->insn_mo->pinfo;
2312   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2313
2314 #define INSN2_USES_REG(REG, CLASS) \
2315    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2316
2317   /* For most targets, write-after-read dependencies on the HI and LO
2318      registers must be separated by at least two instructions.  */
2319   if (!hilo_interlocks)
2320     {
2321       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2322         return 2;
2323       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2324         return 2;
2325     }
2326
2327   /* If we're working around r7000 errata, there must be two instructions
2328      between an mfhi or mflo and any instruction that uses the result.  */
2329   if (mips_7000_hilo_fix
2330       && MF_HILO_INSN (pinfo1)
2331       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2332     return 2;
2333
2334   /* If working around VR4120 errata, check for combinations that need
2335      a single intervening instruction.  */
2336   if (mips_fix_vr4120)
2337     {
2338       unsigned int class1, class2;
2339
2340       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2341       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2342         {
2343           if (insn2 == NULL)
2344             return 1;
2345           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2346           if (vr4120_conflicts[class1] & (1 << class2))
2347             return 1;
2348         }
2349     }
2350
2351   if (!mips_opts.mips16)
2352     {
2353       /* Check for GPR or coprocessor load delays.  All such delays
2354          are on the RT register.  */
2355       /* Itbl support may require additional care here.  */
2356       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2357           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2358         {
2359           know (pinfo1 & INSN_WRITE_GPR_T);
2360           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2361             return 1;
2362         }
2363
2364       /* Check for generic coprocessor hazards.
2365
2366          This case is not handled very well.  There is no special
2367          knowledge of CP0 handling, and the coprocessors other than
2368          the floating point unit are not distinguished at all.  */
2369       /* Itbl support may require additional care here. FIXME!
2370          Need to modify this to include knowledge about
2371          user specified delays!  */
2372       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2373                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2374         {
2375           /* Handle cases where INSN1 writes to a known general coprocessor
2376              register.  There must be a one instruction delay before INSN2
2377              if INSN2 reads that register, otherwise no delay is needed.  */
2378           if (pinfo1 & INSN_WRITE_FPR_T)
2379             {
2380               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2381                 return 1;
2382             }
2383           else if (pinfo1 & INSN_WRITE_FPR_S)
2384             {
2385               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2386                 return 1;
2387             }
2388           else
2389             {
2390               /* Read-after-write dependencies on the control registers
2391                  require a two-instruction gap.  */
2392               if ((pinfo1 & INSN_WRITE_COND_CODE)
2393                   && (pinfo2 & INSN_READ_COND_CODE))
2394                 return 2;
2395
2396               /* We don't know exactly what INSN1 does.  If INSN2 is
2397                  also a coprocessor instruction, assume there must be
2398                  a one instruction gap.  */
2399               if (pinfo2 & INSN_COP)
2400                 return 1;
2401             }
2402         }
2403
2404       /* Check for read-after-write dependencies on the coprocessor
2405          control registers in cases where INSN1 does not need a general
2406          coprocessor delay.  This means that INSN1 is a floating point
2407          comparison instruction.  */
2408       /* Itbl support may require additional care here.  */
2409       else if (!cop_interlocks
2410                && (pinfo1 & INSN_WRITE_COND_CODE)
2411                && (pinfo2 & INSN_READ_COND_CODE))
2412         return 1;
2413     }
2414
2415 #undef INSN2_USES_REG
2416
2417   return 0;
2418 }
2419
2420 /* Return the number of nops that would be needed to work around the
2421    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2422    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2423
2424 static int
2425 nops_for_vr4130 (const struct mips_cl_insn *history,
2426                  const struct mips_cl_insn *insn)
2427 {
2428   int i, j, reg;
2429
2430   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2431      are not affected by the errata.  */
2432   if (insn != 0
2433       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2434           || strcmp (insn->insn_mo->name, "mtlo") == 0
2435           || strcmp (insn->insn_mo->name, "mthi") == 0))
2436     return 0;
2437
2438   /* Search for the first MFLO or MFHI.  */
2439   for (i = 0; i < MAX_VR4130_NOPS; i++)
2440     if (!history[i].noreorder_p && MF_HILO_INSN (history[i].insn_mo->pinfo))
2441       {
2442         /* Extract the destination register.  */
2443         if (mips_opts.mips16)
2444           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2445         else
2446           reg = EXTRACT_OPERAND (RD, history[i]);
2447
2448         /* No nops are needed if INSN reads that register.  */
2449         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2450           return 0;
2451
2452         /* ...or if any of the intervening instructions do.  */
2453         for (j = 0; j < i; j++)
2454           if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2455             return 0;
2456
2457         return MAX_VR4130_NOPS - i;
2458       }
2459   return 0;
2460 }
2461
2462 /* Return the number of nops that would be needed if instruction INSN
2463    immediately followed the MAX_NOPS instructions given by HISTORY,
2464    where HISTORY[0] is the most recent instruction.  If INSN is null,
2465    return the worse-case number of nops for any instruction.  */
2466
2467 static int
2468 nops_for_insn (const struct mips_cl_insn *history,
2469                const struct mips_cl_insn *insn)
2470 {
2471   int i, nops, tmp_nops;
2472
2473   nops = 0;
2474   for (i = 0; i < MAX_DELAY_NOPS; i++)
2475     if (!history[i].noreorder_p)
2476       {
2477         tmp_nops = insns_between (history + i, insn) - i;
2478         if (tmp_nops > nops)
2479           nops = tmp_nops;
2480       }
2481
2482   if (mips_fix_vr4130)
2483     {
2484       tmp_nops = nops_for_vr4130 (history, insn);
2485       if (tmp_nops > nops)
2486         nops = tmp_nops;
2487     }
2488
2489   return nops;
2490 }
2491
2492 /* The variable arguments provide NUM_INSNS extra instructions that
2493    might be added to HISTORY.  Return the largest number of nops that
2494    would be needed after the extended sequence.  */
2495
2496 static int
2497 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2498 {
2499   va_list args;
2500   struct mips_cl_insn buffer[MAX_NOPS];
2501   struct mips_cl_insn *cursor;
2502   int nops;
2503
2504   va_start (args, history);
2505   cursor = buffer + num_insns;
2506   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2507   while (cursor > buffer)
2508     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2509
2510   nops = nops_for_insn (buffer, NULL);
2511   va_end (args);
2512   return nops;
2513 }
2514
2515 /* Like nops_for_insn, but if INSN is a branch, take into account the
2516    worst-case delay for the branch target.  */
2517
2518 static int
2519 nops_for_insn_or_target (const struct mips_cl_insn *history,
2520                          const struct mips_cl_insn *insn)
2521 {
2522   int nops, tmp_nops;
2523
2524   nops = nops_for_insn (history, insn);
2525   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2526                               | INSN_COND_BRANCH_DELAY
2527                               | INSN_COND_BRANCH_LIKELY))
2528     {
2529       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2530       if (tmp_nops > nops)
2531         nops = tmp_nops;
2532     }
2533   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2534     {
2535       tmp_nops = nops_for_sequence (1, history, insn);
2536       if (tmp_nops > nops)
2537         nops = tmp_nops;
2538     }
2539   return nops;
2540 }
2541
2542 /* Output an instruction.  IP is the instruction information.
2543    ADDRESS_EXPR is an operand of the instruction to be used with
2544    RELOC_TYPE.  */
2545
2546 static void
2547 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2548              bfd_reloc_code_real_type *reloc_type)
2549 {
2550   unsigned long prev_pinfo, pinfo;
2551   relax_stateT prev_insn_frag_type = 0;
2552   bfd_boolean relaxed_branch = FALSE;
2553   segment_info_type *si = seg_info (now_seg);
2554
2555   /* Mark instruction labels in mips16 mode.  */
2556   mips16_mark_labels ();
2557
2558   prev_pinfo = history[0].insn_mo->pinfo;
2559   pinfo = ip->insn_mo->pinfo;
2560
2561   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2562     {
2563       /* There are a lot of optimizations we could do that we don't.
2564          In particular, we do not, in general, reorder instructions.
2565          If you use gcc with optimization, it will reorder
2566          instructions and generally do much more optimization then we
2567          do here; repeating all that work in the assembler would only
2568          benefit hand written assembly code, and does not seem worth
2569          it.  */
2570       int nops = (mips_optimize == 0
2571                   ? nops_for_insn (history, NULL)
2572                   : nops_for_insn_or_target (history, ip));
2573       if (nops > 0)
2574         {
2575           fragS *old_frag;
2576           unsigned long old_frag_offset;
2577           int i;
2578
2579           old_frag = frag_now;
2580           old_frag_offset = frag_now_fix ();
2581
2582           for (i = 0; i < nops; i++)
2583             emit_nop ();
2584
2585           if (listing)
2586             {
2587               listing_prev_line ();
2588               /* We may be at the start of a variant frag.  In case we
2589                  are, make sure there is enough space for the frag
2590                  after the frags created by listing_prev_line.  The
2591                  argument to frag_grow here must be at least as large
2592                  as the argument to all other calls to frag_grow in
2593                  this file.  We don't have to worry about being in the
2594                  middle of a variant frag, because the variants insert
2595                  all needed nop instructions themselves.  */
2596               frag_grow (40);
2597             }
2598
2599           mips_move_labels ();
2600
2601 #ifndef NO_ECOFF_DEBUGGING
2602           if (ECOFF_DEBUGGING)
2603             ecoff_fix_loc (old_frag, old_frag_offset);
2604 #endif
2605         }
2606     }
2607   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2608     {
2609       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2610       int nops = nops_for_insn_or_target (history, ip);
2611       assert (nops <= prev_nop_frag_holds);
2612
2613       /* Enforce NOPS as a minimum.  */
2614       if (nops > prev_nop_frag_required)
2615         prev_nop_frag_required = nops;
2616
2617       if (prev_nop_frag_holds == prev_nop_frag_required)
2618         {
2619           /* Settle for the current number of nops.  Update the history
2620              accordingly (for the benefit of any future .set reorder code).  */
2621           prev_nop_frag = NULL;
2622           insert_into_history (prev_nop_frag_since,
2623                                prev_nop_frag_holds, NOP_INSN);
2624         }
2625       else
2626         {
2627           /* Allow this instruction to replace one of the nops that was
2628              tentatively added to prev_nop_frag.  */
2629           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2630           prev_nop_frag_holds--;
2631           prev_nop_frag_since++;
2632         }
2633     }
2634
2635 #ifdef OBJ_ELF
2636   /* The value passed to dwarf2_emit_insn is the distance between
2637      the beginning of the current instruction and the address that
2638      should be recorded in the debug tables.  For MIPS16 debug info
2639      we want to use ISA-encoded addresses, so we pass -1 for an
2640      address higher by one than the current.  */
2641   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2642 #endif
2643
2644   /* Record the frag type before frag_var.  */
2645   if (history[0].frag)
2646     prev_insn_frag_type = history[0].frag->fr_type;
2647
2648   if (address_expr
2649       && *reloc_type == BFD_RELOC_16_PCREL_S2
2650       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2651           || pinfo & INSN_COND_BRANCH_LIKELY)
2652       && mips_relax_branch
2653       /* Don't try branch relaxation within .set nomacro, or within
2654          .set noat if we use $at for PIC computations.  If it turns
2655          out that the branch was out-of-range, we'll get an error.  */
2656       && !mips_opts.warn_about_macros
2657       && (mips_opts.at || mips_pic == NO_PIC)
2658       && !mips_opts.mips16)
2659     {
2660       relaxed_branch = TRUE;
2661       add_relaxed_insn (ip, (relaxed_branch_length
2662                              (NULL, NULL,
2663                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2664                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2665                               : 0)), 4,
2666                         RELAX_BRANCH_ENCODE
2667                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2668                          pinfo & INSN_COND_BRANCH_LIKELY,
2669                          pinfo & INSN_WRITE_GPR_31,
2670                          0),
2671                         address_expr->X_add_symbol,
2672                         address_expr->X_add_number);
2673       *reloc_type = BFD_RELOC_UNUSED;
2674     }
2675   else if (*reloc_type > BFD_RELOC_UNUSED)
2676     {
2677       /* We need to set up a variant frag.  */
2678       assert (mips_opts.mips16 && address_expr != NULL);
2679       add_relaxed_insn (ip, 4, 0,
2680                         RELAX_MIPS16_ENCODE
2681                         (*reloc_type - BFD_RELOC_UNUSED,
2682                          mips16_small, mips16_ext,
2683                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2684                          history[0].mips16_absolute_jump_p),
2685                         make_expr_symbol (address_expr), 0);
2686     }
2687   else if (mips_opts.mips16
2688            && ! ip->use_extend
2689            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2690     {
2691       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2692         /* Make sure there is enough room to swap this instruction with
2693            a following jump instruction.  */
2694         frag_grow (6);
2695       add_fixed_insn (ip);
2696     }
2697   else
2698     {
2699       if (mips_opts.mips16
2700           && mips_opts.noreorder
2701           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2702         as_warn (_("extended instruction in delay slot"));
2703
2704       if (mips_relax.sequence)
2705         {
2706           /* If we've reached the end of this frag, turn it into a variant
2707              frag and record the information for the instructions we've
2708              written so far.  */
2709           if (frag_room () < 4)
2710             relax_close_frag ();
2711           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2712         }
2713
2714       if (mips_relax.sequence != 2)
2715         mips_macro_warning.sizes[0] += 4;
2716       if (mips_relax.sequence != 1)
2717         mips_macro_warning.sizes[1] += 4;
2718
2719       if (mips_opts.mips16)
2720         {
2721           ip->fixed_p = 1;
2722           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2723         }
2724       add_fixed_insn (ip);
2725     }
2726
2727   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2728     {
2729       if (address_expr->X_op == O_constant)
2730         {
2731           unsigned int tmp;
2732
2733           switch (*reloc_type)
2734             {
2735             case BFD_RELOC_32:
2736               ip->insn_opcode |= address_expr->X_add_number;
2737               break;
2738
2739             case BFD_RELOC_MIPS_HIGHEST:
2740               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2741               ip->insn_opcode |= tmp & 0xffff;
2742               break;
2743
2744             case BFD_RELOC_MIPS_HIGHER:
2745               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2746               ip->insn_opcode |= tmp & 0xffff;
2747               break;
2748
2749             case BFD_RELOC_HI16_S:
2750               tmp = (address_expr->X_add_number + 0x8000) >> 16;
2751               ip->insn_opcode |= tmp & 0xffff;
2752               break;
2753
2754             case BFD_RELOC_HI16:
2755               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2756               break;
2757
2758             case BFD_RELOC_UNUSED:
2759             case BFD_RELOC_LO16:
2760             case BFD_RELOC_MIPS_GOT_DISP:
2761               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2762               break;
2763
2764             case BFD_RELOC_MIPS_JMP:
2765               if ((address_expr->X_add_number & 3) != 0)
2766                 as_bad (_("jump to misaligned address (0x%lx)"),
2767                         (unsigned long) address_expr->X_add_number);
2768               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2769               break;
2770
2771             case BFD_RELOC_MIPS16_JMP:
2772               if ((address_expr->X_add_number & 3) != 0)
2773                 as_bad (_("jump to misaligned address (0x%lx)"),
2774                         (unsigned long) address_expr->X_add_number);
2775               ip->insn_opcode |=
2776                 (((address_expr->X_add_number & 0x7c0000) << 3)
2777                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2778                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2779               break;
2780
2781             case BFD_RELOC_16_PCREL_S2:
2782               if ((address_expr->X_add_number & 3) != 0)
2783                 as_bad (_("branch to misaligned address (0x%lx)"),
2784                         (unsigned long) address_expr->X_add_number);
2785               if (mips_relax_branch)
2786                 goto need_reloc;
2787               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2788                 as_bad (_("branch address range overflow (0x%lx)"),
2789                         (unsigned long) address_expr->X_add_number);
2790               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2791               break;
2792
2793             default:
2794               internalError ();
2795             }
2796         }
2797       else if (*reloc_type < BFD_RELOC_UNUSED)
2798         need_reloc:
2799         {
2800           reloc_howto_type *howto;
2801           int i;
2802
2803           /* In a compound relocation, it is the final (outermost)
2804              operator that determines the relocated field.  */
2805           for (i = 1; i < 3; i++)
2806             if (reloc_type[i] == BFD_RELOC_UNUSED)
2807               break;
2808
2809           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2810           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
2811                                      bfd_get_reloc_size (howto),
2812                                      address_expr,
2813                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
2814                                      reloc_type[0]);
2815
2816           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
2817           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
2818               && ip->fixp[0]->fx_addsy)
2819             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
2820
2821           /* These relocations can have an addend that won't fit in
2822              4 octets for 64bit assembly.  */
2823           if (HAVE_64BIT_GPRS
2824               && ! howto->partial_inplace
2825               && (reloc_type[0] == BFD_RELOC_16
2826                   || reloc_type[0] == BFD_RELOC_32
2827                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
2828                   || reloc_type[0] == BFD_RELOC_HI16_S
2829                   || reloc_type[0] == BFD_RELOC_LO16
2830                   || reloc_type[0] == BFD_RELOC_GPREL16
2831                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
2832                   || reloc_type[0] == BFD_RELOC_GPREL32
2833                   || reloc_type[0] == BFD_RELOC_64
2834                   || reloc_type[0] == BFD_RELOC_CTOR
2835                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
2836                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
2837                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
2838                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
2839                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
2840                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
2841                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
2842                   || reloc_type[0] == BFD_RELOC_MIPS16_HI16_S
2843                   || reloc_type[0] == BFD_RELOC_MIPS16_LO16))
2844             ip->fixp[0]->fx_no_overflow = 1;
2845
2846           if (mips_relax.sequence)
2847             {
2848               if (mips_relax.first_fixup == 0)
2849                 mips_relax.first_fixup = ip->fixp[0];
2850             }
2851           else if (reloc_needs_lo_p (*reloc_type))
2852             {
2853               struct mips_hi_fixup *hi_fixup;
2854
2855               /* Reuse the last entry if it already has a matching %lo.  */
2856               hi_fixup = mips_hi_fixup_list;
2857               if (hi_fixup == 0
2858                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
2859                 {
2860                   hi_fixup = ((struct mips_hi_fixup *)
2861                               xmalloc (sizeof (struct mips_hi_fixup)));
2862                   hi_fixup->next = mips_hi_fixup_list;
2863                   mips_hi_fixup_list = hi_fixup;
2864                 }
2865               hi_fixup->fixp = ip->fixp[0];
2866               hi_fixup->seg = now_seg;
2867             }
2868
2869           /* Add fixups for the second and third relocations, if given.
2870              Note that the ABI allows the second relocation to be
2871              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
2872              moment we only use RSS_UNDEF, but we could add support
2873              for the others if it ever becomes necessary.  */
2874           for (i = 1; i < 3; i++)
2875             if (reloc_type[i] != BFD_RELOC_UNUSED)
2876               {
2877                 ip->fixp[i] = fix_new (ip->frag, ip->where,
2878                                        ip->fixp[0]->fx_size, NULL, 0,
2879                                        FALSE, reloc_type[i]);
2880
2881                 /* Use fx_tcbit to mark compound relocs.  */
2882                 ip->fixp[0]->fx_tcbit = 1;
2883                 ip->fixp[i]->fx_tcbit = 1;
2884               }
2885         }
2886     }
2887   install_insn (ip);
2888
2889   /* Update the register mask information.  */
2890   if (! mips_opts.mips16)
2891     {
2892       if (pinfo & INSN_WRITE_GPR_D)
2893         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
2894       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
2895         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
2896       if (pinfo & INSN_READ_GPR_S)
2897         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
2898       if (pinfo & INSN_WRITE_GPR_31)
2899         mips_gprmask |= 1 << RA;
2900       if (pinfo & INSN_WRITE_FPR_D)
2901         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
2902       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
2903         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
2904       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
2905         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
2906       if ((pinfo & INSN_READ_FPR_R) != 0)
2907         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
2908       if (pinfo & INSN_COP)
2909         {
2910           /* We don't keep enough information to sort these cases out.
2911              The itbl support does keep this information however, although
2912              we currently don't support itbl fprmats as part of the cop
2913              instruction.  May want to add this support in the future.  */
2914         }
2915       /* Never set the bit for $0, which is always zero.  */
2916       mips_gprmask &= ~1 << 0;
2917     }
2918   else
2919     {
2920       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
2921         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
2922       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
2923         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
2924       if (pinfo & MIPS16_INSN_WRITE_Z)
2925         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
2926       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
2927         mips_gprmask |= 1 << TREG;
2928       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
2929         mips_gprmask |= 1 << SP;
2930       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
2931         mips_gprmask |= 1 << RA;
2932       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2933         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2934       if (pinfo & MIPS16_INSN_READ_Z)
2935         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
2936       if (pinfo & MIPS16_INSN_READ_GPR_X)
2937         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2938     }
2939
2940   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2941     {
2942       /* Filling the branch delay slot is more complex.  We try to
2943          switch the branch with the previous instruction, which we can
2944          do if the previous instruction does not set up a condition
2945          that the branch tests and if the branch is not itself the
2946          target of any branch.  */
2947       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
2948           || (pinfo & INSN_COND_BRANCH_DELAY))
2949         {
2950           if (mips_optimize < 2
2951               /* If we have seen .set volatile or .set nomove, don't
2952                  optimize.  */
2953               || mips_opts.nomove != 0
2954               /* We can't swap if the previous instruction's position
2955                  is fixed.  */
2956               || history[0].fixed_p
2957               /* If the previous previous insn was in a .set
2958                  noreorder, we can't swap.  Actually, the MIPS
2959                  assembler will swap in this situation.  However, gcc
2960                  configured -with-gnu-as will generate code like
2961                    .set noreorder
2962                    lw   $4,XXX
2963                    .set reorder
2964                    INSN
2965                    bne  $4,$0,foo
2966                  in which we can not swap the bne and INSN.  If gcc is
2967                  not configured -with-gnu-as, it does not output the
2968                  .set pseudo-ops.  */
2969               || history[1].noreorder_p
2970               /* If the branch is itself the target of a branch, we
2971                  can not swap.  We cheat on this; all we check for is
2972                  whether there is a label on this instruction.  If
2973                  there are any branches to anything other than a
2974                  label, users must use .set noreorder.  */
2975               || si->label_list != NULL
2976               /* If the previous instruction is in a variant frag
2977                  other than this branch's one, we cannot do the swap.
2978                  This does not apply to the mips16, which uses variant
2979                  frags for different purposes.  */
2980               || (! mips_opts.mips16
2981                   && prev_insn_frag_type == rs_machine_dependent)
2982               /* Check for conflicts between the branch and the instructions
2983                  before the candidate delay slot.  */
2984               || nops_for_insn (history + 1, ip) > 0
2985               /* Check for conflicts between the swapped sequence and the
2986                  target of the branch.  */
2987               || nops_for_sequence (2, history + 1, ip, history) > 0
2988               /* We do not swap with a trap instruction, since it
2989                  complicates trap handlers to have the trap
2990                  instruction be in a delay slot.  */
2991               || (prev_pinfo & INSN_TRAP)
2992               /* If the branch reads a register that the previous
2993                  instruction sets, we can not swap.  */
2994               || (! mips_opts.mips16
2995                   && (prev_pinfo & INSN_WRITE_GPR_T)
2996                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
2997                                     MIPS_GR_REG))
2998               || (! mips_opts.mips16
2999                   && (prev_pinfo & INSN_WRITE_GPR_D)
3000                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3001                                     MIPS_GR_REG))
3002               || (mips_opts.mips16
3003                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3004                        && (insn_uses_reg
3005                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3006                             MIPS16_REG)))
3007                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3008                           && (insn_uses_reg
3009                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3010                                MIPS16_REG)))
3011                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3012                           && (insn_uses_reg
3013                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3014                                MIPS16_REG)))
3015                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3016                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3017                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3018                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3019                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3020                           && insn_uses_reg (ip,
3021                                             MIPS16OP_EXTRACT_REG32R
3022                                               (history[0].insn_opcode),
3023                                             MIPS_GR_REG))))
3024               /* If the branch writes a register that the previous
3025                  instruction sets, we can not swap (we know that
3026                  branches write only to RD or to $31).  */
3027               || (! mips_opts.mips16
3028                   && (prev_pinfo & INSN_WRITE_GPR_T)
3029                   && (((pinfo & INSN_WRITE_GPR_D)
3030                        && (EXTRACT_OPERAND (RT, history[0])
3031                            == EXTRACT_OPERAND (RD, *ip)))
3032                       || ((pinfo & INSN_WRITE_GPR_31)
3033                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3034               || (! mips_opts.mips16
3035                   && (prev_pinfo & INSN_WRITE_GPR_D)
3036                   && (((pinfo & INSN_WRITE_GPR_D)
3037                        && (EXTRACT_OPERAND (RD, history[0])
3038                            == EXTRACT_OPERAND (RD, *ip)))
3039                       || ((pinfo & INSN_WRITE_GPR_31)
3040                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3041               || (mips_opts.mips16
3042                   && (pinfo & MIPS16_INSN_WRITE_31)
3043                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3044                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3045                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3046                               == RA))))
3047               /* If the branch writes a register that the previous
3048                  instruction reads, we can not swap (we know that
3049                  branches only write to RD or to $31).  */
3050               || (! mips_opts.mips16
3051                   && (pinfo & INSN_WRITE_GPR_D)
3052                   && insn_uses_reg (&history[0],
3053                                     EXTRACT_OPERAND (RD, *ip),
3054                                     MIPS_GR_REG))
3055               || (! mips_opts.mips16
3056                   && (pinfo & INSN_WRITE_GPR_31)
3057                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3058               || (mips_opts.mips16
3059                   && (pinfo & MIPS16_INSN_WRITE_31)
3060                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3061               /* If one instruction sets a condition code and the
3062                  other one uses a condition code, we can not swap.  */
3063               || ((pinfo & INSN_READ_COND_CODE)
3064                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3065               || ((pinfo & INSN_WRITE_COND_CODE)
3066                   && (prev_pinfo & INSN_READ_COND_CODE))
3067               /* If the previous instruction uses the PC, we can not
3068                  swap.  */
3069               || (mips_opts.mips16
3070                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3071               /* If the previous instruction had a fixup in mips16
3072                  mode, we can not swap.  This normally means that the
3073                  previous instruction was a 4 byte branch anyhow.  */
3074               || (mips_opts.mips16 && history[0].fixp[0])
3075               /* If the previous instruction is a sync, sync.l, or
3076                  sync.p, we can not swap.  */
3077               || (prev_pinfo & INSN_SYNC))
3078             {
3079               if (mips_opts.mips16
3080                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3081                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3082                   && ISA_SUPPORTS_MIPS16E)
3083                 {
3084                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3085                   ip->insn_opcode |= 0x0080;
3086                   install_insn (ip);
3087                   insert_into_history (0, 1, ip);
3088                 } 
3089               else
3090                 {
3091                   /* We could do even better for unconditional branches to
3092                      portions of this object file; we could pick up the
3093                      instruction at the destination, put it in the delay
3094                      slot, and bump the destination address.  */
3095                   insert_into_history (0, 1, ip);
3096                   emit_nop ();
3097                 }
3098                 
3099               if (mips_relax.sequence)
3100                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3101             }
3102           else
3103             {
3104               /* It looks like we can actually do the swap.  */
3105               struct mips_cl_insn delay = history[0];
3106               if (mips_opts.mips16)
3107                 {
3108                   know (delay.frag == ip->frag);
3109                   move_insn (ip, delay.frag, delay.where);
3110                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3111                 }
3112               else if (relaxed_branch)
3113                 {
3114                   /* Add the delay slot instruction to the end of the
3115                      current frag and shrink the fixed part of the
3116                      original frag.  If the branch occupies the tail of
3117                      the latter, move it backwards to cover the gap.  */
3118                   delay.frag->fr_fix -= 4;
3119                   if (delay.frag == ip->frag)
3120                     move_insn (ip, ip->frag, ip->where - 4);
3121                   add_fixed_insn (&delay);
3122                 }
3123               else
3124                 {
3125                   move_insn (&delay, ip->frag, ip->where);
3126                   move_insn (ip, history[0].frag, history[0].where);
3127                 }
3128               history[0] = *ip;
3129               delay.fixed_p = 1;
3130               insert_into_history (0, 1, &delay);
3131             }
3132
3133           /* If that was an unconditional branch, forget the previous
3134              insn information.  */
3135           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3136             mips_no_prev_insn ();
3137         }
3138       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3139         {
3140           /* We don't yet optimize a branch likely.  What we should do
3141              is look at the target, copy the instruction found there
3142              into the delay slot, and increment the branch to jump to
3143              the next instruction.  */
3144           insert_into_history (0, 1, ip);
3145           emit_nop ();
3146         }
3147       else
3148         insert_into_history (0, 1, ip);
3149     }
3150   else
3151     insert_into_history (0, 1, ip);
3152
3153   /* We just output an insn, so the next one doesn't have a label.  */
3154   mips_clear_insn_labels ();
3155 }
3156
3157 /* Forget that there was any previous instruction or label.  */
3158
3159 static void
3160 mips_no_prev_insn (void)
3161 {
3162   prev_nop_frag = NULL;
3163   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3164   mips_clear_insn_labels ();
3165 }
3166
3167 /* This function must be called before we emit something other than
3168    instructions.  It is like mips_no_prev_insn except that it inserts
3169    any NOPS that might be needed by previous instructions.  */
3170
3171 void
3172 mips_emit_delays (void)
3173 {
3174   if (! mips_opts.noreorder)
3175     {
3176       int nops = nops_for_insn (history, NULL);
3177       if (nops > 0)
3178         {
3179           while (nops-- > 0)
3180             add_fixed_insn (NOP_INSN);
3181           mips_move_labels ();
3182         }
3183     }
3184   mips_no_prev_insn ();
3185 }
3186
3187 /* Start a (possibly nested) noreorder block.  */
3188
3189 static void
3190 start_noreorder (void)
3191 {
3192   if (mips_opts.noreorder == 0)
3193     {
3194       unsigned int i;
3195       int nops;
3196
3197       /* None of the instructions before the .set noreorder can be moved.  */
3198       for (i = 0; i < ARRAY_SIZE (history); i++)
3199         history[i].fixed_p = 1;
3200
3201       /* Insert any nops that might be needed between the .set noreorder
3202          block and the previous instructions.  We will later remove any
3203          nops that turn out not to be needed.  */
3204       nops = nops_for_insn (history, NULL);
3205       if (nops > 0)
3206         {
3207           if (mips_optimize != 0)
3208             {
3209               /* Record the frag which holds the nop instructions, so
3210                  that we can remove them if we don't need them.  */
3211               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3212               prev_nop_frag = frag_now;
3213               prev_nop_frag_holds = nops;
3214               prev_nop_frag_required = 0;
3215               prev_nop_frag_since = 0;
3216             }
3217
3218           for (; nops > 0; --nops)
3219             add_fixed_insn (NOP_INSN);
3220
3221           /* Move on to a new frag, so that it is safe to simply
3222              decrease the size of prev_nop_frag.  */
3223           frag_wane (frag_now);
3224           frag_new (0);
3225           mips_move_labels ();
3226         }
3227       mips16_mark_labels ();
3228       mips_clear_insn_labels ();
3229     }
3230   mips_opts.noreorder++;
3231   mips_any_noreorder = 1;
3232 }
3233
3234 /* End a nested noreorder block.  */
3235
3236 static void
3237 end_noreorder (void)
3238 {
3239   mips_opts.noreorder--;
3240   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3241     {
3242       /* Commit to inserting prev_nop_frag_required nops and go back to
3243          handling nop insertion the .set reorder way.  */
3244       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3245                                 * (mips_opts.mips16 ? 2 : 4));
3246       insert_into_history (prev_nop_frag_since,
3247                            prev_nop_frag_required, NOP_INSN);
3248       prev_nop_frag = NULL;
3249     }
3250 }
3251
3252 /* Set up global variables for the start of a new macro.  */
3253
3254 static void
3255 macro_start (void)
3256 {
3257   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3258   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3259                                      && (history[0].insn_mo->pinfo
3260                                          & (INSN_UNCOND_BRANCH_DELAY
3261                                             | INSN_COND_BRANCH_DELAY
3262                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3263 }
3264
3265 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3266    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3267    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3268
3269 static const char *
3270 macro_warning (relax_substateT subtype)
3271 {
3272   if (subtype & RELAX_DELAY_SLOT)
3273     return _("Macro instruction expanded into multiple instructions"
3274              " in a branch delay slot");
3275   else if (subtype & RELAX_NOMACRO)
3276     return _("Macro instruction expanded into multiple instructions");
3277   else
3278     return 0;
3279 }
3280
3281 /* Finish up a macro.  Emit warnings as appropriate.  */
3282
3283 static void
3284 macro_end (void)
3285 {
3286   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3287     {
3288       relax_substateT subtype;
3289
3290       /* Set up the relaxation warning flags.  */
3291       subtype = 0;
3292       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3293         subtype |= RELAX_SECOND_LONGER;
3294       if (mips_opts.warn_about_macros)
3295         subtype |= RELAX_NOMACRO;
3296       if (mips_macro_warning.delay_slot_p)
3297         subtype |= RELAX_DELAY_SLOT;
3298
3299       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3300         {
3301           /* Either the macro has a single implementation or both
3302              implementations are longer than 4 bytes.  Emit the
3303              warning now.  */
3304           const char *msg = macro_warning (subtype);
3305           if (msg != 0)
3306             as_warn (msg);
3307         }
3308       else
3309         {
3310           /* One implementation might need a warning but the other
3311              definitely doesn't.  */
3312           mips_macro_warning.first_frag->fr_subtype |= subtype;
3313         }
3314     }
3315 }
3316
3317 /* Read a macro's relocation codes from *ARGS and store them in *R.
3318    The first argument in *ARGS will be either the code for a single
3319    relocation or -1 followed by the three codes that make up a
3320    composite relocation.  */
3321
3322 static void
3323 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3324 {
3325   int i, next;
3326
3327   next = va_arg (*args, int);
3328   if (next >= 0)
3329     r[0] = (bfd_reloc_code_real_type) next;
3330   else
3331     for (i = 0; i < 3; i++)
3332       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3333 }
3334
3335 /* Build an instruction created by a macro expansion.  This is passed
3336    a pointer to the count of instructions created so far, an
3337    expression, the name of the instruction to build, an operand format
3338    string, and corresponding arguments.  */
3339
3340 static void
3341 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3342 {
3343   const struct mips_opcode *mo;
3344   struct mips_cl_insn insn;
3345   bfd_reloc_code_real_type r[3];
3346   va_list args;
3347
3348   va_start (args, fmt);
3349
3350   if (mips_opts.mips16)
3351     {
3352       mips16_macro_build (ep, name, fmt, args);
3353       va_end (args);
3354       return;
3355     }
3356
3357   r[0] = BFD_RELOC_UNUSED;
3358   r[1] = BFD_RELOC_UNUSED;
3359   r[2] = BFD_RELOC_UNUSED;
3360   mo = (struct mips_opcode *) hash_find (op_hash, name);
3361   assert (mo);
3362   assert (strcmp (name, mo->name) == 0);
3363
3364   while (1)
3365     {
3366       /* Search until we get a match for NAME.  It is assumed here that
3367          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3368       if (strcmp (fmt, mo->args) == 0
3369           && mo->pinfo != INSN_MACRO
3370           && OPCODE_IS_MEMBER (mo,
3371                                (mips_opts.isa
3372                                 | (mips_opts.mips16 ? INSN_MIPS16 : 0)
3373                                 | (mips_opts.ase_dsp ? INSN_DSP : 0)
3374                                 | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
3375                                    ? INSN_DSP64 : 0)
3376                                 | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
3377                                 | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
3378                                mips_opts.arch)
3379           && (mips_opts.arch != CPU_R4650 || (mo->pinfo & FP_D) == 0))
3380         break;
3381
3382       ++mo;
3383       assert (mo->name);
3384       assert (strcmp (name, mo->name) == 0);
3385     }
3386
3387   create_insn (&insn, mo);
3388   for (;;)
3389     {
3390       switch (*fmt++)
3391         {
3392         case '\0':
3393           break;
3394
3395         case ',':
3396         case '(':
3397         case ')':
3398           continue;
3399
3400         case '+':
3401           switch (*fmt++)
3402             {
3403             case 'A':
3404             case 'E':
3405               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3406               continue;
3407
3408             case 'B':
3409             case 'F':
3410               /* Note that in the macro case, these arguments are already
3411                  in MSB form.  (When handling the instruction in the
3412                  non-macro case, these arguments are sizes from which
3413                  MSB values must be calculated.)  */
3414               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3415               continue;
3416
3417             case 'C':
3418             case 'G':
3419             case 'H':
3420               /* Note that in the macro case, these arguments are already
3421                  in MSBD form.  (When handling the instruction in the
3422                  non-macro case, these arguments are sizes from which
3423                  MSBD values must be calculated.)  */
3424               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3425               continue;
3426
3427             default:
3428               internalError ();
3429             }
3430           continue;
3431
3432         case '2':
3433           INSERT_OPERAND (BP, insn, va_arg (args, int));
3434           continue;
3435
3436         case 't':
3437         case 'w':
3438         case 'E':
3439           INSERT_OPERAND (RT, insn, va_arg (args, int));
3440           continue;
3441
3442         case 'c':
3443           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3444           continue;
3445
3446         case 'T':
3447         case 'W':
3448           INSERT_OPERAND (FT, insn, va_arg (args, int));
3449           continue;
3450
3451         case 'd':
3452         case 'G':
3453         case 'K':
3454           INSERT_OPERAND (RD, insn, va_arg (args, int));
3455           continue;
3456
3457         case 'U':
3458           {
3459             int tmp = va_arg (args, int);
3460
3461             INSERT_OPERAND (RT, insn, tmp);
3462             INSERT_OPERAND (RD, insn, tmp);
3463             continue;
3464           }
3465
3466         case 'V':
3467         case 'S':
3468           INSERT_OPERAND (FS, insn, va_arg (args, int));
3469           continue;
3470
3471         case 'z':
3472           continue;
3473
3474         case '<':
3475           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3476           continue;
3477
3478         case 'D':
3479           INSERT_OPERAND (FD, insn, va_arg (args, int));
3480           continue;
3481
3482         case 'B':
3483           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3484           continue;
3485
3486         case 'J':
3487           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3488           continue;
3489
3490         case 'q':
3491           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3492           continue;
3493
3494         case 'b':
3495         case 's':
3496         case 'r':
3497         case 'v':
3498           INSERT_OPERAND (RS, insn, va_arg (args, int));
3499           continue;
3500
3501         case 'i':
3502         case 'j':
3503         case 'o':
3504           macro_read_relocs (&args, r);
3505           assert (*r == BFD_RELOC_GPREL16
3506                   || *r == BFD_RELOC_MIPS_LITERAL
3507                   || *r == BFD_RELOC_MIPS_HIGHER
3508                   || *r == BFD_RELOC_HI16_S
3509                   || *r == BFD_RELOC_LO16
3510                   || *r == BFD_RELOC_MIPS_GOT16
3511                   || *r == BFD_RELOC_MIPS_CALL16
3512                   || *r == BFD_RELOC_MIPS_GOT_DISP
3513                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3514                   || *r == BFD_RELOC_MIPS_GOT_OFST
3515                   || *r == BFD_RELOC_MIPS_GOT_LO16
3516                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3517           continue;
3518
3519         case 'u':
3520           macro_read_relocs (&args, r);
3521           assert (ep != NULL
3522                   && (ep->X_op == O_constant
3523                       || (ep->X_op == O_symbol
3524                           && (*r == BFD_RELOC_MIPS_HIGHEST
3525                               || *r == BFD_RELOC_HI16_S
3526                               || *r == BFD_RELOC_HI16
3527                               || *r == BFD_RELOC_GPREL16
3528                               || *r == BFD_RELOC_MIPS_GOT_HI16
3529                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3530           continue;
3531
3532         case 'p':
3533           assert (ep != NULL);
3534
3535           /*
3536            * This allows macro() to pass an immediate expression for
3537            * creating short branches without creating a symbol.
3538            *
3539            * We don't allow branch relaxation for these branches, as
3540            * they should only appear in ".set nomacro" anyway.
3541            */
3542           if (ep->X_op == O_constant)
3543             {
3544               if ((ep->X_add_number & 3) != 0)
3545                 as_bad (_("branch to misaligned address (0x%lx)"),
3546                         (unsigned long) ep->X_add_number);
3547               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3548                 as_bad (_("branch address range overflow (0x%lx)"),
3549                         (unsigned long) ep->X_add_number);
3550               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3551               ep = NULL;
3552             }
3553           else
3554             *r = BFD_RELOC_16_PCREL_S2;
3555           continue;
3556
3557         case 'a':
3558           assert (ep != NULL);
3559           *r = BFD_RELOC_MIPS_JMP;
3560           continue;
3561
3562         case 'C':
3563           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3564           continue;
3565
3566         case 'k':
3567           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3568           continue;
3569
3570         default:
3571           internalError ();
3572         }
3573       break;
3574     }
3575   va_end (args);
3576   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3577
3578   append_insn (&insn, ep, r);
3579 }
3580
3581 static void
3582 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3583                     va_list args)
3584 {
3585   struct mips_opcode *mo;
3586   struct mips_cl_insn insn;
3587   bfd_reloc_code_real_type r[3]
3588     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3589
3590   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3591   assert (mo);
3592   assert (strcmp (name, mo->name) == 0);
3593
3594   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3595     {
3596       ++mo;
3597       assert (mo->name);
3598       assert (strcmp (name, mo->name) == 0);
3599     }
3600
3601   create_insn (&insn, mo);
3602   for (;;)
3603     {
3604       int c;
3605
3606       c = *fmt++;
3607       switch (c)
3608         {
3609         case '\0':
3610           break;
3611
3612         case ',':
3613         case '(':
3614         case ')':
3615           continue;
3616
3617         case 'y':
3618         case 'w':
3619           MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3620           continue;
3621
3622         case 'x':
3623         case 'v':
3624           MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3625           continue;
3626
3627         case 'z':
3628           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3629           continue;
3630
3631         case 'Z':
3632           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3633           continue;
3634
3635         case '0':
3636         case 'S':
3637         case 'P':
3638         case 'R':
3639           continue;
3640
3641         case 'X':
3642           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3643           continue;
3644
3645         case 'Y':
3646           {
3647             int regno;
3648
3649             regno = va_arg (args, int);
3650             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3651             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3652           }
3653           continue;
3654
3655         case '<':
3656         case '>':
3657         case '4':
3658         case '5':
3659         case 'H':
3660         case 'W':
3661         case 'D':
3662         case 'j':
3663         case '8':
3664         case 'V':
3665         case 'C':
3666         case 'U':
3667         case 'k':
3668         case 'K':
3669         case 'p':
3670         case 'q':
3671           {
3672             assert (ep != NULL);
3673
3674             if (ep->X_op != O_constant)
3675               *r = (int) BFD_RELOC_UNUSED + c;
3676             else
3677               {
3678                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3679                               FALSE, &insn.insn_opcode, &insn.use_extend,
3680                               &insn.extend);
3681                 ep = NULL;
3682                 *r = BFD_RELOC_UNUSED;
3683               }
3684           }
3685           continue;
3686
3687         case '6':
3688           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3689           continue;
3690         }
3691
3692       break;
3693     }
3694
3695   assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3696
3697   append_insn (&insn, ep, r);
3698 }
3699
3700 /*
3701  * Sign-extend 32-bit mode constants that have bit 31 set and all
3702  * higher bits unset.
3703  */
3704 static void
3705 normalize_constant_expr (expressionS *ex)
3706 {
3707   if (ex->X_op == O_constant
3708       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3709     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3710                         - 0x80000000);
3711 }
3712
3713 /*
3714  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3715  * all higher bits unset.
3716  */
3717 static void
3718 normalize_address_expr (expressionS *ex)
3719 {
3720   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3721         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3722       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3723     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3724                         - 0x80000000);
3725 }
3726
3727 /*
3728  * Generate a "jalr" instruction with a relocation hint to the called
3729  * function.  This occurs in NewABI PIC code.
3730  */
3731 static void
3732 macro_build_jalr (expressionS *ep)
3733 {
3734   char *f = NULL;
3735
3736   if (HAVE_NEWABI)
3737     {
3738       frag_grow (8);
3739       f = frag_more (0);
3740     }
3741   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3742   if (HAVE_NEWABI)
3743     fix_new_exp (frag_now, f - frag_now->fr_literal,
3744                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3745 }
3746
3747 /*
3748  * Generate a "lui" instruction.
3749  */
3750 static void
3751 macro_build_lui (expressionS *ep, int regnum)
3752 {
3753   expressionS high_expr;
3754   const struct mips_opcode *mo;
3755   struct mips_cl_insn insn;
3756   bfd_reloc_code_real_type r[3]
3757     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3758   const char *name = "lui";
3759   const char *fmt = "t,u";
3760
3761   assert (! mips_opts.mips16);
3762
3763   high_expr = *ep;
3764
3765   if (high_expr.X_op == O_constant)
3766     {
3767       /* We can compute the instruction now without a relocation entry.  */
3768       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3769                                 >> 16) & 0xffff;
3770       *r = BFD_RELOC_UNUSED;
3771     }
3772   else
3773     {
3774       assert (ep->X_op == O_symbol);
3775       /* _gp_disp is a special case, used from s_cpload.
3776          __gnu_local_gp is used if mips_no_shared.  */
3777       assert (mips_pic == NO_PIC
3778               || (! HAVE_NEWABI
3779                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3780               || (! mips_in_shared
3781                   && strcmp (S_GET_NAME (ep->X_add_symbol),
3782                              "__gnu_local_gp") == 0));
3783       *r = BFD_RELOC_HI16_S;
3784     }
3785
3786   mo = hash_find (op_hash, name);
3787   assert (strcmp (name, mo->name) == 0);
3788   assert (strcmp (fmt, mo->args) == 0);
3789   create_insn (&insn, mo);
3790
3791   insn.insn_opcode = insn.insn_mo->match;
3792   INSERT_OPERAND (RT, insn, regnum);
3793   if (*r == BFD_RELOC_UNUSED)
3794     {
3795       insn.insn_opcode |= high_expr.X_add_number;
3796       append_insn (&insn, NULL, r);
3797     }
3798   else
3799     append_insn (&insn, &high_expr, r);
3800 }
3801
3802 /* Generate a sequence of instructions to do a load or store from a constant
3803    offset off of a base register (breg) into/from a target register (treg),
3804    using AT if necessary.  */
3805 static void
3806 macro_build_ldst_constoffset (expressionS *ep, const char *op,
3807                               int treg, int breg, int dbl)
3808 {
3809   assert (ep->X_op == O_constant);
3810
3811   /* Sign-extending 32-bit constants makes their handling easier.  */
3812   if (!dbl)
3813     normalize_constant_expr (ep);
3814
3815   /* Right now, this routine can only handle signed 32-bit constants.  */
3816   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
3817     as_warn (_("operand overflow"));
3818
3819   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
3820     {
3821       /* Signed 16-bit offset will fit in the op.  Easy!  */
3822       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
3823     }
3824   else
3825     {
3826       /* 32-bit offset, need multiple instructions and AT, like:
3827            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
3828            addu     $tempreg,$tempreg,$breg
3829            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
3830          to handle the complete offset.  */
3831       macro_build_lui (ep, AT);
3832       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
3833       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
3834
3835       if (!mips_opts.at)
3836         as_bad (_("Macro used $at after \".set noat\""));
3837     }
3838 }
3839
3840 /*                      set_at()
3841  * Generates code to set the $at register to true (one)
3842  * if reg is less than the immediate expression.
3843  */
3844 static void
3845 set_at (int reg, int unsignedp)
3846 {
3847   if (imm_expr.X_op == O_constant
3848       && imm_expr.X_add_number >= -0x8000
3849       && imm_expr.X_add_number < 0x8000)
3850     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
3851                  AT, reg, BFD_RELOC_LO16);
3852   else
3853     {
3854       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
3855       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
3856     }
3857 }
3858
3859 /* Warn if an expression is not a constant.  */
3860
3861 static void
3862 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
3863 {
3864   if (ex->X_op == O_big)
3865     as_bad (_("unsupported large constant"));
3866   else if (ex->X_op != O_constant)
3867     as_bad (_("Instruction %s requires absolute expression"),
3868             ip->insn_mo->name);
3869
3870   if (HAVE_32BIT_GPRS)
3871     normalize_constant_expr (ex);
3872 }
3873
3874 /* Count the leading zeroes by performing a binary chop. This is a
3875    bulky bit of source, but performance is a LOT better for the
3876    majority of values than a simple loop to count the bits:
3877        for (lcnt = 0; (lcnt < 32); lcnt++)
3878          if ((v) & (1 << (31 - lcnt)))
3879            break;
3880   However it is not code size friendly, and the gain will drop a bit
3881   on certain cached systems.
3882 */
3883 #define COUNT_TOP_ZEROES(v)             \
3884   (((v) & ~0xffff) == 0                 \
3885    ? ((v) & ~0xff) == 0                 \
3886      ? ((v) & ~0xf) == 0                \
3887        ? ((v) & ~0x3) == 0              \
3888          ? ((v) & ~0x1) == 0            \
3889            ? !(v)                       \
3890              ? 32                       \
3891              : 31                       \
3892            : 30                         \
3893          : ((v) & ~0x7) == 0            \
3894            ? 29                         \
3895            : 28                         \
3896        : ((v) & ~0x3f) == 0             \
3897          ? ((v) & ~0x1f) == 0           \
3898            ? 27                         \
3899            : 26                         \
3900          : ((v) & ~0x7f) == 0           \
3901            ? 25                         \
3902            : 24                         \
3903      : ((v) & ~0xfff) == 0              \
3904        ? ((v) & ~0x3ff) == 0            \
3905          ? ((v) & ~0x1ff) == 0          \
3906            ? 23                         \
3907            : 22                         \
3908          : ((v) & ~0x7ff) == 0          \
3909            ? 21                         \
3910            : 20                         \
3911        : ((v) & ~0x3fff) == 0           \
3912          ? ((v) & ~0x1fff) == 0         \
3913            ? 19                         \
3914            : 18                         \
3915          : ((v) & ~0x7fff) == 0         \
3916            ? 17                         \
3917            : 16                         \
3918    : ((v) & ~0xffffff) == 0             \
3919      ? ((v) & ~0xfffff) == 0            \
3920        ? ((v) & ~0x3ffff) == 0          \
3921          ? ((v) & ~0x1ffff) == 0        \
3922            ? 15                         \
3923            : 14                         \
3924          : ((v) & ~0x7ffff) == 0        \
3925            ? 13                         \
3926            : 12                         \
3927        : ((v) & ~0x3fffff) == 0         \
3928          ? ((v) & ~0x1fffff) == 0       \
3929            ? 11                         \
3930            : 10                         \
3931          : ((v) & ~0x7fffff) == 0       \
3932            ? 9                          \
3933            : 8                          \
3934      : ((v) & ~0xfffffff) == 0          \
3935        ? ((v) & ~0x3ffffff) == 0        \
3936          ? ((v) & ~0x1ffffff) == 0      \
3937            ? 7                          \
3938            : 6                          \
3939          : ((v) & ~0x7ffffff) == 0      \
3940            ? 5                          \
3941            : 4                          \
3942        : ((v) & ~0x3fffffff) == 0       \
3943          ? ((v) & ~0x1fffffff) == 0     \
3944            ? 3                          \
3945            : 2                          \
3946          : ((v) & ~0x7fffffff) == 0     \
3947            ? 1                          \
3948            : 0)
3949
3950 /*                      load_register()
3951  *  This routine generates the least number of instructions necessary to load
3952  *  an absolute expression value into a register.
3953  */
3954 static void
3955 load_register (int reg, expressionS *ep, int dbl)
3956 {
3957   int freg;
3958   expressionS hi32, lo32;
3959
3960   if (ep->X_op != O_big)
3961     {
3962       assert (ep->X_op == O_constant);
3963
3964       /* Sign-extending 32-bit constants makes their handling easier.  */
3965       if (!dbl)
3966         normalize_constant_expr (ep);
3967
3968       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
3969         {
3970           /* We can handle 16 bit signed values with an addiu to
3971              $zero.  No need to ever use daddiu here, since $zero and
3972              the result are always correct in 32 bit mode.  */
3973           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
3974           return;
3975         }
3976       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
3977         {
3978           /* We can handle 16 bit unsigned values with an ori to
3979              $zero.  */
3980           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
3981           return;
3982         }
3983       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
3984         {
3985           /* 32 bit values require an lui.  */
3986           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
3987           if ((ep->X_add_number & 0xffff) != 0)
3988             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
3989           return;
3990         }
3991     }
3992
3993   /* The value is larger than 32 bits.  */
3994
3995   if (!dbl || HAVE_32BIT_GPRS)
3996     {
3997       char value[32];
3998
3999       sprintf_vma (value, ep->X_add_number);
4000       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4001       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4002       return;
4003     }
4004
4005   if (ep->X_op != O_big)
4006     {
4007       hi32 = *ep;
4008       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4009       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4010       hi32.X_add_number &= 0xffffffff;
4011       lo32 = *ep;
4012       lo32.X_add_number &= 0xffffffff;
4013     }
4014   else
4015     {
4016       assert (ep->X_add_number > 2);
4017       if (ep->X_add_number == 3)
4018         generic_bignum[3] = 0;
4019       else if (ep->X_add_number > 4)
4020         as_bad (_("Number larger than 64 bits"));
4021       lo32.X_op = O_constant;
4022       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4023       hi32.X_op = O_constant;
4024       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4025     }
4026
4027   if (hi32.X_add_number == 0)
4028     freg = 0;
4029   else
4030     {
4031       int shift, bit;
4032       unsigned long hi, lo;
4033
4034       if (hi32.X_add_number == (offsetT) 0xffffffff)
4035         {
4036           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4037             {
4038               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4039               return;
4040             }
4041           if (lo32.X_add_number & 0x80000000)
4042             {
4043               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4044               if (lo32.X_add_number & 0xffff)
4045                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4046               return;
4047             }
4048         }
4049
4050       /* Check for 16bit shifted constant.  We know that hi32 is
4051          non-zero, so start the mask on the first bit of the hi32
4052          value.  */
4053       shift = 17;
4054       do
4055         {
4056           unsigned long himask, lomask;
4057
4058           if (shift < 32)
4059             {
4060               himask = 0xffff >> (32 - shift);
4061               lomask = (0xffff << shift) & 0xffffffff;
4062             }
4063           else
4064             {
4065               himask = 0xffff << (shift - 32);
4066               lomask = 0;
4067             }
4068           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4069               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4070             {
4071               expressionS tmp;
4072
4073               tmp.X_op = O_constant;
4074               if (shift < 32)
4075                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4076                                     | (lo32.X_add_number >> shift));
4077               else
4078                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4079               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4080               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4081                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4082               return;
4083             }
4084           ++shift;
4085         }
4086       while (shift <= (64 - 16));
4087
4088       /* Find the bit number of the lowest one bit, and store the
4089          shifted value in hi/lo.  */
4090       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4091       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4092       if (lo != 0)
4093         {
4094           bit = 0;
4095           while ((lo & 1) == 0)
4096             {
4097               lo >>= 1;
4098               ++bit;
4099             }
4100           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4101           hi >>= bit;
4102         }
4103       else
4104         {
4105           bit = 32;
4106           while ((hi & 1) == 0)
4107             {
4108               hi >>= 1;
4109               ++bit;
4110             }
4111           lo = hi;
4112           hi = 0;
4113         }
4114
4115       /* Optimize if the shifted value is a (power of 2) - 1.  */
4116       if ((hi == 0 && ((lo + 1) & lo) == 0)
4117           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4118         {
4119           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4120           if (shift != 0)
4121             {
4122               expressionS tmp;
4123
4124               /* This instruction will set the register to be all
4125                  ones.  */
4126               tmp.X_op = O_constant;
4127               tmp.X_add_number = (offsetT) -1;
4128               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4129               if (bit != 0)
4130                 {
4131                   bit += shift;
4132                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4133                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4134                 }
4135               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4136                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4137               return;
4138             }
4139         }
4140
4141       /* Sign extend hi32 before calling load_register, because we can
4142          generally get better code when we load a sign extended value.  */
4143       if ((hi32.X_add_number & 0x80000000) != 0)
4144         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4145       load_register (reg, &hi32, 0);
4146       freg = reg;
4147     }
4148   if ((lo32.X_add_number & 0xffff0000) == 0)
4149     {
4150       if (freg != 0)
4151         {
4152           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4153           freg = reg;
4154         }
4155     }
4156   else
4157     {
4158       expressionS mid16;
4159
4160       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4161         {
4162           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4163           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4164           return;
4165         }
4166
4167       if (freg != 0)
4168         {
4169           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4170           freg = reg;
4171         }
4172       mid16 = lo32;
4173       mid16.X_add_number >>= 16;
4174       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4175       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4176       freg = reg;
4177     }
4178   if ((lo32.X_add_number & 0xffff) != 0)
4179     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4180 }
4181
4182 static inline void
4183 load_delay_nop (void)
4184 {
4185   if (!gpr_interlocks)
4186     macro_build (NULL, "nop", "");
4187 }
4188
4189 /* Load an address into a register.  */
4190
4191 static void
4192 load_address (int reg, expressionS *ep, int *used_at)
4193 {
4194   if (ep->X_op != O_constant
4195       && ep->X_op != O_symbol)
4196     {
4197       as_bad (_("expression too complex"));
4198       ep->X_op = O_constant;
4199     }
4200
4201   if (ep->X_op == O_constant)
4202     {
4203       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4204       return;
4205     }
4206
4207   if (mips_pic == NO_PIC)
4208     {
4209       /* If this is a reference to a GP relative symbol, we want
4210            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4211          Otherwise we want
4212            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4213            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4214          If we have an addend, we always use the latter form.
4215
4216          With 64bit address space and a usable $at we want
4217            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4218            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4219            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4220            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4221            dsll32       $reg,0
4222            daddu        $reg,$reg,$at
4223
4224          If $at is already in use, we use a path which is suboptimal
4225          on superscalar processors.
4226            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4227            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4228            dsll         $reg,16
4229            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4230            dsll         $reg,16
4231            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4232
4233          For GP relative symbols in 64bit address space we can use
4234          the same sequence as in 32bit address space.  */
4235       if (HAVE_64BIT_SYMBOLS)
4236         {
4237           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4238               && !nopic_need_relax (ep->X_add_symbol, 1))
4239             {
4240               relax_start (ep->X_add_symbol);
4241               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4242                            mips_gp_register, BFD_RELOC_GPREL16);
4243               relax_switch ();
4244             }
4245
4246           if (*used_at == 0 && mips_opts.at)
4247             {
4248               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4249               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4250               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4251                            BFD_RELOC_MIPS_HIGHER);
4252               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4253               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4254               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4255               *used_at = 1;
4256             }
4257           else
4258             {
4259               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4260               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4261                            BFD_RELOC_MIPS_HIGHER);
4262               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4263               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4264               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4265               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4266             }
4267
4268           if (mips_relax.sequence)
4269             relax_end ();
4270         }
4271       else
4272         {
4273           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4274               && !nopic_need_relax (ep->X_add_symbol, 1))
4275             {
4276               relax_start (ep->X_add_symbol);
4277               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4278                            mips_gp_register, BFD_RELOC_GPREL16);
4279               relax_switch ();
4280             }
4281           macro_build_lui (ep, reg);
4282           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4283                        reg, reg, BFD_RELOC_LO16);
4284           if (mips_relax.sequence)
4285             relax_end ();
4286         }
4287     }
4288   else if (!mips_big_got)
4289     {
4290       expressionS ex;
4291
4292       /* If this is a reference to an external symbol, we want
4293            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4294          Otherwise we want
4295            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4296            nop
4297            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4298          If there is a constant, it must be added in after.
4299
4300          If we have NewABI, we want
4301            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4302          unless we're referencing a global symbol with a non-zero
4303          offset, in which case cst must be added separately.  */
4304       if (HAVE_NEWABI)
4305         {
4306           if (ep->X_add_number)
4307             {
4308               ex.X_add_number = ep->X_add_number;
4309               ep->X_add_number = 0;
4310               relax_start (ep->X_add_symbol);
4311               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4312                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4313               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4314                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4315               ex.X_op = O_constant;
4316               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4317                            reg, reg, BFD_RELOC_LO16);
4318               ep->X_add_number = ex.X_add_number;
4319               relax_switch ();
4320             }
4321           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4322                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4323           if (mips_relax.sequence)
4324             relax_end ();
4325         }
4326       else
4327         {
4328           ex.X_add_number = ep->X_add_number;
4329           ep->X_add_number = 0;
4330           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4331                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4332           load_delay_nop ();
4333           relax_start (ep->X_add_symbol);
4334           relax_switch ();
4335           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4336                        BFD_RELOC_LO16);
4337           relax_end ();
4338
4339           if (ex.X_add_number != 0)
4340             {
4341               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4342                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4343               ex.X_op = O_constant;
4344               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4345                            reg, reg, BFD_RELOC_LO16);
4346             }
4347         }
4348     }
4349   else if (mips_big_got)
4350     {
4351       expressionS ex;
4352
4353       /* This is the large GOT case.  If this is a reference to an
4354          external symbol, we want
4355            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4356            addu         $reg,$reg,$gp
4357            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4358
4359          Otherwise, for a reference to a local symbol in old ABI, we want
4360            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4361            nop
4362            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4363          If there is a constant, it must be added in after.
4364
4365          In the NewABI, for local symbols, with or without offsets, we want:
4366            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4367            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4368       */
4369       if (HAVE_NEWABI)
4370         {
4371           ex.X_add_number = ep->X_add_number;
4372           ep->X_add_number = 0;
4373           relax_start (ep->X_add_symbol);
4374           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4375           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4376                        reg, reg, mips_gp_register);
4377           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4378                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4379           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4380             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4381           else if (ex.X_add_number)
4382             {
4383               ex.X_op = O_constant;
4384               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4385                            BFD_RELOC_LO16);
4386             }
4387
4388           ep->X_add_number = ex.X_add_number;
4389           relax_switch ();
4390           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4391                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4392           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4393                        BFD_RELOC_MIPS_GOT_OFST);
4394           relax_end ();
4395         }
4396       else
4397         {
4398           ex.X_add_number = ep->X_add_number;
4399           ep->X_add_number = 0;
4400           relax_start (ep->X_add_symbol);
4401           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4402           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4403                        reg, reg, mips_gp_register);
4404           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4405                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4406           relax_switch ();
4407           if (reg_needs_delay (mips_gp_register))
4408             {
4409               /* We need a nop before loading from $gp.  This special
4410                  check is required because the lui which starts the main
4411                  instruction stream does not refer to $gp, and so will not
4412                  insert the nop which may be required.  */
4413               macro_build (NULL, "nop", "");
4414             }
4415           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4416                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4417           load_delay_nop ();
4418           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4419                        BFD_RELOC_LO16);
4420           relax_end ();
4421
4422           if (ex.X_add_number != 0)
4423             {
4424               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4425                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4426               ex.X_op = O_constant;
4427               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4428                            BFD_RELOC_LO16);
4429             }
4430         }
4431     }
4432   else
4433     abort ();
4434
4435   if (!mips_opts.at && *used_at == 1)
4436     as_bad (_("Macro used $at after \".set noat\""));
4437 }
4438
4439 /* Move the contents of register SOURCE into register DEST.  */
4440
4441 static void
4442 move_register (int dest, int source)
4443 {
4444   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4445                dest, source, 0);
4446 }
4447
4448 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4449    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4450    The two alternatives are:
4451
4452    Global symbol                Local sybmol
4453    -------------                ------------
4454    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4455    ...                          ...
4456    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4457
4458    load_got_offset emits the first instruction and add_got_offset
4459    emits the second for a 16-bit offset or add_got_offset_hilo emits
4460    a sequence to add a 32-bit offset using a scratch register.  */
4461
4462 static void
4463 load_got_offset (int dest, expressionS *local)
4464 {
4465   expressionS global;
4466
4467   global = *local;
4468   global.X_add_number = 0;
4469
4470   relax_start (local->X_add_symbol);
4471   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4472                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4473   relax_switch ();
4474   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4475                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4476   relax_end ();
4477 }
4478
4479 static void
4480 add_got_offset (int dest, expressionS *local)
4481 {
4482   expressionS global;
4483
4484   global.X_op = O_constant;
4485   global.X_op_symbol = NULL;
4486   global.X_add_symbol = NULL;
4487   global.X_add_number = local->X_add_number;
4488
4489   relax_start (local->X_add_symbol);
4490   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4491                dest, dest, BFD_RELOC_LO16);
4492   relax_switch ();
4493   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4494   relax_end ();
4495 }
4496
4497 static void
4498 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4499 {
4500   expressionS global;
4501   int hold_mips_optimize;
4502
4503   global.X_op = O_constant;
4504   global.X_op_symbol = NULL;
4505   global.X_add_symbol = NULL;
4506   global.X_add_number = local->X_add_number;
4507
4508   relax_start (local->X_add_symbol);
4509   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4510   relax_switch ();
4511   /* Set mips_optimize around the lui instruction to avoid
4512      inserting an unnecessary nop after the lw.  */
4513   hold_mips_optimize = mips_optimize;
4514   mips_optimize = 2;
4515   macro_build_lui (&global, tmp);
4516   mips_optimize = hold_mips_optimize;
4517   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4518   relax_end ();
4519
4520   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4521 }
4522
4523 /*
4524  *                      Build macros
4525  *   This routine implements the seemingly endless macro or synthesized
4526  * instructions and addressing modes in the mips assembly language. Many
4527  * of these macros are simple and are similar to each other. These could
4528  * probably be handled by some kind of table or grammar approach instead of
4529  * this verbose method. Others are not simple macros but are more like
4530  * optimizing code generation.
4531  *   One interesting optimization is when several store macros appear
4532  * consecutively that would load AT with the upper half of the same address.
4533  * The ensuing load upper instructions are ommited. This implies some kind
4534  * of global optimization. We currently only optimize within a single macro.
4535  *   For many of the load and store macros if the address is specified as a
4536  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4537  * first load register 'at' with zero and use it as the base register. The
4538  * mips assembler simply uses register $zero. Just one tiny optimization
4539  * we're missing.
4540  */
4541 static void
4542 macro (struct mips_cl_insn *ip)
4543 {
4544   unsigned int treg, sreg, dreg, breg;
4545   unsigned int tempreg;
4546   int mask;
4547   int used_at = 0;
4548   expressionS expr1;
4549   const char *s;
4550   const char *s2;
4551   const char *fmt;
4552   int likely = 0;
4553   int dbl = 0;
4554   int coproc = 0;
4555   int lr = 0;
4556   int imm = 0;
4557   int call = 0;
4558   int off;
4559   offsetT maxnum;
4560   bfd_reloc_code_real_type r;
4561   int hold_mips_optimize;
4562
4563   assert (! mips_opts.mips16);
4564
4565   treg = (ip->insn_opcode >> 16) & 0x1f;
4566   dreg = (ip->insn_opcode >> 11) & 0x1f;
4567   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4568   mask = ip->insn_mo->mask;
4569
4570   expr1.X_op = O_constant;
4571   expr1.X_op_symbol = NULL;
4572   expr1.X_add_symbol = NULL;
4573   expr1.X_add_number = 1;
4574
4575   switch (mask)
4576     {
4577     case M_DABS:
4578       dbl = 1;
4579     case M_ABS:
4580       /* bgez $a0,.+12
4581          move v0,$a0
4582          sub v0,$zero,$a0
4583          */
4584
4585       start_noreorder ();
4586
4587       expr1.X_add_number = 8;
4588       macro_build (&expr1, "bgez", "s,p", sreg);
4589       if (dreg == sreg)
4590         macro_build (NULL, "nop", "", 0);
4591       else
4592         move_register (dreg, sreg);
4593       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4594
4595       end_noreorder ();
4596       break;
4597
4598     case M_ADD_I:
4599       s = "addi";
4600       s2 = "add";
4601       goto do_addi;
4602     case M_ADDU_I:
4603       s = "addiu";
4604       s2 = "addu";
4605       goto do_addi;
4606     case M_DADD_I:
4607       dbl = 1;
4608       s = "daddi";
4609       s2 = "dadd";
4610       goto do_addi;
4611     case M_DADDU_I:
4612       dbl = 1;
4613       s = "daddiu";
4614       s2 = "daddu";
4615     do_addi:
4616       if (imm_expr.X_op == O_constant
4617           && imm_expr.X_add_number >= -0x8000
4618           && imm_expr.X_add_number < 0x8000)
4619         {
4620           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4621           break;
4622         }
4623       used_at = 1;
4624       load_register (AT, &imm_expr, dbl);
4625       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4626       break;
4627
4628     case M_AND_I:
4629       s = "andi";
4630       s2 = "and";
4631       goto do_bit;
4632     case M_OR_I:
4633       s = "ori";
4634       s2 = "or";
4635       goto do_bit;
4636     case M_NOR_I:
4637       s = "";
4638       s2 = "nor";
4639       goto do_bit;
4640     case M_XOR_I:
4641       s = "xori";
4642       s2 = "xor";
4643     do_bit:
4644       if (imm_expr.X_op == O_constant
4645           && imm_expr.X_add_number >= 0
4646           && imm_expr.X_add_number < 0x10000)
4647         {
4648           if (mask != M_NOR_I)
4649             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4650           else
4651             {
4652               macro_build (&imm_expr, "ori", "t,r,i",
4653                            treg, sreg, BFD_RELOC_LO16);
4654               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4655             }
4656           break;
4657         }
4658
4659       used_at = 1;
4660       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4661       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4662       break;
4663
4664     case M_BALIGN:
4665       switch (imm_expr.X_add_number)
4666         {
4667         case 0:
4668           macro_build (NULL, "nop", "");
4669           break;
4670         case 2:
4671           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4672           break;
4673         default:
4674           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4675                        (int)imm_expr.X_add_number);
4676           break;
4677         }
4678       break;
4679
4680     case M_BEQ_I:
4681       s = "beq";
4682       goto beq_i;
4683     case M_BEQL_I:
4684       s = "beql";
4685       likely = 1;
4686       goto beq_i;
4687     case M_BNE_I:
4688       s = "bne";
4689       goto beq_i;
4690     case M_BNEL_I:
4691       s = "bnel";
4692       likely = 1;
4693     beq_i:
4694       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4695         {
4696           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4697           break;
4698         }
4699       used_at = 1;
4700       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4701       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4702       break;
4703
4704     case M_BGEL:
4705       likely = 1;
4706     case M_BGE:
4707       if (treg == 0)
4708         {
4709           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4710           break;
4711         }
4712       if (sreg == 0)
4713         {
4714           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4715           break;
4716         }
4717       used_at = 1;
4718       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4719       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4720       break;
4721
4722     case M_BGTL_I:
4723       likely = 1;
4724     case M_BGT_I:
4725       /* check for > max integer */
4726       maxnum = 0x7fffffff;
4727       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4728         {
4729           maxnum <<= 16;
4730           maxnum |= 0xffff;
4731           maxnum <<= 16;
4732           maxnum |= 0xffff;
4733         }
4734       if (imm_expr.X_op == O_constant
4735           && imm_expr.X_add_number >= maxnum
4736           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4737         {
4738         do_false:
4739           /* result is always false */
4740           if (! likely)
4741             macro_build (NULL, "nop", "", 0);
4742           else
4743             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4744           break;
4745         }
4746       if (imm_expr.X_op != O_constant)
4747         as_bad (_("Unsupported large constant"));
4748       ++imm_expr.X_add_number;
4749       /* FALLTHROUGH */
4750     case M_BGE_I:
4751     case M_BGEL_I:
4752       if (mask == M_BGEL_I)
4753         likely = 1;
4754       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4755         {
4756           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4757           break;
4758         }
4759       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4760         {
4761           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4762           break;
4763         }
4764       maxnum = 0x7fffffff;
4765       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4766         {
4767           maxnum <<= 16;
4768           maxnum |= 0xffff;
4769           maxnum <<= 16;
4770           maxnum |= 0xffff;
4771         }
4772       maxnum = - maxnum - 1;
4773       if (imm_expr.X_op == O_constant
4774           && imm_expr.X_add_number <= maxnum
4775           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4776         {
4777         do_true:
4778           /* result is always true */
4779           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4780           macro_build (&offset_expr, "b", "p");
4781           break;
4782         }
4783       used_at = 1;
4784       set_at (sreg, 0);
4785       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4786       break;
4787
4788     case M_BGEUL:
4789       likely = 1;
4790     case M_BGEU:
4791       if (treg == 0)
4792         goto do_true;
4793       if (sreg == 0)
4794         {
4795           macro_build (&offset_expr, likely ? "beql" : "beq",
4796                        "s,t,p", 0, treg);
4797           break;
4798         }
4799       used_at = 1;
4800       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4801       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4802       break;
4803
4804     case M_BGTUL_I:
4805       likely = 1;
4806     case M_BGTU_I:
4807       if (sreg == 0
4808           || (HAVE_32BIT_GPRS
4809               && imm_expr.X_op == O_constant
4810               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4811         goto do_false;
4812       if (imm_expr.X_op != O_constant)
4813         as_bad (_("Unsupported large constant"));
4814       ++imm_expr.X_add_number;
4815       /* FALLTHROUGH */
4816     case M_BGEU_I:
4817     case M_BGEUL_I:
4818       if (mask == M_BGEUL_I)
4819         likely = 1;
4820       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4821         goto do_true;
4822       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4823         {
4824           macro_build (&offset_expr, likely ? "bnel" : "bne",
4825                        "s,t,p", sreg, 0);
4826           break;
4827         }
4828       used_at = 1;
4829       set_at (sreg, 1);
4830       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4831       break;
4832
4833     case M_BGTL:
4834       likely = 1;
4835     case M_BGT:
4836       if (treg == 0)
4837         {
4838           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4839           break;
4840         }
4841       if (sreg == 0)
4842         {
4843           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
4844           break;
4845         }
4846       used_at = 1;
4847       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4848       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4849       break;
4850
4851     case M_BGTUL:
4852       likely = 1;
4853     case M_BGTU:
4854       if (treg == 0)
4855         {
4856           macro_build (&offset_expr, likely ? "bnel" : "bne",
4857                        "s,t,p", sreg, 0);
4858           break;
4859         }
4860       if (sreg == 0)
4861         goto do_false;
4862       used_at = 1;
4863       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4864       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4865       break;
4866
4867     case M_BLEL:
4868       likely = 1;
4869     case M_BLE:
4870       if (treg == 0)
4871         {
4872           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4873           break;
4874         }
4875       if (sreg == 0)
4876         {
4877           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
4878           break;
4879         }
4880       used_at = 1;
4881       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
4882       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4883       break;
4884
4885     case M_BLEL_I:
4886       likely = 1;
4887     case M_BLE_I:
4888       maxnum = 0x7fffffff;
4889       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4890         {
4891           maxnum <<= 16;
4892           maxnum |= 0xffff;
4893           maxnum <<= 16;
4894           maxnum |= 0xffff;
4895         }
4896       if (imm_expr.X_op == O_constant
4897           && imm_expr.X_add_number >= maxnum
4898           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4899         goto do_true;
4900       if (imm_expr.X_op != O_constant)
4901         as_bad (_("Unsupported large constant"));
4902       ++imm_expr.X_add_number;
4903       /* FALLTHROUGH */
4904     case M_BLT_I:
4905     case M_BLTL_I:
4906       if (mask == M_BLTL_I)
4907         likely = 1;
4908       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4909         {
4910           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4911           break;
4912         }
4913       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4914         {
4915           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
4916           break;
4917         }
4918       used_at = 1;
4919       set_at (sreg, 0);
4920       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4921       break;
4922
4923     case M_BLEUL:
4924       likely = 1;
4925     case M_BLEU:
4926       if (treg == 0)
4927         {
4928           macro_build (&offset_expr, likely ? "beql" : "beq",
4929                        "s,t,p", sreg, 0);
4930           break;
4931         }
4932       if (sreg == 0)
4933         goto do_true;
4934       used_at = 1;
4935       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
4936       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4937       break;
4938
4939     case M_BLEUL_I:
4940       likely = 1;
4941     case M_BLEU_I:
4942       if (sreg == 0
4943           || (HAVE_32BIT_GPRS
4944               && imm_expr.X_op == O_constant
4945               && imm_expr.X_add_number == (offsetT) 0xffffffff))
4946         goto do_true;
4947       if (imm_expr.X_op != O_constant)
4948         as_bad (_("Unsupported large constant"));
4949       ++imm_expr.X_add_number;
4950       /* FALLTHROUGH */
4951     case M_BLTU_I:
4952     case M_BLTUL_I:
4953       if (mask == M_BLTUL_I)
4954         likely = 1;
4955       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4956         goto do_false;
4957       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4958         {
4959           macro_build (&offset_expr, likely ? "beql" : "beq",
4960                        "s,t,p", sreg, 0);
4961           break;
4962         }
4963       used_at = 1;
4964       set_at (sreg, 1);
4965       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4966       break;
4967
4968     case M_BLTL:
4969       likely = 1;
4970     case M_BLT:
4971       if (treg == 0)
4972         {
4973           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
4974           break;
4975         }
4976       if (sreg == 0)
4977         {
4978           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
4979           break;
4980         }
4981       used_at = 1;
4982       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4983       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
4984       break;
4985
4986     case M_BLTUL:
4987       likely = 1;
4988     case M_BLTU:
4989       if (treg == 0)
4990         goto do_false;
4991       if (sreg == 0)
4992         {
4993           macro_build (&offset_expr, likely ? "bnel" : "bne",
4994                        "s,t,p", 0, treg);
4995           break;
4996         }
4997       used_at = 1;
4998       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4999       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5000       break;
5001
5002     case M_DEXT:
5003       {
5004         unsigned long pos;
5005         unsigned long size;
5006
5007         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5008           {
5009             as_bad (_("Unsupported large constant"));
5010             pos = size = 1;
5011           }
5012         else
5013           {
5014             pos = (unsigned long) imm_expr.X_add_number;
5015             size = (unsigned long) imm2_expr.X_add_number;
5016           }
5017
5018         if (pos > 63)
5019           {
5020             as_bad (_("Improper position (%lu)"), pos);
5021             pos = 1;
5022           }
5023         if (size == 0 || size > 64
5024             || (pos + size - 1) > 63)
5025           {
5026             as_bad (_("Improper extract size (%lu, position %lu)"),
5027                     size, pos);
5028             size = 1;
5029           }
5030
5031         if (size <= 32 && pos < 32)
5032           {
5033             s = "dext";
5034             fmt = "t,r,+A,+C";
5035           }
5036         else if (size <= 32)
5037           {
5038             s = "dextu";
5039             fmt = "t,r,+E,+H";
5040           }
5041         else
5042           {
5043             s = "dextm";
5044             fmt = "t,r,+A,+G";
5045           }
5046         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5047       }
5048       break;
5049
5050     case M_DINS:
5051       {
5052         unsigned long pos;
5053         unsigned long size;
5054
5055         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5056           {
5057             as_bad (_("Unsupported large constant"));
5058             pos = size = 1;
5059           }
5060         else
5061           {
5062             pos = (unsigned long) imm_expr.X_add_number;
5063             size = (unsigned long) imm2_expr.X_add_number;
5064           }
5065
5066         if (pos > 63)
5067           {
5068             as_bad (_("Improper position (%lu)"), pos);
5069             pos = 1;
5070           }
5071         if (size == 0 || size > 64
5072             || (pos + size - 1) > 63)
5073           {
5074             as_bad (_("Improper insert size (%lu, position %lu)"),
5075                     size, pos);
5076             size = 1;
5077           }
5078
5079         if (pos < 32 && (pos + size - 1) < 32)
5080           {
5081             s = "dins";
5082             fmt = "t,r,+A,+B";
5083           }
5084         else if (pos >= 32)
5085           {
5086             s = "dinsu";
5087             fmt = "t,r,+E,+F";
5088           }
5089         else
5090           {
5091             s = "dinsm";
5092             fmt = "t,r,+A,+F";
5093           }
5094         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos,
5095                      pos + size - 1);
5096       }
5097       break;
5098
5099     case M_DDIV_3:
5100       dbl = 1;
5101     case M_DIV_3:
5102       s = "mflo";
5103       goto do_div3;
5104     case M_DREM_3:
5105       dbl = 1;
5106     case M_REM_3:
5107       s = "mfhi";
5108     do_div3:
5109       if (treg == 0)
5110         {
5111           as_warn (_("Divide by zero."));
5112           if (mips_trap)
5113             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5114           else
5115             macro_build (NULL, "break", "c", 7);
5116           break;
5117         }
5118
5119       start_noreorder ();
5120       if (mips_trap)
5121         {
5122           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5123           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5124         }
5125       else
5126         {
5127           expr1.X_add_number = 8;
5128           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5129           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5130           macro_build (NULL, "break", "c", 7);
5131         }
5132       expr1.X_add_number = -1;
5133       used_at = 1;
5134       load_register (AT, &expr1, dbl);
5135       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5136       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5137       if (dbl)
5138         {
5139           expr1.X_add_number = 1;
5140           load_register (AT, &expr1, dbl);
5141           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5142         }
5143       else
5144         {
5145           expr1.X_add_number = 0x80000000;
5146           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5147         }
5148       if (mips_trap)
5149         {
5150           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5151           /* We want to close the noreorder block as soon as possible, so
5152              that later insns are available for delay slot filling.  */
5153           end_noreorder ();
5154         }
5155       else
5156         {
5157           expr1.X_add_number = 8;
5158           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5159           macro_build (NULL, "nop", "", 0);
5160
5161           /* We want to close the noreorder block as soon as possible, so
5162              that later insns are available for delay slot filling.  */
5163           end_noreorder ();
5164
5165           macro_build (NULL, "break", "c", 6);
5166         }
5167       macro_build (NULL, s, "d", dreg);
5168       break;
5169
5170     case M_DIV_3I:
5171       s = "div";
5172       s2 = "mflo";
5173       goto do_divi;
5174     case M_DIVU_3I:
5175       s = "divu";
5176       s2 = "mflo";
5177       goto do_divi;
5178     case M_REM_3I:
5179       s = "div";
5180       s2 = "mfhi";
5181       goto do_divi;
5182     case M_REMU_3I:
5183       s = "divu";
5184       s2 = "mfhi";
5185       goto do_divi;
5186     case M_DDIV_3I:
5187       dbl = 1;
5188       s = "ddiv";
5189       s2 = "mflo";
5190       goto do_divi;
5191     case M_DDIVU_3I:
5192       dbl = 1;
5193       s = "ddivu";
5194       s2 = "mflo";
5195       goto do_divi;
5196     case M_DREM_3I:
5197       dbl = 1;
5198       s = "ddiv";
5199       s2 = "mfhi";
5200       goto do_divi;
5201     case M_DREMU_3I:
5202       dbl = 1;
5203       s = "ddivu";
5204       s2 = "mfhi";
5205     do_divi:
5206       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5207         {
5208           as_warn (_("Divide by zero."));
5209           if (mips_trap)
5210             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5211           else
5212             macro_build (NULL, "break", "c", 7);
5213           break;
5214         }
5215       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5216         {
5217           if (strcmp (s2, "mflo") == 0)
5218             move_register (dreg, sreg);
5219           else
5220             move_register (dreg, 0);
5221           break;
5222         }
5223       if (imm_expr.X_op == O_constant
5224           && imm_expr.X_add_number == -1
5225           && s[strlen (s) - 1] != 'u')
5226         {
5227           if (strcmp (s2, "mflo") == 0)
5228             {
5229               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5230             }
5231           else
5232             move_register (dreg, 0);
5233           break;
5234         }
5235
5236       used_at = 1;
5237       load_register (AT, &imm_expr, dbl);
5238       macro_build (NULL, s, "z,s,t", sreg, AT);
5239       macro_build (NULL, s2, "d", dreg);
5240       break;
5241
5242     case M_DIVU_3:
5243       s = "divu";
5244       s2 = "mflo";
5245       goto do_divu3;
5246     case M_REMU_3:
5247       s = "divu";
5248       s2 = "mfhi";
5249       goto do_divu3;
5250     case M_DDIVU_3:
5251       s = "ddivu";
5252       s2 = "mflo";
5253       goto do_divu3;
5254     case M_DREMU_3:
5255       s = "ddivu";
5256       s2 = "mfhi";
5257     do_divu3:
5258       start_noreorder ();
5259       if (mips_trap)
5260         {
5261           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5262           macro_build (NULL, s, "z,s,t", sreg, treg);
5263           /* We want to close the noreorder block as soon as possible, so
5264              that later insns are available for delay slot filling.  */
5265           end_noreorder ();
5266         }
5267       else
5268         {
5269           expr1.X_add_number = 8;
5270           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5271           macro_build (NULL, s, "z,s,t", sreg, treg);
5272
5273           /* We want to close the noreorder block as soon as possible, so
5274              that later insns are available for delay slot filling.  */
5275           end_noreorder ();
5276           macro_build (NULL, "break", "c", 7);
5277         }
5278       macro_build (NULL, s2, "d", dreg);
5279       break;
5280
5281     case M_DLCA_AB:
5282       dbl = 1;
5283     case M_LCA_AB:
5284       call = 1;
5285       goto do_la;
5286     case M_DLA_AB:
5287       dbl = 1;
5288     case M_LA_AB:
5289     do_la:
5290       /* Load the address of a symbol into a register.  If breg is not
5291          zero, we then add a base register to it.  */
5292
5293       if (dbl && HAVE_32BIT_GPRS)
5294         as_warn (_("dla used to load 32-bit register"));
5295
5296       if (! dbl && HAVE_64BIT_OBJECTS)
5297         as_warn (_("la used to load 64-bit address"));
5298
5299       if (offset_expr.X_op == O_constant
5300           && offset_expr.X_add_number >= -0x8000
5301           && offset_expr.X_add_number < 0x8000)
5302         {
5303           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5304                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5305           break;
5306         }
5307
5308       if (mips_opts.at && (treg == breg))
5309         {
5310           tempreg = AT;
5311           used_at = 1;
5312         }
5313       else
5314         {
5315           tempreg = treg;
5316         }
5317
5318       if (offset_expr.X_op != O_symbol
5319           && offset_expr.X_op != O_constant)
5320         {
5321           as_bad (_("expression too complex"));
5322           offset_expr.X_op = O_constant;
5323         }
5324
5325       if (offset_expr.X_op == O_constant)
5326         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5327       else if (mips_pic == NO_PIC)
5328         {
5329           /* If this is a reference to a GP relative symbol, we want
5330                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5331              Otherwise we want
5332                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5333                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5334              If we have a constant, we need two instructions anyhow,
5335              so we may as well always use the latter form.
5336
5337              With 64bit address space and a usable $at we want
5338                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5339                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5340                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5341                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5342                dsll32   $tempreg,0
5343                daddu    $tempreg,$tempreg,$at
5344
5345              If $at is already in use, we use a path which is suboptimal
5346              on superscalar processors.
5347                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5348                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5349                dsll     $tempreg,16
5350                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5351                dsll     $tempreg,16
5352                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5353
5354              For GP relative symbols in 64bit address space we can use
5355              the same sequence as in 32bit address space.  */
5356           if (HAVE_64BIT_SYMBOLS)
5357             {
5358               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5359                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5360                 {
5361                   relax_start (offset_expr.X_add_symbol);
5362                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5363                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5364                   relax_switch ();
5365                 }
5366
5367               if (used_at == 0 && mips_opts.at)
5368                 {
5369                   macro_build (&offset_expr, "lui", "t,u",
5370                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5371                   macro_build (&offset_expr, "lui", "t,u",
5372                                AT, BFD_RELOC_HI16_S);
5373                   macro_build (&offset_expr, "daddiu", "t,r,j",
5374                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5375                   macro_build (&offset_expr, "daddiu", "t,r,j",
5376                                AT, AT, BFD_RELOC_LO16);
5377                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5378                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5379                   used_at = 1;
5380                 }
5381               else
5382                 {
5383                   macro_build (&offset_expr, "lui", "t,u",
5384                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5385                   macro_build (&offset_expr, "daddiu", "t,r,j",
5386                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5387                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5388                   macro_build (&offset_expr, "daddiu", "t,r,j",
5389                                tempreg, tempreg, BFD_RELOC_HI16_S);
5390                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5391                   macro_build (&offset_expr, "daddiu", "t,r,j",
5392                                tempreg, tempreg, BFD_RELOC_LO16);
5393                 }
5394
5395               if (mips_relax.sequence)
5396                 relax_end ();
5397             }
5398           else
5399             {
5400               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5401                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5402                 {
5403                   relax_start (offset_expr.X_add_symbol);
5404                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5405                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5406                   relax_switch ();
5407                 }
5408               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5409                 as_bad (_("offset too large"));
5410               macro_build_lui (&offset_expr, tempreg);
5411               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5412                            tempreg, tempreg, BFD_RELOC_LO16);
5413               if (mips_relax.sequence)
5414                 relax_end ();
5415             }
5416         }
5417       else if (!mips_big_got && !HAVE_NEWABI)
5418         {
5419           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5420
5421           /* If this is a reference to an external symbol, and there
5422              is no constant, we want
5423                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5424              or for lca or if tempreg is PIC_CALL_REG
5425                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5426              For a local symbol, we want
5427                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5428                nop
5429                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5430
5431              If we have a small constant, and this is a reference to
5432              an external symbol, we want
5433                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5434                nop
5435                addiu    $tempreg,$tempreg,<constant>
5436              For a local symbol, we want the same instruction
5437              sequence, but we output a BFD_RELOC_LO16 reloc on the
5438              addiu instruction.
5439
5440              If we have a large constant, and this is a reference to
5441              an external symbol, we want
5442                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5443                lui      $at,<hiconstant>
5444                addiu    $at,$at,<loconstant>
5445                addu     $tempreg,$tempreg,$at
5446              For a local symbol, we want the same instruction
5447              sequence, but we output a BFD_RELOC_LO16 reloc on the
5448              addiu instruction.
5449            */
5450
5451           if (offset_expr.X_add_number == 0)
5452             {
5453               if (mips_pic == SVR4_PIC
5454                   && breg == 0
5455                   && (call || tempreg == PIC_CALL_REG))
5456                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5457
5458               relax_start (offset_expr.X_add_symbol);
5459               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5460                            lw_reloc_type, mips_gp_register);
5461               if (breg != 0)
5462                 {
5463                   /* We're going to put in an addu instruction using
5464                      tempreg, so we may as well insert the nop right
5465                      now.  */
5466                   load_delay_nop ();
5467                 }
5468               relax_switch ();
5469               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5470                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5471               load_delay_nop ();
5472               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5473                            tempreg, tempreg, BFD_RELOC_LO16);
5474               relax_end ();
5475               /* FIXME: If breg == 0, and the next instruction uses
5476                  $tempreg, then if this variant case is used an extra
5477                  nop will be generated.  */
5478             }
5479           else if (offset_expr.X_add_number >= -0x8000
5480                    && offset_expr.X_add_number < 0x8000)
5481             {
5482               load_got_offset (tempreg, &offset_expr);
5483               load_delay_nop ();
5484               add_got_offset (tempreg, &offset_expr);
5485             }
5486           else
5487             {
5488               expr1.X_add_number = offset_expr.X_add_number;
5489               offset_expr.X_add_number =
5490                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5491               load_got_offset (tempreg, &offset_expr);
5492               offset_expr.X_add_number = expr1.X_add_number;
5493               /* If we are going to add in a base register, and the
5494                  target register and the base register are the same,
5495                  then we are using AT as a temporary register.  Since
5496                  we want to load the constant into AT, we add our
5497                  current AT (from the global offset table) and the
5498                  register into the register now, and pretend we were
5499                  not using a base register.  */
5500               if (breg == treg)
5501                 {
5502                   load_delay_nop ();
5503                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5504                                treg, AT, breg);
5505                   breg = 0;
5506                   tempreg = treg;
5507                 }
5508               add_got_offset_hilo (tempreg, &offset_expr, AT);
5509               used_at = 1;
5510             }
5511         }
5512       else if (!mips_big_got && HAVE_NEWABI)
5513         {
5514           int add_breg_early = 0;
5515
5516           /* If this is a reference to an external, and there is no
5517              constant, or local symbol (*), with or without a
5518              constant, we want
5519                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5520              or for lca or if tempreg is PIC_CALL_REG
5521                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5522
5523              If we have a small constant, and this is a reference to
5524              an external symbol, we want
5525                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5526                addiu    $tempreg,$tempreg,<constant>
5527
5528              If we have a large constant, and this is a reference to
5529              an external symbol, we want
5530                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5531                lui      $at,<hiconstant>
5532                addiu    $at,$at,<loconstant>
5533                addu     $tempreg,$tempreg,$at
5534
5535              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5536              local symbols, even though it introduces an additional
5537              instruction.  */
5538
5539           if (offset_expr.X_add_number)
5540             {
5541               expr1.X_add_number = offset_expr.X_add_number;
5542               offset_expr.X_add_number = 0;
5543
5544               relax_start (offset_expr.X_add_symbol);
5545               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5546                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5547
5548               if (expr1.X_add_number >= -0x8000
5549                   && expr1.X_add_number < 0x8000)
5550                 {
5551                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5552                                tempreg, tempreg, BFD_RELOC_LO16);
5553                 }
5554               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5555                 {
5556                   int dreg;
5557
5558                   /* If we are going to add in a base register, and the
5559                      target register and the base register are the same,
5560                      then we are using AT as a temporary register.  Since
5561                      we want to load the constant into AT, we add our
5562                      current AT (from the global offset table) and the
5563                      register into the register now, and pretend we were
5564                      not using a base register.  */
5565                   if (breg != treg)
5566                     dreg = tempreg;
5567                   else
5568                     {
5569                       assert (tempreg == AT);
5570                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5571                                    treg, AT, breg);
5572                       dreg = treg;
5573                       add_breg_early = 1;
5574                     }
5575
5576                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5577                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5578                                dreg, dreg, AT);
5579
5580                   used_at = 1;
5581                 }
5582               else
5583                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5584
5585               relax_switch ();
5586               offset_expr.X_add_number = expr1.X_add_number;
5587
5588               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5589                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5590               if (add_breg_early)
5591                 {
5592                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5593                                treg, tempreg, breg);
5594                   breg = 0;
5595                   tempreg = treg;
5596                 }
5597               relax_end ();
5598             }
5599           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5600             {
5601               relax_start (offset_expr.X_add_symbol);
5602               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5603                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5604               relax_switch ();
5605               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5606                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5607               relax_end ();
5608             }
5609           else
5610             {
5611               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5612                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5613             }
5614         }
5615       else if (mips_big_got && !HAVE_NEWABI)
5616         {
5617           int gpdelay;
5618           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5619           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5620           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5621
5622           /* This is the large GOT case.  If this is a reference to an
5623              external symbol, and there is no constant, we want
5624                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5625                addu     $tempreg,$tempreg,$gp
5626                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5627              or for lca or if tempreg is PIC_CALL_REG
5628                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5629                addu     $tempreg,$tempreg,$gp
5630                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5631              For a local symbol, we want
5632                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5633                nop
5634                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5635
5636              If we have a small constant, and this is a reference to
5637              an external symbol, we want
5638                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5639                addu     $tempreg,$tempreg,$gp
5640                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5641                nop
5642                addiu    $tempreg,$tempreg,<constant>
5643              For a local symbol, we want
5644                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5645                nop
5646                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5647
5648              If we have a large constant, and this is a reference to
5649              an external symbol, we want
5650                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5651                addu     $tempreg,$tempreg,$gp
5652                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5653                lui      $at,<hiconstant>
5654                addiu    $at,$at,<loconstant>
5655                addu     $tempreg,$tempreg,$at
5656              For a local symbol, we want
5657                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5658                lui      $at,<hiconstant>
5659                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5660                addu     $tempreg,$tempreg,$at
5661           */
5662
5663           expr1.X_add_number = offset_expr.X_add_number;
5664           offset_expr.X_add_number = 0;
5665           relax_start (offset_expr.X_add_symbol);
5666           gpdelay = reg_needs_delay (mips_gp_register);
5667           if (expr1.X_add_number == 0 && breg == 0
5668               && (call || tempreg == PIC_CALL_REG))
5669             {
5670               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5671               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5672             }
5673           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5674           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5675                        tempreg, tempreg, mips_gp_register);
5676           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5677                        tempreg, lw_reloc_type, tempreg);
5678           if (expr1.X_add_number == 0)
5679             {
5680               if (breg != 0)
5681                 {
5682                   /* We're going to put in an addu instruction using
5683                      tempreg, so we may as well insert the nop right
5684                      now.  */
5685                   load_delay_nop ();
5686                 }
5687             }
5688           else if (expr1.X_add_number >= -0x8000
5689                    && expr1.X_add_number < 0x8000)
5690             {
5691               load_delay_nop ();
5692               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5693                            tempreg, tempreg, BFD_RELOC_LO16);
5694             }
5695           else
5696             {
5697               int dreg;
5698
5699               /* If we are going to add in a base register, and the
5700                  target register and the base register are the same,
5701                  then we are using AT as a temporary register.  Since
5702                  we want to load the constant into AT, we add our
5703                  current AT (from the global offset table) and the
5704                  register into the register now, and pretend we were
5705                  not using a base register.  */
5706               if (breg != treg)
5707                 dreg = tempreg;
5708               else
5709                 {
5710                   assert (tempreg == AT);
5711                   load_delay_nop ();
5712                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5713                                treg, AT, breg);
5714                   dreg = treg;
5715                 }
5716
5717               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5718               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5719
5720               used_at = 1;
5721             }
5722           offset_expr.X_add_number =
5723             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5724           relax_switch ();
5725
5726           if (gpdelay)
5727             {
5728               /* This is needed because this instruction uses $gp, but
5729                  the first instruction on the main stream does not.  */
5730               macro_build (NULL, "nop", "");
5731             }
5732
5733           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5734                        local_reloc_type, mips_gp_register);
5735           if (expr1.X_add_number >= -0x8000
5736               && expr1.X_add_number < 0x8000)
5737             {
5738               load_delay_nop ();
5739               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5740                            tempreg, tempreg, BFD_RELOC_LO16);
5741               /* FIXME: If add_number is 0, and there was no base
5742                  register, the external symbol case ended with a load,
5743                  so if the symbol turns out to not be external, and
5744                  the next instruction uses tempreg, an unnecessary nop
5745                  will be inserted.  */
5746             }
5747           else
5748             {
5749               if (breg == treg)
5750                 {
5751                   /* We must add in the base register now, as in the
5752                      external symbol case.  */
5753                   assert (tempreg == AT);
5754                   load_delay_nop ();
5755                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5756                                treg, AT, breg);
5757                   tempreg = treg;
5758                   /* We set breg to 0 because we have arranged to add
5759                      it in in both cases.  */
5760                   breg = 0;
5761                 }
5762
5763               macro_build_lui (&expr1, AT);
5764               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5765                            AT, AT, BFD_RELOC_LO16);
5766               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5767                            tempreg, tempreg, AT);
5768               used_at = 1;
5769             }
5770           relax_end ();
5771         }
5772       else if (mips_big_got && HAVE_NEWABI)
5773         {
5774           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5775           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5776           int add_breg_early = 0;
5777
5778           /* This is the large GOT case.  If this is a reference to an
5779              external symbol, and there is no constant, we want
5780                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5781                add      $tempreg,$tempreg,$gp
5782                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5783              or for lca or if tempreg is PIC_CALL_REG
5784                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5785                add      $tempreg,$tempreg,$gp
5786                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5787
5788              If we have a small constant, and this is a reference to
5789              an external symbol, we want
5790                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5791                add      $tempreg,$tempreg,$gp
5792                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5793                addi     $tempreg,$tempreg,<constant>
5794
5795              If we have a large constant, and this is a reference to
5796              an external symbol, we want
5797                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5798                addu     $tempreg,$tempreg,$gp
5799                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5800                lui      $at,<hiconstant>
5801                addi     $at,$at,<loconstant>
5802                add      $tempreg,$tempreg,$at
5803
5804              If we have NewABI, and we know it's a local symbol, we want
5805                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
5806                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
5807              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
5808
5809           relax_start (offset_expr.X_add_symbol);
5810
5811           expr1.X_add_number = offset_expr.X_add_number;
5812           offset_expr.X_add_number = 0;
5813
5814           if (expr1.X_add_number == 0 && breg == 0
5815               && (call || tempreg == PIC_CALL_REG))
5816             {
5817               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5818               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5819             }
5820           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5821           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5822                        tempreg, tempreg, mips_gp_register);
5823           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5824                        tempreg, lw_reloc_type, tempreg);
5825
5826           if (expr1.X_add_number == 0)
5827             ;
5828           else if (expr1.X_add_number >= -0x8000
5829                    && expr1.X_add_number < 0x8000)
5830             {
5831               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5832                            tempreg, tempreg, BFD_RELOC_LO16);
5833             }
5834           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5835             {
5836               int dreg;
5837
5838               /* If we are going to add in a base register, and the
5839                  target register and the base register are the same,
5840                  then we are using AT as a temporary register.  Since
5841                  we want to load the constant into AT, we add our
5842                  current AT (from the global offset table) and the
5843                  register into the register now, and pretend we were
5844                  not using a base register.  */
5845               if (breg != treg)
5846                 dreg = tempreg;
5847               else
5848                 {
5849                   assert (tempreg == AT);
5850                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5851                                treg, AT, breg);
5852                   dreg = treg;
5853                   add_breg_early = 1;
5854                 }
5855
5856               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5857               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5858
5859               used_at = 1;
5860             }
5861           else
5862             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5863
5864           relax_switch ();
5865           offset_expr.X_add_number = expr1.X_add_number;
5866           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5867                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
5868           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
5869                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
5870           if (add_breg_early)
5871             {
5872               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5873                            treg, tempreg, breg);
5874               breg = 0;
5875               tempreg = treg;
5876             }
5877           relax_end ();
5878         }
5879       else
5880         abort ();
5881
5882       if (breg != 0)
5883         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
5884       break;
5885
5886     case M_J_A:
5887       /* The j instruction may not be used in PIC code, since it
5888          requires an absolute address.  We convert it to a b
5889          instruction.  */
5890       if (mips_pic == NO_PIC)
5891         macro_build (&offset_expr, "j", "a");
5892       else
5893         macro_build (&offset_expr, "b", "p");
5894       break;
5895
5896       /* The jal instructions must be handled as macros because when
5897          generating PIC code they expand to multi-instruction
5898          sequences.  Normally they are simple instructions.  */
5899     case M_JAL_1:
5900       dreg = RA;
5901       /* Fall through.  */
5902     case M_JAL_2:
5903       if (mips_pic == NO_PIC)
5904         macro_build (NULL, "jalr", "d,s", dreg, sreg);
5905       else
5906         {
5907           if (sreg != PIC_CALL_REG)
5908             as_warn (_("MIPS PIC call to register other than $25"));
5909
5910           macro_build (NULL, "jalr", "d,s", dreg, sreg);
5911           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
5912             {
5913               if (mips_cprestore_offset < 0)
5914                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
5915               else
5916                 {
5917                   if (! mips_frame_reg_valid)
5918                     {
5919                       as_warn (_("No .frame pseudo-op used in PIC code"));
5920                       /* Quiet this warning.  */
5921                       mips_frame_reg_valid = 1;
5922                     }
5923                   if (! mips_cprestore_valid)
5924                     {
5925                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
5926                       /* Quiet this warning.  */
5927                       mips_cprestore_valid = 1;
5928                     }
5929                   expr1.X_add_number = mips_cprestore_offset;
5930                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
5931                                                 mips_gp_register,
5932                                                 mips_frame_reg,
5933                                                 HAVE_64BIT_ADDRESSES);
5934                 }
5935             }
5936         }
5937
5938       break;
5939
5940     case M_JAL_A:
5941       if (mips_pic == NO_PIC)
5942         macro_build (&offset_expr, "jal", "a");
5943       else if (mips_pic == SVR4_PIC)
5944         {
5945           /* If this is a reference to an external symbol, and we are
5946              using a small GOT, we want
5947                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
5948                nop
5949                jalr     $ra,$25
5950                nop
5951                lw       $gp,cprestore($sp)
5952              The cprestore value is set using the .cprestore
5953              pseudo-op.  If we are using a big GOT, we want
5954                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
5955                addu     $25,$25,$gp
5956                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
5957                nop
5958                jalr     $ra,$25
5959                nop
5960                lw       $gp,cprestore($sp)
5961              If the symbol is not external, we want
5962                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
5963                nop
5964                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
5965                jalr     $ra,$25
5966                nop
5967                lw $gp,cprestore($sp)
5968
5969              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
5970              sequences above, minus nops, unless the symbol is local,
5971              which enables us to use GOT_PAGE/GOT_OFST (big got) or
5972              GOT_DISP.  */
5973           if (HAVE_NEWABI)
5974             {
5975               if (! mips_big_got)
5976                 {
5977                   relax_start (offset_expr.X_add_symbol);
5978                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5979                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
5980                                mips_gp_register);
5981                   relax_switch ();
5982                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5983                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
5984                                mips_gp_register);
5985                   relax_end ();
5986                 }
5987               else
5988                 {
5989                   relax_start (offset_expr.X_add_symbol);
5990                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
5991                                BFD_RELOC_MIPS_CALL_HI16);
5992                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
5993                                PIC_CALL_REG, mips_gp_register);
5994                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5995                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
5996                                PIC_CALL_REG);
5997                   relax_switch ();
5998                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5999                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6000                                mips_gp_register);
6001                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6002                                PIC_CALL_REG, PIC_CALL_REG,
6003                                BFD_RELOC_MIPS_GOT_OFST);
6004                   relax_end ();
6005                 }
6006
6007               macro_build_jalr (&offset_expr);
6008             }
6009           else
6010             {
6011               relax_start (offset_expr.X_add_symbol);
6012               if (! mips_big_got)
6013                 {
6014                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6015                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6016                                mips_gp_register);
6017                   load_delay_nop ();
6018                   relax_switch ();
6019                 }
6020               else
6021                 {
6022                   int gpdelay;
6023
6024                   gpdelay = reg_needs_delay (mips_gp_register);
6025                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6026                                BFD_RELOC_MIPS_CALL_HI16);
6027                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6028                                PIC_CALL_REG, mips_gp_register);
6029                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6030                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6031                                PIC_CALL_REG);
6032                   load_delay_nop ();
6033                   relax_switch ();
6034                   if (gpdelay)
6035                     macro_build (NULL, "nop", "");
6036                 }
6037               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6038                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6039                            mips_gp_register);
6040               load_delay_nop ();
6041               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6042                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6043               relax_end ();
6044               macro_build_jalr (&offset_expr);
6045
6046               if (mips_cprestore_offset < 0)
6047                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6048               else
6049                 {
6050                   if (! mips_frame_reg_valid)
6051                     {
6052                       as_warn (_("No .frame pseudo-op used in PIC code"));
6053                       /* Quiet this warning.  */
6054                       mips_frame_reg_valid = 1;
6055                     }
6056                   if (! mips_cprestore_valid)
6057                     {
6058                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6059                       /* Quiet this warning.  */
6060                       mips_cprestore_valid = 1;
6061                     }
6062                   if (mips_opts.noreorder)
6063                     macro_build (NULL, "nop", "");
6064                   expr1.X_add_number = mips_cprestore_offset;
6065                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6066                                                 mips_gp_register,
6067                                                 mips_frame_reg,
6068                                                 HAVE_64BIT_ADDRESSES);
6069                 }
6070             }
6071         }
6072       else if (mips_pic == VXWORKS_PIC)
6073         as_bad (_("Non-PIC jump used in PIC library"));
6074       else
6075         abort ();
6076
6077       break;
6078
6079     case M_LB_AB:
6080       s = "lb";
6081       goto ld;
6082     case M_LBU_AB:
6083       s = "lbu";
6084       goto ld;
6085     case M_LH_AB:
6086       s = "lh";
6087       goto ld;
6088     case M_LHU_AB:
6089       s = "lhu";
6090       goto ld;
6091     case M_LW_AB:
6092       s = "lw";
6093       goto ld;
6094     case M_LWC0_AB:
6095       s = "lwc0";
6096       /* Itbl support may require additional care here.  */
6097       coproc = 1;
6098       goto ld;
6099     case M_LWC1_AB:
6100       s = "lwc1";
6101       /* Itbl support may require additional care here.  */
6102       coproc = 1;
6103       goto ld;
6104     case M_LWC2_AB:
6105       s = "lwc2";
6106       /* Itbl support may require additional care here.  */
6107       coproc = 1;
6108       goto ld;
6109     case M_LWC3_AB:
6110       s = "lwc3";
6111       /* Itbl support may require additional care here.  */
6112       coproc = 1;
6113       goto ld;
6114     case M_LWL_AB:
6115       s = "lwl";
6116       lr = 1;
6117       goto ld;
6118     case M_LWR_AB:
6119       s = "lwr";
6120       lr = 1;
6121       goto ld;
6122     case M_LDC1_AB:
6123       if (mips_opts.arch == CPU_R4650)
6124         {
6125           as_bad (_("opcode not supported on this processor"));
6126           break;
6127         }
6128       s = "ldc1";
6129       /* Itbl support may require additional care here.  */
6130       coproc = 1;
6131       goto ld;
6132     case M_LDC2_AB:
6133       s = "ldc2";
6134       /* Itbl support may require additional care here.  */
6135       coproc = 1;
6136       goto ld;
6137     case M_LDC3_AB:
6138       s = "ldc3";
6139       /* Itbl support may require additional care here.  */
6140       coproc = 1;
6141       goto ld;
6142     case M_LDL_AB:
6143       s = "ldl";
6144       lr = 1;
6145       goto ld;
6146     case M_LDR_AB:
6147       s = "ldr";
6148       lr = 1;
6149       goto ld;
6150     case M_LL_AB:
6151       s = "ll";
6152       goto ld;
6153     case M_LLD_AB:
6154       s = "lld";
6155       goto ld;
6156     case M_LWU_AB:
6157       s = "lwu";
6158     ld:
6159       if (breg == treg || coproc || lr)
6160         {
6161           tempreg = AT;
6162           used_at = 1;
6163         }
6164       else
6165         {
6166           tempreg = treg;
6167         }
6168       goto ld_st;
6169     case M_SB_AB:
6170       s = "sb";
6171       goto st;
6172     case M_SH_AB:
6173       s = "sh";
6174       goto st;
6175     case M_SW_AB:
6176       s = "sw";
6177       goto st;
6178     case M_SWC0_AB:
6179       s = "swc0";
6180       /* Itbl support may require additional care here.  */
6181       coproc = 1;
6182       goto st;
6183     case M_SWC1_AB:
6184       s = "swc1";
6185       /* Itbl support may require additional care here.  */
6186       coproc = 1;
6187       goto st;
6188     case M_SWC2_AB:
6189       s = "swc2";
6190       /* Itbl support may require additional care here.  */
6191       coproc = 1;
6192       goto st;
6193     case M_SWC3_AB:
6194       s = "swc3";
6195       /* Itbl support may require additional care here.  */
6196       coproc = 1;
6197       goto st;
6198     case M_SWL_AB:
6199       s = "swl";
6200       goto st;
6201     case M_SWR_AB:
6202       s = "swr";
6203       goto st;
6204     case M_SC_AB:
6205       s = "sc";
6206       goto st;
6207     case M_SCD_AB:
6208       s = "scd";
6209       goto st;
6210     case M_CACHE_AB:
6211       s = "cache";
6212       goto st;
6213     case M_SDC1_AB:
6214       if (mips_opts.arch == CPU_R4650)
6215         {
6216           as_bad (_("opcode not supported on this processor"));
6217           break;
6218         }
6219       s = "sdc1";
6220       coproc = 1;
6221       /* Itbl support may require additional care here.  */
6222       goto st;
6223     case M_SDC2_AB:
6224       s = "sdc2";
6225       /* Itbl support may require additional care here.  */
6226       coproc = 1;
6227       goto st;
6228     case M_SDC3_AB:
6229       s = "sdc3";
6230       /* Itbl support may require additional care here.  */
6231       coproc = 1;
6232       goto st;
6233     case M_SDL_AB:
6234       s = "sdl";
6235       goto st;
6236     case M_SDR_AB:
6237       s = "sdr";
6238     st:
6239       tempreg = AT;
6240       used_at = 1;
6241     ld_st:
6242       /* Itbl support may require additional care here.  */
6243       if (mask == M_LWC1_AB
6244           || mask == M_SWC1_AB
6245           || mask == M_LDC1_AB
6246           || mask == M_SDC1_AB
6247           || mask == M_L_DAB
6248           || mask == M_S_DAB)
6249         fmt = "T,o(b)";
6250       else if (mask == M_CACHE_AB)
6251         fmt = "k,o(b)";
6252       else if (coproc)
6253         fmt = "E,o(b)";
6254       else
6255         fmt = "t,o(b)";
6256
6257       if (offset_expr.X_op != O_constant
6258           && offset_expr.X_op != O_symbol)
6259         {
6260           as_bad (_("expression too complex"));
6261           offset_expr.X_op = O_constant;
6262         }
6263
6264       if (HAVE_32BIT_ADDRESSES
6265           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6266         {
6267           char value [32];
6268
6269           sprintf_vma (value, offset_expr.X_add_number);
6270           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6271         }
6272
6273       /* A constant expression in PIC code can be handled just as it
6274          is in non PIC code.  */
6275       if (offset_expr.X_op == O_constant)
6276         {
6277           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6278                                 & ~(bfd_vma) 0xffff);
6279           normalize_address_expr (&expr1);
6280           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6281           if (breg != 0)
6282             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6283                          tempreg, tempreg, breg);
6284           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6285         }
6286       else if (mips_pic == NO_PIC)
6287         {
6288           /* If this is a reference to a GP relative symbol, and there
6289              is no base register, we want
6290                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6291              Otherwise, if there is no base register, we want
6292                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6293                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6294              If we have a constant, we need two instructions anyhow,
6295              so we always use the latter form.
6296
6297              If we have a base register, and this is a reference to a
6298              GP relative symbol, we want
6299                addu     $tempreg,$breg,$gp
6300                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6301              Otherwise we want
6302                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6303                addu     $tempreg,$tempreg,$breg
6304                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6305              With a constant we always use the latter case.
6306
6307              With 64bit address space and no base register and $at usable,
6308              we want
6309                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6310                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6311                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6312                dsll32   $tempreg,0
6313                daddu    $tempreg,$at
6314                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6315              If we have a base register, we want
6316                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6317                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6318                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6319                daddu    $at,$breg
6320                dsll32   $tempreg,0
6321                daddu    $tempreg,$at
6322                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6323
6324              Without $at we can't generate the optimal path for superscalar
6325              processors here since this would require two temporary registers.
6326                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6327                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6328                dsll     $tempreg,16
6329                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6330                dsll     $tempreg,16
6331                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6332              If we have a base register, we want
6333                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6334                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6335                dsll     $tempreg,16
6336                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6337                dsll     $tempreg,16
6338                daddu    $tempreg,$tempreg,$breg
6339                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6340
6341              For GP relative symbols in 64bit address space we can use
6342              the same sequence as in 32bit address space.  */
6343           if (HAVE_64BIT_SYMBOLS)
6344             {
6345               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6346                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6347                 {
6348                   relax_start (offset_expr.X_add_symbol);
6349                   if (breg == 0)
6350                     {
6351                       macro_build (&offset_expr, s, fmt, treg,
6352                                    BFD_RELOC_GPREL16, mips_gp_register);
6353                     }
6354                   else
6355                     {
6356                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6357                                    tempreg, breg, mips_gp_register);
6358                       macro_build (&offset_expr, s, fmt, treg,
6359                                    BFD_RELOC_GPREL16, tempreg);
6360                     }
6361                   relax_switch ();
6362                 }
6363
6364               if (used_at == 0 && mips_opts.at)
6365                 {
6366                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6367                                BFD_RELOC_MIPS_HIGHEST);
6368                   macro_build (&offset_expr, "lui", "t,u", AT,
6369                                BFD_RELOC_HI16_S);
6370                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6371                                tempreg, BFD_RELOC_MIPS_HIGHER);
6372                   if (breg != 0)
6373                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6374                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6375                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6376                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6377                                tempreg);
6378                   used_at = 1;
6379                 }
6380               else
6381                 {
6382                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6383                                BFD_RELOC_MIPS_HIGHEST);
6384                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6385                                tempreg, BFD_RELOC_MIPS_HIGHER);
6386                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6387                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6388                                tempreg, BFD_RELOC_HI16_S);
6389                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6390                   if (breg != 0)
6391                     macro_build (NULL, "daddu", "d,v,t",
6392                                  tempreg, tempreg, breg);
6393                   macro_build (&offset_expr, s, fmt, treg,
6394                                BFD_RELOC_LO16, tempreg);
6395                 }
6396
6397               if (mips_relax.sequence)
6398                 relax_end ();
6399               break;
6400             }
6401
6402           if (breg == 0)
6403             {
6404               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6405                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6406                 {
6407                   relax_start (offset_expr.X_add_symbol);
6408                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6409                                mips_gp_register);
6410                   relax_switch ();
6411                 }
6412               macro_build_lui (&offset_expr, tempreg);
6413               macro_build (&offset_expr, s, fmt, treg,
6414                            BFD_RELOC_LO16, tempreg);
6415               if (mips_relax.sequence)
6416                 relax_end ();
6417             }
6418           else
6419             {
6420               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6421                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6422                 {
6423                   relax_start (offset_expr.X_add_symbol);
6424                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6425                                tempreg, breg, mips_gp_register);
6426                   macro_build (&offset_expr, s, fmt, treg,
6427                                BFD_RELOC_GPREL16, tempreg);
6428                   relax_switch ();
6429                 }
6430               macro_build_lui (&offset_expr, tempreg);
6431               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6432                            tempreg, tempreg, breg);
6433               macro_build (&offset_expr, s, fmt, treg,
6434                            BFD_RELOC_LO16, tempreg);
6435               if (mips_relax.sequence)
6436                 relax_end ();
6437             }
6438         }
6439       else if (!mips_big_got)
6440         {
6441           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6442
6443           /* If this is a reference to an external symbol, we want
6444                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6445                nop
6446                <op>     $treg,0($tempreg)
6447              Otherwise we want
6448                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6449                nop
6450                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6451                <op>     $treg,0($tempreg)
6452
6453              For NewABI, we want
6454                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6455                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6456
6457              If there is a base register, we add it to $tempreg before
6458              the <op>.  If there is a constant, we stick it in the
6459              <op> instruction.  We don't handle constants larger than
6460              16 bits, because we have no way to load the upper 16 bits
6461              (actually, we could handle them for the subset of cases
6462              in which we are not using $at).  */
6463           assert (offset_expr.X_op == O_symbol);
6464           if (HAVE_NEWABI)
6465             {
6466               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6467                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6468               if (breg != 0)
6469                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6470                              tempreg, tempreg, breg);
6471               macro_build (&offset_expr, s, fmt, treg,
6472                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6473               break;
6474             }
6475           expr1.X_add_number = offset_expr.X_add_number;
6476           offset_expr.X_add_number = 0;
6477           if (expr1.X_add_number < -0x8000
6478               || expr1.X_add_number >= 0x8000)
6479             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6480           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6481                        lw_reloc_type, mips_gp_register);
6482           load_delay_nop ();
6483           relax_start (offset_expr.X_add_symbol);
6484           relax_switch ();
6485           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6486                        tempreg, BFD_RELOC_LO16);
6487           relax_end ();
6488           if (breg != 0)
6489             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6490                          tempreg, tempreg, breg);
6491           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6492         }
6493       else if (mips_big_got && !HAVE_NEWABI)
6494         {
6495           int gpdelay;
6496
6497           /* If this is a reference to an external symbol, we want
6498                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6499                addu     $tempreg,$tempreg,$gp
6500                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6501                <op>     $treg,0($tempreg)
6502              Otherwise we want
6503                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6504                nop
6505                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6506                <op>     $treg,0($tempreg)
6507              If there is a base register, we add it to $tempreg before
6508              the <op>.  If there is a constant, we stick it in the
6509              <op> instruction.  We don't handle constants larger than
6510              16 bits, because we have no way to load the upper 16 bits
6511              (actually, we could handle them for the subset of cases
6512              in which we are not using $at).  */
6513           assert (offset_expr.X_op == O_symbol);
6514           expr1.X_add_number = offset_expr.X_add_number;
6515           offset_expr.X_add_number = 0;
6516           if (expr1.X_add_number < -0x8000
6517               || expr1.X_add_number >= 0x8000)
6518             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6519           gpdelay = reg_needs_delay (mips_gp_register);
6520           relax_start (offset_expr.X_add_symbol);
6521           macro_build (&offset_expr, "lui", "t,u", tempreg,
6522                        BFD_RELOC_MIPS_GOT_HI16);
6523           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6524                        mips_gp_register);
6525           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6526                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6527           relax_switch ();
6528           if (gpdelay)
6529             macro_build (NULL, "nop", "");
6530           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6531                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6532           load_delay_nop ();
6533           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6534                        tempreg, BFD_RELOC_LO16);
6535           relax_end ();
6536
6537           if (breg != 0)
6538             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6539                          tempreg, tempreg, breg);
6540           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6541         }
6542       else if (mips_big_got && HAVE_NEWABI)
6543         {
6544           /* If this is a reference to an external symbol, we want
6545                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6546                add      $tempreg,$tempreg,$gp
6547                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6548                <op>     $treg,<ofst>($tempreg)
6549              Otherwise, for local symbols, we want:
6550                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6551                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6552           assert (offset_expr.X_op == O_symbol);
6553           expr1.X_add_number = offset_expr.X_add_number;
6554           offset_expr.X_add_number = 0;
6555           if (expr1.X_add_number < -0x8000
6556               || expr1.X_add_number >= 0x8000)
6557             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6558           relax_start (offset_expr.X_add_symbol);
6559           macro_build (&offset_expr, "lui", "t,u", tempreg,
6560                        BFD_RELOC_MIPS_GOT_HI16);
6561           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6562                        mips_gp_register);
6563           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6564                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6565           if (breg != 0)
6566             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6567                          tempreg, tempreg, breg);
6568           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6569
6570           relax_switch ();
6571           offset_expr.X_add_number = expr1.X_add_number;
6572           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6573                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6574           if (breg != 0)
6575             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6576                          tempreg, tempreg, breg);
6577           macro_build (&offset_expr, s, fmt, treg,
6578                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6579           relax_end ();
6580         }
6581       else
6582         abort ();
6583
6584       break;
6585
6586     case M_LI:
6587     case M_LI_S:
6588       load_register (treg, &imm_expr, 0);
6589       break;
6590
6591     case M_DLI:
6592       load_register (treg, &imm_expr, 1);
6593       break;
6594
6595     case M_LI_SS:
6596       if (imm_expr.X_op == O_constant)
6597         {
6598           used_at = 1;
6599           load_register (AT, &imm_expr, 0);
6600           macro_build (NULL, "mtc1", "t,G", AT, treg);
6601           break;
6602         }
6603       else
6604         {
6605           assert (offset_expr.X_op == O_symbol
6606                   && strcmp (segment_name (S_GET_SEGMENT
6607                                            (offset_expr.X_add_symbol)),
6608                              ".lit4") == 0
6609                   && offset_expr.X_add_number == 0);
6610           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6611                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6612           break;
6613         }
6614
6615     case M_LI_D:
6616       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6617          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6618          order 32 bits of the value and the low order 32 bits are either
6619          zero or in OFFSET_EXPR.  */
6620       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6621         {
6622           if (HAVE_64BIT_GPRS)
6623             load_register (treg, &imm_expr, 1);
6624           else
6625             {
6626               int hreg, lreg;
6627
6628               if (target_big_endian)
6629                 {
6630                   hreg = treg;
6631                   lreg = treg + 1;
6632                 }
6633               else
6634                 {
6635                   hreg = treg + 1;
6636                   lreg = treg;
6637                 }
6638
6639               if (hreg <= 31)
6640                 load_register (hreg, &imm_expr, 0);
6641               if (lreg <= 31)
6642                 {
6643                   if (offset_expr.X_op == O_absent)
6644                     move_register (lreg, 0);
6645                   else
6646                     {
6647                       assert (offset_expr.X_op == O_constant);
6648                       load_register (lreg, &offset_expr, 0);
6649                     }
6650                 }
6651             }
6652           break;
6653         }
6654
6655       /* We know that sym is in the .rdata section.  First we get the
6656          upper 16 bits of the address.  */
6657       if (mips_pic == NO_PIC)
6658         {
6659           macro_build_lui (&offset_expr, AT);
6660           used_at = 1;
6661         }
6662       else
6663         {
6664           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6665                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6666           used_at = 1;
6667         }
6668
6669       /* Now we load the register(s).  */
6670       if (HAVE_64BIT_GPRS)
6671         {
6672           used_at = 1;
6673           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6674         }
6675       else
6676         {
6677           used_at = 1;
6678           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6679           if (treg != RA)
6680             {
6681               /* FIXME: How in the world do we deal with the possible
6682                  overflow here?  */
6683               offset_expr.X_add_number += 4;
6684               macro_build (&offset_expr, "lw", "t,o(b)",
6685                            treg + 1, BFD_RELOC_LO16, AT);
6686             }
6687         }
6688       break;
6689
6690     case M_LI_DD:
6691       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6692          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6693          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6694          the value and the low order 32 bits are either zero or in
6695          OFFSET_EXPR.  */
6696       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6697         {
6698           used_at = 1;
6699           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6700           if (HAVE_64BIT_FPRS)
6701             {
6702               assert (HAVE_64BIT_GPRS);
6703               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6704             }
6705           else
6706             {
6707               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6708               if (offset_expr.X_op == O_absent)
6709                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6710               else
6711                 {
6712                   assert (offset_expr.X_op == O_constant);
6713                   load_register (AT, &offset_expr, 0);
6714                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6715                 }
6716             }
6717           break;
6718         }
6719
6720       assert (offset_expr.X_op == O_symbol
6721               && offset_expr.X_add_number == 0);
6722       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6723       if (strcmp (s, ".lit8") == 0)
6724         {
6725           if (mips_opts.isa != ISA_MIPS1)
6726             {
6727               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6728                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6729               break;
6730             }
6731           breg = mips_gp_register;
6732           r = BFD_RELOC_MIPS_LITERAL;
6733           goto dob;
6734         }
6735       else
6736         {
6737           assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6738           used_at = 1;
6739           if (mips_pic != NO_PIC)
6740             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6741                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6742           else
6743             {
6744               /* FIXME: This won't work for a 64 bit address.  */
6745               macro_build_lui (&offset_expr, AT);
6746             }
6747
6748           if (mips_opts.isa != ISA_MIPS1)
6749             {
6750               macro_build (&offset_expr, "ldc1", "T,o(b)",
6751                            treg, BFD_RELOC_LO16, AT);
6752               break;
6753             }
6754           breg = AT;
6755           r = BFD_RELOC_LO16;
6756           goto dob;
6757         }
6758
6759     case M_L_DOB:
6760       if (mips_opts.arch == CPU_R4650)
6761         {
6762           as_bad (_("opcode not supported on this processor"));
6763           break;
6764         }
6765       /* Even on a big endian machine $fn comes before $fn+1.  We have
6766          to adjust when loading from memory.  */
6767       r = BFD_RELOC_LO16;
6768     dob:
6769       assert (mips_opts.isa == ISA_MIPS1);
6770       macro_build (&offset_expr, "lwc1", "T,o(b)",
6771                    target_big_endian ? treg + 1 : treg, r, breg);
6772       /* FIXME: A possible overflow which I don't know how to deal
6773          with.  */
6774       offset_expr.X_add_number += 4;
6775       macro_build (&offset_expr, "lwc1", "T,o(b)",
6776                    target_big_endian ? treg : treg + 1, r, breg);
6777       break;
6778
6779     case M_L_DAB:
6780       /*
6781        * The MIPS assembler seems to check for X_add_number not
6782        * being double aligned and generating:
6783        *        lui     at,%hi(foo+1)
6784        *        addu    at,at,v1
6785        *        addiu   at,at,%lo(foo+1)
6786        *        lwc1    f2,0(at)
6787        *        lwc1    f3,4(at)
6788        * But, the resulting address is the same after relocation so why
6789        * generate the extra instruction?
6790        */
6791       if (mips_opts.arch == CPU_R4650)
6792         {
6793           as_bad (_("opcode not supported on this processor"));
6794           break;
6795         }
6796       /* Itbl support may require additional care here.  */
6797       coproc = 1;
6798       if (mips_opts.isa != ISA_MIPS1)
6799         {
6800           s = "ldc1";
6801           goto ld;
6802         }
6803
6804       s = "lwc1";
6805       fmt = "T,o(b)";
6806       goto ldd_std;
6807
6808     case M_S_DAB:
6809       if (mips_opts.arch == CPU_R4650)
6810         {
6811           as_bad (_("opcode not supported on this processor"));
6812           break;
6813         }
6814
6815       if (mips_opts.isa != ISA_MIPS1)
6816         {
6817           s = "sdc1";
6818           goto st;
6819         }
6820
6821       s = "swc1";
6822       fmt = "T,o(b)";
6823       /* Itbl support may require additional care here.  */
6824       coproc = 1;
6825       goto ldd_std;
6826
6827     case M_LD_AB:
6828       if (HAVE_64BIT_GPRS)
6829         {
6830           s = "ld";
6831           goto ld;
6832         }
6833
6834       s = "lw";
6835       fmt = "t,o(b)";
6836       goto ldd_std;
6837
6838     case M_SD_AB:
6839       if (HAVE_64BIT_GPRS)
6840         {
6841           s = "sd";
6842           goto st;
6843         }
6844
6845       s = "sw";
6846       fmt = "t,o(b)";
6847
6848     ldd_std:
6849       if (offset_expr.X_op != O_symbol
6850           && offset_expr.X_op != O_constant)
6851         {
6852           as_bad (_("expression too complex"));
6853           offset_expr.X_op = O_constant;
6854         }
6855
6856       if (HAVE_32BIT_ADDRESSES
6857           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6858         {
6859           char value [32];
6860
6861           sprintf_vma (value, offset_expr.X_add_number);
6862           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6863         }
6864
6865       /* Even on a big endian machine $fn comes before $fn+1.  We have
6866          to adjust when loading from memory.  We set coproc if we must
6867          load $fn+1 first.  */
6868       /* Itbl support may require additional care here.  */
6869       if (! target_big_endian)
6870         coproc = 0;
6871
6872       if (mips_pic == NO_PIC
6873           || offset_expr.X_op == O_constant)
6874         {
6875           /* If this is a reference to a GP relative symbol, we want
6876                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6877                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
6878              If we have a base register, we use this
6879                addu     $at,$breg,$gp
6880                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
6881                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
6882              If this is not a GP relative symbol, we want
6883                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6884                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6885                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6886              If there is a base register, we add it to $at after the
6887              lui instruction.  If there is a constant, we always use
6888              the last case.  */
6889           if (offset_expr.X_op == O_symbol
6890               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6891               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6892             {
6893               relax_start (offset_expr.X_add_symbol);
6894               if (breg == 0)
6895                 {
6896                   tempreg = mips_gp_register;
6897                 }
6898               else
6899                 {
6900                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6901                                AT, breg, mips_gp_register);
6902                   tempreg = AT;
6903                   used_at = 1;
6904                 }
6905
6906               /* Itbl support may require additional care here.  */
6907               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6908                            BFD_RELOC_GPREL16, tempreg);
6909               offset_expr.X_add_number += 4;
6910
6911               /* Set mips_optimize to 2 to avoid inserting an
6912                  undesired nop.  */
6913               hold_mips_optimize = mips_optimize;
6914               mips_optimize = 2;
6915               /* Itbl support may require additional care here.  */
6916               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6917                            BFD_RELOC_GPREL16, tempreg);
6918               mips_optimize = hold_mips_optimize;
6919
6920               relax_switch ();
6921
6922               /* We just generated two relocs.  When tc_gen_reloc
6923                  handles this case, it will skip the first reloc and
6924                  handle the second.  The second reloc already has an
6925                  extra addend of 4, which we added above.  We must
6926                  subtract it out, and then subtract another 4 to make
6927                  the first reloc come out right.  The second reloc
6928                  will come out right because we are going to add 4 to
6929                  offset_expr when we build its instruction below.
6930
6931                  If we have a symbol, then we don't want to include
6932                  the offset, because it will wind up being included
6933                  when we generate the reloc.  */
6934
6935               if (offset_expr.X_op == O_constant)
6936                 offset_expr.X_add_number -= 8;
6937               else
6938                 {
6939                   offset_expr.X_add_number = -4;
6940                   offset_expr.X_op = O_constant;
6941                 }
6942             }
6943           used_at = 1;
6944           macro_build_lui (&offset_expr, AT);
6945           if (breg != 0)
6946             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6947           /* Itbl support may require additional care here.  */
6948           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6949                        BFD_RELOC_LO16, AT);
6950           /* FIXME: How do we handle overflow here?  */
6951           offset_expr.X_add_number += 4;
6952           /* Itbl support may require additional care here.  */
6953           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
6954                        BFD_RELOC_LO16, AT);
6955           if (mips_relax.sequence)
6956             relax_end ();
6957         }
6958       else if (!mips_big_got)
6959         {
6960           /* If this is a reference to an external symbol, we want
6961                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6962                nop
6963                <op>     $treg,0($at)
6964                <op>     $treg+1,4($at)
6965              Otherwise we want
6966                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6967                nop
6968                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
6969                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
6970              If there is a base register we add it to $at before the
6971              lwc1 instructions.  If there is a constant we include it
6972              in the lwc1 instructions.  */
6973           used_at = 1;
6974           expr1.X_add_number = offset_expr.X_add_number;
6975           if (expr1.X_add_number < -0x8000
6976               || expr1.X_add_number >= 0x8000 - 4)
6977             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6978           load_got_offset (AT, &offset_expr);
6979           load_delay_nop ();
6980           if (breg != 0)
6981             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
6982
6983           /* Set mips_optimize to 2 to avoid inserting an undesired
6984              nop.  */
6985           hold_mips_optimize = mips_optimize;
6986           mips_optimize = 2;
6987
6988           /* Itbl support may require additional care here.  */
6989           relax_start (offset_expr.X_add_symbol);
6990           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
6991                        BFD_RELOC_LO16, AT);
6992           expr1.X_add_number += 4;
6993           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
6994                        BFD_RELOC_LO16, AT);
6995           relax_switch ();
6996           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
6997                        BFD_RELOC_LO16, AT);
6998           offset_expr.X_add_number += 4;
6999           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7000                        BFD_RELOC_LO16, AT);
7001           relax_end ();
7002
7003           mips_optimize = hold_mips_optimize;
7004         }
7005       else if (mips_big_got)
7006         {
7007           int gpdelay;
7008
7009           /* If this is a reference to an external symbol, we want
7010                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7011                addu     $at,$at,$gp
7012                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7013                nop
7014                <op>     $treg,0($at)
7015                <op>     $treg+1,4($at)
7016              Otherwise we want
7017                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7018                nop
7019                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7020                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7021              If there is a base register we add it to $at before the
7022              lwc1 instructions.  If there is a constant we include it
7023              in the lwc1 instructions.  */
7024           used_at = 1;
7025           expr1.X_add_number = offset_expr.X_add_number;
7026           offset_expr.X_add_number = 0;
7027           if (expr1.X_add_number < -0x8000
7028               || expr1.X_add_number >= 0x8000 - 4)
7029             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7030           gpdelay = reg_needs_delay (mips_gp_register);
7031           relax_start (offset_expr.X_add_symbol);
7032           macro_build (&offset_expr, "lui", "t,u",
7033                        AT, BFD_RELOC_MIPS_GOT_HI16);
7034           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7035                        AT, AT, mips_gp_register);
7036           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7037                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7038           load_delay_nop ();
7039           if (breg != 0)
7040             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7041           /* Itbl support may require additional care here.  */
7042           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7043                        BFD_RELOC_LO16, AT);
7044           expr1.X_add_number += 4;
7045
7046           /* Set mips_optimize to 2 to avoid inserting an undesired
7047              nop.  */
7048           hold_mips_optimize = mips_optimize;
7049           mips_optimize = 2;
7050           /* Itbl support may require additional care here.  */
7051           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7052                        BFD_RELOC_LO16, AT);
7053           mips_optimize = hold_mips_optimize;
7054           expr1.X_add_number -= 4;
7055
7056           relax_switch ();
7057           offset_expr.X_add_number = expr1.X_add_number;
7058           if (gpdelay)
7059             macro_build (NULL, "nop", "");
7060           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7061                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7062           load_delay_nop ();
7063           if (breg != 0)
7064             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7065           /* Itbl support may require additional care here.  */
7066           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7067                        BFD_RELOC_LO16, AT);
7068           offset_expr.X_add_number += 4;
7069
7070           /* Set mips_optimize to 2 to avoid inserting an undesired
7071              nop.  */
7072           hold_mips_optimize = mips_optimize;
7073           mips_optimize = 2;
7074           /* Itbl support may require additional care here.  */
7075           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7076                        BFD_RELOC_LO16, AT);
7077           mips_optimize = hold_mips_optimize;
7078           relax_end ();
7079         }
7080       else
7081         abort ();
7082
7083       break;
7084
7085     case M_LD_OB:
7086       s = "lw";
7087       goto sd_ob;
7088     case M_SD_OB:
7089       s = "sw";
7090     sd_ob:
7091       assert (HAVE_32BIT_ADDRESSES);
7092       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7093       offset_expr.X_add_number += 4;
7094       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7095       break;
7096
7097    /* New code added to support COPZ instructions.
7098       This code builds table entries out of the macros in mip_opcodes.
7099       R4000 uses interlocks to handle coproc delays.
7100       Other chips (like the R3000) require nops to be inserted for delays.
7101
7102       FIXME: Currently, we require that the user handle delays.
7103       In order to fill delay slots for non-interlocked chips,
7104       we must have a way to specify delays based on the coprocessor.
7105       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7106       What are the side-effects of the cop instruction?
7107       What cache support might we have and what are its effects?
7108       Both coprocessor & memory require delays. how long???
7109       What registers are read/set/modified?
7110
7111       If an itbl is provided to interpret cop instructions,
7112       this knowledge can be encoded in the itbl spec.  */
7113
7114     case M_COP0:
7115       s = "c0";
7116       goto copz;
7117     case M_COP1:
7118       s = "c1";
7119       goto copz;
7120     case M_COP2:
7121       s = "c2";
7122       goto copz;
7123     case M_COP3:
7124       s = "c3";
7125     copz:
7126       /* For now we just do C (same as Cz).  The parameter will be
7127          stored in insn_opcode by mips_ip.  */
7128       macro_build (NULL, s, "C", ip->insn_opcode);
7129       break;
7130
7131     case M_MOVE:
7132       move_register (dreg, sreg);
7133       break;
7134
7135 #ifdef LOSING_COMPILER
7136     default:
7137       /* Try and see if this is a new itbl instruction.
7138          This code builds table entries out of the macros in mip_opcodes.
7139          FIXME: For now we just assemble the expression and pass it's
7140          value along as a 32-bit immediate.
7141          We may want to have the assembler assemble this value,
7142          so that we gain the assembler's knowledge of delay slots,
7143          symbols, etc.
7144          Would it be more efficient to use mask (id) here? */
7145       if (itbl_have_entries
7146           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7147         {
7148           s = ip->insn_mo->name;
7149           s2 = "cop3";
7150           coproc = ITBL_DECODE_PNUM (immed_expr);;
7151           macro_build (&immed_expr, s, "C");
7152           break;
7153         }
7154       macro2 (ip);
7155       break;
7156     }
7157   if (!mips_opts.at && used_at)
7158     as_bad (_("Macro used $at after \".set noat\""));
7159 }
7160
7161 static void
7162 macro2 (struct mips_cl_insn *ip)
7163 {
7164   unsigned int treg, sreg, dreg, breg;
7165   unsigned int tempreg;
7166   int mask;
7167   int used_at;
7168   expressionS expr1;
7169   const char *s;
7170   const char *s2;
7171   const char *fmt;
7172   int likely = 0;
7173   int dbl = 0;
7174   int coproc = 0;
7175   int lr = 0;
7176   int imm = 0;
7177   int off;
7178   offsetT maxnum;
7179   bfd_reloc_code_real_type r;
7180
7181   treg = (ip->insn_opcode >> 16) & 0x1f;
7182   dreg = (ip->insn_opcode >> 11) & 0x1f;
7183   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7184   mask = ip->insn_mo->mask;
7185
7186   expr1.X_op = O_constant;
7187   expr1.X_op_symbol = NULL;
7188   expr1.X_add_symbol = NULL;
7189   expr1.X_add_number = 1;
7190
7191   switch (mask)
7192     {
7193 #endif /* LOSING_COMPILER */
7194
7195     case M_DMUL:
7196       dbl = 1;
7197     case M_MUL:
7198       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7199       macro_build (NULL, "mflo", "d", dreg);
7200       break;
7201
7202     case M_DMUL_I:
7203       dbl = 1;
7204     case M_MUL_I:
7205       /* The MIPS assembler some times generates shifts and adds.  I'm
7206          not trying to be that fancy. GCC should do this for us
7207          anyway.  */
7208       used_at = 1;
7209       load_register (AT, &imm_expr, dbl);
7210       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7211       macro_build (NULL, "mflo", "d", dreg);
7212       break;
7213
7214     case M_DMULO_I:
7215       dbl = 1;
7216     case M_MULO_I:
7217       imm = 1;
7218       goto do_mulo;
7219
7220     case M_DMULO:
7221       dbl = 1;
7222     case M_MULO:
7223     do_mulo:
7224       start_noreorder ();
7225       used_at = 1;
7226       if (imm)
7227         load_register (AT, &imm_expr, dbl);
7228       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7229       macro_build (NULL, "mflo", "d", dreg);
7230       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7231       macro_build (NULL, "mfhi", "d", AT);
7232       if (mips_trap)
7233         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7234       else
7235         {
7236           expr1.X_add_number = 8;
7237           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7238           macro_build (NULL, "nop", "", 0);
7239           macro_build (NULL, "break", "c", 6);
7240         }
7241       end_noreorder ();
7242       macro_build (NULL, "mflo", "d", dreg);
7243       break;
7244
7245     case M_DMULOU_I:
7246       dbl = 1;
7247     case M_MULOU_I:
7248       imm = 1;
7249       goto do_mulou;
7250
7251     case M_DMULOU:
7252       dbl = 1;
7253     case M_MULOU:
7254     do_mulou:
7255       start_noreorder ();
7256       used_at = 1;
7257       if (imm)
7258         load_register (AT, &imm_expr, dbl);
7259       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7260                    sreg, imm ? AT : treg);
7261       macro_build (NULL, "mfhi", "d", AT);
7262       macro_build (NULL, "mflo", "d", dreg);
7263       if (mips_trap)
7264         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7265       else
7266         {
7267           expr1.X_add_number = 8;
7268           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7269           macro_build (NULL, "nop", "", 0);
7270           macro_build (NULL, "break", "c", 6);
7271         }
7272       end_noreorder ();
7273       break;
7274
7275     case M_DROL:
7276       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7277         {
7278           if (dreg == sreg)
7279             {
7280               tempreg = AT;
7281               used_at = 1;
7282             }
7283           else
7284             {
7285               tempreg = dreg;
7286             }
7287           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7288           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7289           break;
7290         }
7291       used_at = 1;
7292       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7293       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7294       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7295       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7296       break;
7297
7298     case M_ROL:
7299       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7300         {
7301           if (dreg == sreg)
7302             {
7303               tempreg = AT;
7304               used_at = 1;
7305             }
7306           else
7307             {
7308               tempreg = dreg;
7309             }
7310           macro_build (NULL, "negu", "d,w", tempreg, treg);
7311           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7312           break;
7313         }
7314       used_at = 1;
7315       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7316       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7317       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7318       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7319       break;
7320
7321     case M_DROL_I:
7322       {
7323         unsigned int rot;
7324         char *l, *r;
7325
7326         if (imm_expr.X_op != O_constant)
7327           as_bad (_("Improper rotate count"));
7328         rot = imm_expr.X_add_number & 0x3f;
7329         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7330           {
7331             rot = (64 - rot) & 0x3f;
7332             if (rot >= 32)
7333               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7334             else
7335               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7336             break;
7337           }
7338         if (rot == 0)
7339           {
7340             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7341             break;
7342           }
7343         l = (rot < 0x20) ? "dsll" : "dsll32";
7344         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7345         rot &= 0x1f;
7346         used_at = 1;
7347         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7348         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7349         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7350       }
7351       break;
7352
7353     case M_ROL_I:
7354       {
7355         unsigned int rot;
7356
7357         if (imm_expr.X_op != O_constant)
7358           as_bad (_("Improper rotate count"));
7359         rot = imm_expr.X_add_number & 0x1f;
7360         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7361           {
7362             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7363             break;
7364           }
7365         if (rot == 0)
7366           {
7367             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7368             break;
7369           }
7370         used_at = 1;
7371         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7372         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7373         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7374       }
7375       break;
7376
7377     case M_DROR:
7378       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7379         {
7380           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7381           break;
7382         }
7383       used_at = 1;
7384       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7385       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7386       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7387       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7388       break;
7389
7390     case M_ROR:
7391       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7392         {
7393           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7394           break;
7395         }
7396       used_at = 1;
7397       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7398       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7399       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7400       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7401       break;
7402
7403     case M_DROR_I:
7404       {
7405         unsigned int rot;
7406         char *l, *r;
7407
7408         if (imm_expr.X_op != O_constant)
7409           as_bad (_("Improper rotate count"));
7410         rot = imm_expr.X_add_number & 0x3f;
7411         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7412           {
7413             if (rot >= 32)
7414               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7415             else
7416               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7417             break;
7418           }
7419         if (rot == 0)
7420           {
7421             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7422             break;
7423           }
7424         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7425         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7426         rot &= 0x1f;
7427         used_at = 1;
7428         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7429         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7430         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7431       }
7432       break;
7433
7434     case M_ROR_I:
7435       {
7436         unsigned int rot;
7437
7438         if (imm_expr.X_op != O_constant)
7439           as_bad (_("Improper rotate count"));
7440         rot = imm_expr.X_add_number & 0x1f;
7441         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7442           {
7443             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7444             break;
7445           }
7446         if (rot == 0)
7447           {
7448             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7449             break;
7450           }
7451         used_at = 1;
7452         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7453         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7454         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7455       }
7456       break;
7457
7458     case M_S_DOB:
7459       if (mips_opts.arch == CPU_R4650)
7460         {
7461           as_bad (_("opcode not supported on this processor"));
7462           break;
7463         }
7464       assert (mips_opts.isa == ISA_MIPS1);
7465       /* Even on a big endian machine $fn comes before $fn+1.  We have
7466          to adjust when storing to memory.  */
7467       macro_build (&offset_expr, "swc1", "T,o(b)",
7468                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7469       offset_expr.X_add_number += 4;
7470       macro_build (&offset_expr, "swc1", "T,o(b)",
7471                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7472       break;
7473
7474     case M_SEQ:
7475       if (sreg == 0)
7476         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7477       else if (treg == 0)
7478         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7479       else
7480         {
7481           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7482           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7483         }
7484       break;
7485
7486     case M_SEQ_I:
7487       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7488         {
7489           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7490           break;
7491         }
7492       if (sreg == 0)
7493         {
7494           as_warn (_("Instruction %s: result is always false"),
7495                    ip->insn_mo->name);
7496           move_register (dreg, 0);
7497           break;
7498         }
7499       if (imm_expr.X_op == O_constant
7500           && imm_expr.X_add_number >= 0
7501           && imm_expr.X_add_number < 0x10000)
7502         {
7503           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7504         }
7505       else if (imm_expr.X_op == O_constant
7506                && imm_expr.X_add_number > -0x8000
7507                && imm_expr.X_add_number < 0)
7508         {
7509           imm_expr.X_add_number = -imm_expr.X_add_number;
7510           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7511                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7512         }
7513       else
7514         {
7515           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7516           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7517           used_at = 1;
7518         }
7519       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7520       break;
7521
7522     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7523       s = "slt";
7524       goto sge;
7525     case M_SGEU:
7526       s = "sltu";
7527     sge:
7528       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7529       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7530       break;
7531
7532     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7533     case M_SGEU_I:
7534       if (imm_expr.X_op == O_constant
7535           && imm_expr.X_add_number >= -0x8000
7536           && imm_expr.X_add_number < 0x8000)
7537         {
7538           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7539                        dreg, sreg, BFD_RELOC_LO16);
7540         }
7541       else
7542         {
7543           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7544           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7545                        dreg, sreg, AT);
7546           used_at = 1;
7547         }
7548       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7549       break;
7550
7551     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7552       s = "slt";
7553       goto sgt;
7554     case M_SGTU:
7555       s = "sltu";
7556     sgt:
7557       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7558       break;
7559
7560     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7561       s = "slt";
7562       goto sgti;
7563     case M_SGTU_I:
7564       s = "sltu";
7565     sgti:
7566       used_at = 1;
7567       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7568       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7569       break;
7570
7571     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7572       s = "slt";
7573       goto sle;
7574     case M_SLEU:
7575       s = "sltu";
7576     sle:
7577       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7578       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7579       break;
7580
7581     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7582       s = "slt";
7583       goto slei;
7584     case M_SLEU_I:
7585       s = "sltu";
7586     slei:
7587       used_at = 1;
7588       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7589       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7590       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7591       break;
7592
7593     case M_SLT_I:
7594       if (imm_expr.X_op == O_constant
7595           && imm_expr.X_add_number >= -0x8000
7596           && imm_expr.X_add_number < 0x8000)
7597         {
7598           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7599           break;
7600         }
7601       used_at = 1;
7602       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7603       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7604       break;
7605
7606     case M_SLTU_I:
7607       if (imm_expr.X_op == O_constant
7608           && imm_expr.X_add_number >= -0x8000
7609           && imm_expr.X_add_number < 0x8000)
7610         {
7611           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7612                        BFD_RELOC_LO16);
7613           break;
7614         }
7615       used_at = 1;
7616       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7617       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7618       break;
7619
7620     case M_SNE:
7621       if (sreg == 0)
7622         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7623       else if (treg == 0)
7624         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7625       else
7626         {
7627           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7628           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7629         }
7630       break;
7631
7632     case M_SNE_I:
7633       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7634         {
7635           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7636           break;
7637         }
7638       if (sreg == 0)
7639         {
7640           as_warn (_("Instruction %s: result is always true"),
7641                    ip->insn_mo->name);
7642           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7643                        dreg, 0, BFD_RELOC_LO16);
7644           break;
7645         }
7646       if (imm_expr.X_op == O_constant
7647           && imm_expr.X_add_number >= 0
7648           && imm_expr.X_add_number < 0x10000)
7649         {
7650           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7651         }
7652       else if (imm_expr.X_op == O_constant
7653                && imm_expr.X_add_number > -0x8000
7654                && imm_expr.X_add_number < 0)
7655         {
7656           imm_expr.X_add_number = -imm_expr.X_add_number;
7657           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7658                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7659         }
7660       else
7661         {
7662           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7663           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7664           used_at = 1;
7665         }
7666       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7667       break;
7668
7669     case M_DSUB_I:
7670       dbl = 1;
7671     case M_SUB_I:
7672       if (imm_expr.X_op == O_constant
7673           && imm_expr.X_add_number > -0x8000
7674           && imm_expr.X_add_number <= 0x8000)
7675         {
7676           imm_expr.X_add_number = -imm_expr.X_add_number;
7677           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7678                        dreg, sreg, BFD_RELOC_LO16);
7679           break;
7680         }
7681       used_at = 1;
7682       load_register (AT, &imm_expr, dbl);
7683       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7684       break;
7685
7686     case M_DSUBU_I:
7687       dbl = 1;
7688     case M_SUBU_I:
7689       if (imm_expr.X_op == O_constant
7690           && imm_expr.X_add_number > -0x8000
7691           && imm_expr.X_add_number <= 0x8000)
7692         {
7693           imm_expr.X_add_number = -imm_expr.X_add_number;
7694           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7695                        dreg, sreg, BFD_RELOC_LO16);
7696           break;
7697         }
7698       used_at = 1;
7699       load_register (AT, &imm_expr, dbl);
7700       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7701       break;
7702
7703     case M_TEQ_I:
7704       s = "teq";
7705       goto trap;
7706     case M_TGE_I:
7707       s = "tge";
7708       goto trap;
7709     case M_TGEU_I:
7710       s = "tgeu";
7711       goto trap;
7712     case M_TLT_I:
7713       s = "tlt";
7714       goto trap;
7715     case M_TLTU_I:
7716       s = "tltu";
7717       goto trap;
7718     case M_TNE_I:
7719       s = "tne";
7720     trap:
7721       used_at = 1;
7722       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7723       macro_build (NULL, s, "s,t", sreg, AT);
7724       break;
7725
7726     case M_TRUNCWS:
7727     case M_TRUNCWD:
7728       assert (mips_opts.isa == ISA_MIPS1);
7729       used_at = 1;
7730       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7731       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7732
7733       /*
7734        * Is the double cfc1 instruction a bug in the mips assembler;
7735        * or is there a reason for it?
7736        */
7737       start_noreorder ();
7738       macro_build (NULL, "cfc1", "t,G", treg, RA);
7739       macro_build (NULL, "cfc1", "t,G", treg, RA);
7740       macro_build (NULL, "nop", "");
7741       expr1.X_add_number = 3;
7742       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7743       expr1.X_add_number = 2;
7744       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7745       macro_build (NULL, "ctc1", "t,G", AT, RA);
7746       macro_build (NULL, "nop", "");
7747       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7748                    dreg, sreg);
7749       macro_build (NULL, "ctc1", "t,G", treg, RA);
7750       macro_build (NULL, "nop", "");
7751       end_noreorder ();
7752       break;
7753
7754     case M_ULH:
7755       s = "lb";
7756       goto ulh;
7757     case M_ULHU:
7758       s = "lbu";
7759     ulh:
7760       used_at = 1;
7761       if (offset_expr.X_add_number >= 0x7fff)
7762         as_bad (_("operand overflow"));
7763       if (! target_big_endian)
7764         ++offset_expr.X_add_number;
7765       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
7766       if (! target_big_endian)
7767         --offset_expr.X_add_number;
7768       else
7769         ++offset_expr.X_add_number;
7770       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7771       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
7772       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7773       break;
7774
7775     case M_ULD:
7776       s = "ldl";
7777       s2 = "ldr";
7778       off = 7;
7779       goto ulw;
7780     case M_ULW:
7781       s = "lwl";
7782       s2 = "lwr";
7783       off = 3;
7784     ulw:
7785       if (offset_expr.X_add_number >= 0x8000 - off)
7786         as_bad (_("operand overflow"));
7787       if (treg != breg)
7788         tempreg = treg;
7789       else
7790         {
7791           used_at = 1;
7792           tempreg = AT;
7793         }
7794       if (! target_big_endian)
7795         offset_expr.X_add_number += off;
7796       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7797       if (! target_big_endian)
7798         offset_expr.X_add_number -= off;
7799       else
7800         offset_expr.X_add_number += off;
7801       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
7802
7803       /* If necessary, move the result in tempreg the final destination.  */
7804       if (treg == tempreg)
7805         break;
7806       /* Protect second load's delay slot.  */
7807       load_delay_nop ();
7808       move_register (treg, tempreg);
7809       break;
7810
7811     case M_ULD_A:
7812       s = "ldl";
7813       s2 = "ldr";
7814       off = 7;
7815       goto ulwa;
7816     case M_ULW_A:
7817       s = "lwl";
7818       s2 = "lwr";
7819       off = 3;
7820     ulwa:
7821       used_at = 1;
7822       load_address (AT, &offset_expr, &used_at);
7823       if (breg != 0)
7824         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7825       if (! target_big_endian)
7826         expr1.X_add_number = off;
7827       else
7828         expr1.X_add_number = 0;
7829       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7830       if (! target_big_endian)
7831         expr1.X_add_number = 0;
7832       else
7833         expr1.X_add_number = off;
7834       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7835       break;
7836
7837     case M_ULH_A:
7838     case M_ULHU_A:
7839       used_at = 1;
7840       load_address (AT, &offset_expr, &used_at);
7841       if (breg != 0)
7842         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7843       if (target_big_endian)
7844         expr1.X_add_number = 0;
7845       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
7846                    treg, BFD_RELOC_LO16, AT);
7847       if (target_big_endian)
7848         expr1.X_add_number = 1;
7849       else
7850         expr1.X_add_number = 0;
7851       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7852       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7853       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7854       break;
7855
7856     case M_USH:
7857       used_at = 1;
7858       if (offset_expr.X_add_number >= 0x7fff)
7859         as_bad (_("operand overflow"));
7860       if (target_big_endian)
7861         ++offset_expr.X_add_number;
7862       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
7863       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
7864       if (target_big_endian)
7865         --offset_expr.X_add_number;
7866       else
7867         ++offset_expr.X_add_number;
7868       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
7869       break;
7870
7871     case M_USD:
7872       s = "sdl";
7873       s2 = "sdr";
7874       off = 7;
7875       goto usw;
7876     case M_USW:
7877       s = "swl";
7878       s2 = "swr";
7879       off = 3;
7880     usw:
7881       if (offset_expr.X_add_number >= 0x8000 - off)
7882         as_bad (_("operand overflow"));
7883       if (! target_big_endian)
7884         offset_expr.X_add_number += off;
7885       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7886       if (! target_big_endian)
7887         offset_expr.X_add_number -= off;
7888       else
7889         offset_expr.X_add_number += off;
7890       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7891       break;
7892
7893     case M_USD_A:
7894       s = "sdl";
7895       s2 = "sdr";
7896       off = 7;
7897       goto uswa;
7898     case M_USW_A:
7899       s = "swl";
7900       s2 = "swr";
7901       off = 3;
7902     uswa:
7903       used_at = 1;
7904       load_address (AT, &offset_expr, &used_at);
7905       if (breg != 0)
7906         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7907       if (! target_big_endian)
7908         expr1.X_add_number = off;
7909       else
7910         expr1.X_add_number = 0;
7911       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7912       if (! target_big_endian)
7913         expr1.X_add_number = 0;
7914       else
7915         expr1.X_add_number = off;
7916       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
7917       break;
7918
7919     case M_USH_A:
7920       used_at = 1;
7921       load_address (AT, &offset_expr, &used_at);
7922       if (breg != 0)
7923         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
7924       if (! target_big_endian)
7925         expr1.X_add_number = 0;
7926       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7927       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
7928       if (! target_big_endian)
7929         expr1.X_add_number = 1;
7930       else
7931         expr1.X_add_number = 0;
7932       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7933       if (! target_big_endian)
7934         expr1.X_add_number = 0;
7935       else
7936         expr1.X_add_number = 1;
7937       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
7938       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
7939       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
7940       break;
7941
7942     default:
7943       /* FIXME: Check if this is one of the itbl macros, since they
7944          are added dynamically.  */
7945       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
7946       break;
7947     }
7948   if (!mips_opts.at && used_at)
7949     as_bad (_("Macro used $at after \".set noat\""));
7950 }
7951
7952 /* Implement macros in mips16 mode.  */
7953
7954 static void
7955 mips16_macro (struct mips_cl_insn *ip)
7956 {
7957   int mask;
7958   int xreg, yreg, zreg, tmp;
7959   expressionS expr1;
7960   int dbl;
7961   const char *s, *s2, *s3;
7962
7963   mask = ip->insn_mo->mask;
7964
7965   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
7966   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
7967   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
7968
7969   expr1.X_op = O_constant;
7970   expr1.X_op_symbol = NULL;
7971   expr1.X_add_symbol = NULL;
7972   expr1.X_add_number = 1;
7973
7974   dbl = 0;
7975
7976   switch (mask)
7977     {
7978     default:
7979       internalError ();
7980
7981     case M_DDIV_3:
7982       dbl = 1;
7983     case M_DIV_3:
7984       s = "mflo";
7985       goto do_div3;
7986     case M_DREM_3:
7987       dbl = 1;
7988     case M_REM_3:
7989       s = "mfhi";
7990     do_div3:
7991       start_noreorder ();
7992       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
7993       expr1.X_add_number = 2;
7994       macro_build (&expr1, "bnez", "x,p", yreg);
7995       macro_build (NULL, "break", "6", 7);
7996
7997       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
7998          since that causes an overflow.  We should do that as well,
7999          but I don't see how to do the comparisons without a temporary
8000          register.  */
8001       end_noreorder ();
8002       macro_build (NULL, s, "x", zreg);
8003       break;
8004
8005     case M_DIVU_3:
8006       s = "divu";
8007       s2 = "mflo";
8008       goto do_divu3;
8009     case M_REMU_3:
8010       s = "divu";
8011       s2 = "mfhi";
8012       goto do_divu3;
8013     case M_DDIVU_3:
8014       s = "ddivu";
8015       s2 = "mflo";
8016       goto do_divu3;
8017     case M_DREMU_3:
8018       s = "ddivu";
8019       s2 = "mfhi";
8020     do_divu3:
8021       start_noreorder ();
8022       macro_build (NULL, s, "0,x,y", xreg, yreg);
8023       expr1.X_add_number = 2;
8024       macro_build (&expr1, "bnez", "x,p", yreg);
8025       macro_build (NULL, "break", "6", 7);
8026       end_noreorder ();
8027       macro_build (NULL, s2, "x", zreg);
8028       break;
8029
8030     case M_DMUL:
8031       dbl = 1;
8032     case M_MUL:
8033       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8034       macro_build (NULL, "mflo", "x", zreg);
8035       break;
8036
8037     case M_DSUBU_I:
8038       dbl = 1;
8039       goto do_subu;
8040     case M_SUBU_I:
8041     do_subu:
8042       if (imm_expr.X_op != O_constant)
8043         as_bad (_("Unsupported large constant"));
8044       imm_expr.X_add_number = -imm_expr.X_add_number;
8045       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8046       break;
8047
8048     case M_SUBU_I_2:
8049       if (imm_expr.X_op != O_constant)
8050         as_bad (_("Unsupported large constant"));
8051       imm_expr.X_add_number = -imm_expr.X_add_number;
8052       macro_build (&imm_expr, "addiu", "x,k", xreg);
8053       break;
8054
8055     case M_DSUBU_I_2:
8056       if (imm_expr.X_op != O_constant)
8057         as_bad (_("Unsupported large constant"));
8058       imm_expr.X_add_number = -imm_expr.X_add_number;
8059       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8060       break;
8061
8062     case M_BEQ:
8063       s = "cmp";
8064       s2 = "bteqz";
8065       goto do_branch;
8066     case M_BNE:
8067       s = "cmp";
8068       s2 = "btnez";
8069       goto do_branch;
8070     case M_BLT:
8071       s = "slt";
8072       s2 = "btnez";
8073       goto do_branch;
8074     case M_BLTU:
8075       s = "sltu";
8076       s2 = "btnez";
8077       goto do_branch;
8078     case M_BLE:
8079       s = "slt";
8080       s2 = "bteqz";
8081       goto do_reverse_branch;
8082     case M_BLEU:
8083       s = "sltu";
8084       s2 = "bteqz";
8085       goto do_reverse_branch;
8086     case M_BGE:
8087       s = "slt";
8088       s2 = "bteqz";
8089       goto do_branch;
8090     case M_BGEU:
8091       s = "sltu";
8092       s2 = "bteqz";
8093       goto do_branch;
8094     case M_BGT:
8095       s = "slt";
8096       s2 = "btnez";
8097       goto do_reverse_branch;
8098     case M_BGTU:
8099       s = "sltu";
8100       s2 = "btnez";
8101
8102     do_reverse_branch:
8103       tmp = xreg;
8104       xreg = yreg;
8105       yreg = tmp;
8106
8107     do_branch:
8108       macro_build (NULL, s, "x,y", xreg, yreg);
8109       macro_build (&offset_expr, s2, "p");
8110       break;
8111
8112     case M_BEQ_I:
8113       s = "cmpi";
8114       s2 = "bteqz";
8115       s3 = "x,U";
8116       goto do_branch_i;
8117     case M_BNE_I:
8118       s = "cmpi";
8119       s2 = "btnez";
8120       s3 = "x,U";
8121       goto do_branch_i;
8122     case M_BLT_I:
8123       s = "slti";
8124       s2 = "btnez";
8125       s3 = "x,8";
8126       goto do_branch_i;
8127     case M_BLTU_I:
8128       s = "sltiu";
8129       s2 = "btnez";
8130       s3 = "x,8";
8131       goto do_branch_i;
8132     case M_BLE_I:
8133       s = "slti";
8134       s2 = "btnez";
8135       s3 = "x,8";
8136       goto do_addone_branch_i;
8137     case M_BLEU_I:
8138       s = "sltiu";
8139       s2 = "btnez";
8140       s3 = "x,8";
8141       goto do_addone_branch_i;
8142     case M_BGE_I:
8143       s = "slti";
8144       s2 = "bteqz";
8145       s3 = "x,8";
8146       goto do_branch_i;
8147     case M_BGEU_I:
8148       s = "sltiu";
8149       s2 = "bteqz";
8150       s3 = "x,8";
8151       goto do_branch_i;
8152     case M_BGT_I:
8153       s = "slti";
8154       s2 = "bteqz";
8155       s3 = "x,8";
8156       goto do_addone_branch_i;
8157     case M_BGTU_I:
8158       s = "sltiu";
8159       s2 = "bteqz";
8160       s3 = "x,8";
8161
8162     do_addone_branch_i:
8163       if (imm_expr.X_op != O_constant)
8164         as_bad (_("Unsupported large constant"));
8165       ++imm_expr.X_add_number;
8166
8167     do_branch_i:
8168       macro_build (&imm_expr, s, s3, xreg);
8169       macro_build (&offset_expr, s2, "p");
8170       break;
8171
8172     case M_ABS:
8173       expr1.X_add_number = 0;
8174       macro_build (&expr1, "slti", "x,8", yreg);
8175       if (xreg != yreg)
8176         move_register (xreg, yreg);
8177       expr1.X_add_number = 2;
8178       macro_build (&expr1, "bteqz", "p");
8179       macro_build (NULL, "neg", "x,w", xreg, xreg);
8180     }
8181 }
8182
8183 /* For consistency checking, verify that all bits are specified either
8184    by the match/mask part of the instruction definition, or by the
8185    operand list.  */
8186 static int
8187 validate_mips_insn (const struct mips_opcode *opc)
8188 {
8189   const char *p = opc->args;
8190   char c;
8191   unsigned long used_bits = opc->mask;
8192
8193   if ((used_bits & opc->match) != opc->match)
8194     {
8195       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8196               opc->name, opc->args);
8197       return 0;
8198     }
8199 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8200   while (*p)
8201     switch (c = *p++)
8202       {
8203       case ',': break;
8204       case '(': break;
8205       case ')': break;
8206       case '+':
8207         switch (c = *p++)
8208           {
8209           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8210           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8211           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8212           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8213           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8214           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8215           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8216           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8217                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8218           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8219           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8220           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8221           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8222           case 'I': break;
8223           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8224           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8225                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8226           default:
8227             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8228                     c, opc->name, opc->args);
8229             return 0;
8230           }
8231         break;
8232       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8233       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8234       case 'A': break;
8235       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8236       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8237       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8238       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8239       case 'F': break;
8240       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8241       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8242       case 'I': break;
8243       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8244       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8245       case 'L': break;
8246       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8247       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8248       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8249       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8250                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8251       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8252       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8253       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8254       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8255       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8256       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8257       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8258       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8259       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8260       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8261       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8262       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8263       case 'f': break;
8264       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8265       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8266       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8267       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8268       case 'l': break;
8269       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8270       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8271       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8272       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8273       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8274       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8275       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8276       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8277       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8278       case 'x': break;
8279       case 'z': break;
8280       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8281       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8282                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8283       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8284       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8285       case '[': break;
8286       case ']': break;
8287       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8288       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8289       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8290       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8291       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8292       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8293       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8294       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8295       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8296       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8297       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8298       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8299       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8300       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8301       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8302       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8303       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8304       default:
8305         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8306                 c, opc->name, opc->args);
8307         return 0;
8308       }
8309 #undef USE_BITS
8310   if (used_bits != 0xffffffff)
8311     {
8312       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8313               ~used_bits & 0xffffffff, opc->name, opc->args);
8314       return 0;
8315     }
8316   return 1;
8317 }
8318
8319 /* UDI immediates.  */
8320 struct mips_immed {
8321   char          type;
8322   unsigned int  shift;
8323   unsigned long mask;
8324   const char *  desc;
8325 };
8326
8327 static const struct mips_immed mips_immed[] = {
8328   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8329   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8330   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8331   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8332   { 0,0,0,0 }
8333 };
8334
8335 /* Check whether an odd floating-point register is allowed.  */
8336 static int
8337 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8338 {
8339   const char *s = insn->name;
8340
8341   if (insn->pinfo == INSN_MACRO)
8342     /* Let a macro pass, we'll catch it later when it is expanded.  */
8343     return 1;
8344
8345   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8346     {
8347       /* Allow odd registers for single-precision ops.  */
8348       switch (insn->pinfo & (FP_S | FP_D))
8349         {
8350         case FP_S:
8351         case 0:
8352           return 1;     /* both single precision - ok */
8353         case FP_D:
8354           return 0;     /* both double precision - fail */
8355         default:
8356           break;
8357         }
8358
8359       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8360       s = strchr (insn->name, '.');
8361       if (argnum == 2)
8362         s = s != NULL ? strchr (s + 1, '.') : NULL;
8363       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8364     } 
8365
8366   /* Single-precision coprocessor loads and moves are OK too.  */
8367   if ((insn->pinfo & FP_S)
8368       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8369                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8370     return 1;
8371
8372   return 0;
8373 }
8374
8375 /* This routine assembles an instruction into its binary format.  As a
8376    side effect, it sets one of the global variables imm_reloc or
8377    offset_reloc to the type of relocation to do if one of the operands
8378    is an address expression.  */
8379
8380 static void
8381 mips_ip (char *str, struct mips_cl_insn *ip)
8382 {
8383   char *s;
8384   const char *args;
8385   char c = 0;
8386   struct mips_opcode *insn;
8387   char *argsStart;
8388   unsigned int regno;
8389   unsigned int lastregno = 0;
8390   unsigned int lastpos = 0;
8391   unsigned int limlo, limhi;
8392   char *s_reset;
8393   char save_c = 0;
8394   offsetT min_range, max_range;
8395   int argnum;
8396   unsigned int rtype;
8397
8398   insn_error = NULL;
8399
8400   /* If the instruction contains a '.', we first try to match an instruction
8401      including the '.'.  Then we try again without the '.'.  */
8402   insn = NULL;
8403   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8404     continue;
8405
8406   /* If we stopped on whitespace, then replace the whitespace with null for
8407      the call to hash_find.  Save the character we replaced just in case we
8408      have to re-parse the instruction.  */
8409   if (ISSPACE (*s))
8410     {
8411       save_c = *s;
8412       *s++ = '\0';
8413     }
8414
8415   insn = (struct mips_opcode *) hash_find (op_hash, str);
8416
8417   /* If we didn't find the instruction in the opcode table, try again, but
8418      this time with just the instruction up to, but not including the
8419      first '.'.  */
8420   if (insn == NULL)
8421     {
8422       /* Restore the character we overwrite above (if any).  */
8423       if (save_c)
8424         *(--s) = save_c;
8425
8426       /* Scan up to the first '.' or whitespace.  */
8427       for (s = str;
8428            *s != '\0' && *s != '.' && !ISSPACE (*s);
8429            ++s)
8430         continue;
8431
8432       /* If we did not find a '.', then we can quit now.  */
8433       if (*s != '.')
8434         {
8435           insn_error = "unrecognized opcode";
8436           return;
8437         }
8438
8439       /* Lookup the instruction in the hash table.  */
8440       *s++ = '\0';
8441       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8442         {
8443           insn_error = "unrecognized opcode";
8444           return;
8445         }
8446     }
8447
8448   argsStart = s;
8449   for (;;)
8450     {
8451       bfd_boolean ok;
8452
8453       assert (strcmp (insn->name, str) == 0);
8454
8455       if (OPCODE_IS_MEMBER (insn,
8456                             (mips_opts.isa
8457                              /* We don't check for mips_opts.mips16 here since
8458                                 we want to allow jalx if -mips16 was specified
8459                                 on the command line.  */
8460                              | (file_ase_mips16 ? INSN_MIPS16 : 0)
8461                              | (mips_opts.ase_mdmx ? INSN_MDMX : 0)
8462                              | (mips_opts.ase_dsp ? INSN_DSP : 0)
8463                              | ((mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
8464                                 ? INSN_DSP64 : 0)
8465                              | (mips_opts.ase_dspr2 ? INSN_DSPR2 : 0)
8466                              | (mips_opts.ase_mt ? INSN_MT : 0)
8467                              | (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)
8468                              | (mips_opts.ase_smartmips ? INSN_SMARTMIPS : 0)),
8469                             mips_opts.arch))
8470         ok = TRUE;
8471       else
8472         ok = FALSE;
8473
8474       if (insn->pinfo != INSN_MACRO)
8475         {
8476           if (mips_opts.arch == CPU_R4650 && (insn->pinfo & FP_D) != 0)
8477             ok = FALSE;
8478         }
8479
8480       if (! ok)
8481         {
8482           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8483               && strcmp (insn->name, insn[1].name) == 0)
8484             {
8485               ++insn;
8486               continue;
8487             }
8488           else
8489             {
8490               if (!insn_error)
8491                 {
8492                   static char buf[100];
8493                   sprintf (buf,
8494                            _("opcode not supported on this processor: %s (%s)"),
8495                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8496                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8497                   insn_error = buf;
8498                 }
8499               if (save_c)
8500                 *(--s) = save_c;
8501               return;
8502             }
8503         }
8504
8505       create_insn (ip, insn);
8506       insn_error = NULL;
8507       argnum = 1;
8508       for (args = insn->args;; ++args)
8509         {
8510           int is_mdmx;
8511
8512           s += strspn (s, " \t");
8513           is_mdmx = 0;
8514           switch (*args)
8515             {
8516             case '\0':          /* end of args */
8517               if (*s == '\0')
8518                 return;
8519               break;
8520
8521             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8522               my_getExpression (&imm_expr, s);
8523               check_absolute_expr (ip, &imm_expr);
8524               if ((unsigned long) imm_expr.X_add_number != 1
8525                   && (unsigned long) imm_expr.X_add_number != 3)
8526                 {
8527                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8528                           (unsigned long) imm_expr.X_add_number);
8529                 }
8530               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8531               imm_expr.X_op = O_absent;
8532               s = expr_end;
8533               continue;
8534
8535             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8536               my_getExpression (&imm_expr, s);
8537               check_absolute_expr (ip, &imm_expr);
8538               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8539                 {
8540                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8541                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8542                 }
8543               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8544               imm_expr.X_op = O_absent;
8545               s = expr_end;
8546               continue;
8547
8548             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8549               my_getExpression (&imm_expr, s);
8550               check_absolute_expr (ip, &imm_expr);
8551               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8552                 {
8553                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8554                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8555                 }
8556               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8557               imm_expr.X_op = O_absent;
8558               s = expr_end;
8559               continue;
8560
8561             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8562               my_getExpression (&imm_expr, s);
8563               check_absolute_expr (ip, &imm_expr);
8564               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8565                 {
8566                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8567                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8568                 }
8569               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8570               imm_expr.X_op = O_absent;
8571               s = expr_end;
8572               continue;
8573
8574             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8575               my_getExpression (&imm_expr, s);
8576               check_absolute_expr (ip, &imm_expr);
8577               if (imm_expr.X_add_number & ~OP_MASK_RS)
8578                 {
8579                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8580                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8581                 }
8582               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8583               imm_expr.X_op = O_absent;
8584               s = expr_end;
8585               continue;
8586
8587             case '7': /* four dsp accumulators in bits 11,12 */ 
8588               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8589                   s[3] >= '0' && s[3] <= '3')
8590                 {
8591                   regno = s[3] - '0';
8592                   s += 4;
8593                   INSERT_OPERAND (DSPACC, *ip, regno);
8594                   continue;
8595                 }
8596               else
8597                 as_bad (_("Invalid dsp acc register"));
8598               break;
8599
8600             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8601               my_getExpression (&imm_expr, s);
8602               check_absolute_expr (ip, &imm_expr);
8603               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8604                 {
8605                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8606                           OP_MASK_WRDSP,
8607                           (unsigned long) imm_expr.X_add_number);
8608                 }
8609               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8610               imm_expr.X_op = O_absent;
8611               s = expr_end;
8612               continue;
8613
8614             case '9': /* four dsp accumulators in bits 21,22 */
8615               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8616                   s[3] >= '0' && s[3] <= '3')
8617                 {
8618                   regno = s[3] - '0';
8619                   s += 4;
8620                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8621                   continue;
8622                 }
8623               else
8624                 as_bad (_("Invalid dsp acc register"));
8625               break;
8626
8627             case '0': /* dsp 6-bit signed immediate in bit 20 */
8628               my_getExpression (&imm_expr, s);
8629               check_absolute_expr (ip, &imm_expr);
8630               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8631               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8632               if (imm_expr.X_add_number < min_range ||
8633                   imm_expr.X_add_number > max_range)
8634                 {
8635                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8636                           (long) min_range, (long) max_range,
8637                           (long) imm_expr.X_add_number);
8638                 }
8639               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8640               imm_expr.X_op = O_absent;
8641               s = expr_end;
8642               continue;
8643
8644             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8645               my_getExpression (&imm_expr, s);
8646               check_absolute_expr (ip, &imm_expr);
8647               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8648                 {
8649                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8650                           OP_MASK_RDDSP,
8651                           (unsigned long) imm_expr.X_add_number);
8652                 }
8653               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8654               imm_expr.X_op = O_absent;
8655               s = expr_end;
8656               continue;
8657
8658             case ':': /* dsp 7-bit signed immediate in bit 19 */
8659               my_getExpression (&imm_expr, s);
8660               check_absolute_expr (ip, &imm_expr);
8661               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8662               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8663               if (imm_expr.X_add_number < min_range ||
8664                   imm_expr.X_add_number > max_range)
8665                 {
8666                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8667                           (long) min_range, (long) max_range,
8668                           (long) imm_expr.X_add_number);
8669                 }
8670               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8671               imm_expr.X_op = O_absent;
8672               s = expr_end;
8673               continue;
8674
8675             case '@': /* dsp 10-bit signed immediate in bit 16 */
8676               my_getExpression (&imm_expr, s);
8677               check_absolute_expr (ip, &imm_expr);
8678               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8679               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8680               if (imm_expr.X_add_number < min_range ||
8681                   imm_expr.X_add_number > max_range)
8682                 {
8683                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8684                           (long) min_range, (long) max_range,
8685                           (long) imm_expr.X_add_number);
8686                 }
8687               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8688               imm_expr.X_op = O_absent;
8689               s = expr_end;
8690               continue;
8691
8692             case '!': /* MT usermode flag bit.  */
8693               my_getExpression (&imm_expr, s);
8694               check_absolute_expr (ip, &imm_expr);
8695               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8696                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8697                         (unsigned long) imm_expr.X_add_number);
8698               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8699               imm_expr.X_op = O_absent;
8700               s = expr_end;
8701               continue;
8702
8703             case '$': /* MT load high flag bit.  */
8704               my_getExpression (&imm_expr, s);
8705               check_absolute_expr (ip, &imm_expr);
8706               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8707                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8708                         (unsigned long) imm_expr.X_add_number);
8709               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8710               imm_expr.X_op = O_absent;
8711               s = expr_end;
8712               continue;
8713
8714             case '*': /* four dsp accumulators in bits 18,19 */ 
8715               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8716                   s[3] >= '0' && s[3] <= '3')
8717                 {
8718                   regno = s[3] - '0';
8719                   s += 4;
8720                   INSERT_OPERAND (MTACC_T, *ip, regno);
8721                   continue;
8722                 }
8723               else
8724                 as_bad (_("Invalid dsp/smartmips acc register"));
8725               break;
8726
8727             case '&': /* four dsp accumulators in bits 13,14 */ 
8728               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8729                   s[3] >= '0' && s[3] <= '3')
8730                 {
8731                   regno = s[3] - '0';
8732                   s += 4;
8733                   INSERT_OPERAND (MTACC_D, *ip, regno);
8734                   continue;
8735                 }
8736               else
8737                 as_bad (_("Invalid dsp/smartmips acc register"));
8738               break;
8739
8740             case ',':
8741               ++argnum;
8742               if (*s++ == *args)
8743                 continue;
8744               s--;
8745               switch (*++args)
8746                 {
8747                 case 'r':
8748                 case 'v':
8749                   INSERT_OPERAND (RS, *ip, lastregno);
8750                   continue;
8751
8752                 case 'w':
8753                   INSERT_OPERAND (RT, *ip, lastregno);
8754                   continue;
8755
8756                 case 'W':
8757                   INSERT_OPERAND (FT, *ip, lastregno);
8758                   continue;
8759
8760                 case 'V':
8761                   INSERT_OPERAND (FS, *ip, lastregno);
8762                   continue;
8763                 }
8764               break;
8765
8766             case '(':
8767               /* Handle optional base register.
8768                  Either the base register is omitted or
8769                  we must have a left paren.  */
8770               /* This is dependent on the next operand specifier
8771                  is a base register specification.  */
8772               assert (args[1] == 'b' || args[1] == '5'
8773                       || args[1] == '-' || args[1] == '4');
8774               if (*s == '\0')
8775                 return;
8776
8777             case ')':           /* these must match exactly */
8778             case '[':
8779             case ']':
8780               if (*s++ == *args)
8781                 continue;
8782               break;
8783
8784             case '+':           /* Opcode extension character.  */
8785               switch (*++args)
8786                 {
8787                 case '1':       /* UDI immediates.  */
8788                 case '2':
8789                 case '3':
8790                 case '4':
8791                   {
8792                     const struct mips_immed *imm = mips_immed;
8793
8794                     while (imm->type && imm->type != *args)
8795                       ++imm;
8796                     if (! imm->type)
8797                       internalError ();
8798                     my_getExpression (&imm_expr, s);
8799                     check_absolute_expr (ip, &imm_expr);
8800                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
8801                       {
8802                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
8803                                  imm->desc ? imm->desc : ip->insn_mo->name,
8804                                  (unsigned long) imm_expr.X_add_number,
8805                                  (unsigned long) imm_expr.X_add_number);
8806                               imm_expr.X_add_number &= imm->mask;
8807                       }
8808                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
8809                                         << imm->shift);
8810                     imm_expr.X_op = O_absent;
8811                     s = expr_end;
8812                   }
8813                   continue;
8814                   
8815                 case 'A':               /* ins/ext position, becomes LSB.  */
8816                   limlo = 0;
8817                   limhi = 31;
8818                   goto do_lsb;
8819                 case 'E':
8820                   limlo = 32;
8821                   limhi = 63;
8822                   goto do_lsb;
8823 do_lsb:
8824                   my_getExpression (&imm_expr, s);
8825                   check_absolute_expr (ip, &imm_expr);
8826                   if ((unsigned long) imm_expr.X_add_number < limlo
8827                       || (unsigned long) imm_expr.X_add_number > limhi)
8828                     {
8829                       as_bad (_("Improper position (%lu)"),
8830                               (unsigned long) imm_expr.X_add_number);
8831                       imm_expr.X_add_number = limlo;
8832                     }
8833                   lastpos = imm_expr.X_add_number;
8834                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8835                   imm_expr.X_op = O_absent;
8836                   s = expr_end;
8837                   continue;
8838
8839                 case 'B':               /* ins size, becomes MSB.  */
8840                   limlo = 1;
8841                   limhi = 32;
8842                   goto do_msb;
8843                 case 'F':
8844                   limlo = 33;
8845                   limhi = 64;
8846                   goto do_msb;
8847 do_msb:
8848                   my_getExpression (&imm_expr, s);
8849                   check_absolute_expr (ip, &imm_expr);
8850                   /* Check for negative input so that small negative numbers
8851                      will not succeed incorrectly.  The checks against
8852                      (pos+size) transitively check "size" itself,
8853                      assuming that "pos" is reasonable.  */
8854                   if ((long) imm_expr.X_add_number < 0
8855                       || ((unsigned long) imm_expr.X_add_number
8856                           + lastpos) < limlo
8857                       || ((unsigned long) imm_expr.X_add_number
8858                           + lastpos) > limhi)
8859                     {
8860                       as_bad (_("Improper insert size (%lu, position %lu)"),
8861                               (unsigned long) imm_expr.X_add_number,
8862                               (unsigned long) lastpos);
8863                       imm_expr.X_add_number = limlo - lastpos;
8864                     }
8865                   INSERT_OPERAND (INSMSB, *ip,
8866                                  lastpos + imm_expr.X_add_number - 1);
8867                   imm_expr.X_op = O_absent;
8868                   s = expr_end;
8869                   continue;
8870
8871                 case 'C':               /* ext size, becomes MSBD.  */
8872                   limlo = 1;
8873                   limhi = 32;
8874                   goto do_msbd;
8875                 case 'G':
8876                   limlo = 33;
8877                   limhi = 64;
8878                   goto do_msbd;
8879                 case 'H':
8880                   limlo = 33;
8881                   limhi = 64;
8882                   goto do_msbd;
8883 do_msbd:
8884                   my_getExpression (&imm_expr, s);
8885                   check_absolute_expr (ip, &imm_expr);
8886                   /* Check for negative input so that small negative numbers
8887                      will not succeed incorrectly.  The checks against
8888                      (pos+size) transitively check "size" itself,
8889                      assuming that "pos" is reasonable.  */
8890                   if ((long) imm_expr.X_add_number < 0
8891                       || ((unsigned long) imm_expr.X_add_number
8892                           + lastpos) < limlo
8893                       || ((unsigned long) imm_expr.X_add_number
8894                           + lastpos) > limhi)
8895                     {
8896                       as_bad (_("Improper extract size (%lu, position %lu)"),
8897                               (unsigned long) imm_expr.X_add_number,
8898                               (unsigned long) lastpos);
8899                       imm_expr.X_add_number = limlo - lastpos;
8900                     }
8901                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
8902                   imm_expr.X_op = O_absent;
8903                   s = expr_end;
8904                   continue;
8905
8906                 case 'D':
8907                   /* +D is for disassembly only; never match.  */
8908                   break;
8909
8910                 case 'I':
8911                   /* "+I" is like "I", except that imm2_expr is used.  */
8912                   my_getExpression (&imm2_expr, s);
8913                   if (imm2_expr.X_op != O_big
8914                       && imm2_expr.X_op != O_constant)
8915                   insn_error = _("absolute expression required");
8916                   if (HAVE_32BIT_GPRS)
8917                     normalize_constant_expr (&imm2_expr);
8918                   s = expr_end;
8919                   continue;
8920
8921                 case 'T': /* Coprocessor register.  */
8922                   /* +T is for disassembly only; never match.  */
8923                   break;
8924
8925                 case 't': /* Coprocessor register number.  */
8926                   if (s[0] == '$' && ISDIGIT (s[1]))
8927                     {
8928                       ++s;
8929                       regno = 0;
8930                       do
8931                         {
8932                           regno *= 10;
8933                           regno += *s - '0';
8934                           ++s;
8935                         }
8936                       while (ISDIGIT (*s));
8937                       if (regno > 31)
8938                         as_bad (_("Invalid register number (%d)"), regno);
8939                       else
8940                         {
8941                           INSERT_OPERAND (RT, *ip, regno);
8942                           continue;
8943                         }
8944                     }
8945                   else
8946                     as_bad (_("Invalid coprocessor 0 register number"));
8947                   break;
8948
8949                 default:
8950                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8951                     *args, insn->name, insn->args);
8952                   /* Further processing is fruitless.  */
8953                   return;
8954                 }
8955               break;
8956
8957             case '<':           /* must be at least one digit */
8958               /*
8959                * According to the manual, if the shift amount is greater
8960                * than 31 or less than 0, then the shift amount should be
8961                * mod 32.  In reality the mips assembler issues an error.
8962                * We issue a warning and mask out all but the low 5 bits.
8963                */
8964               my_getExpression (&imm_expr, s);
8965               check_absolute_expr (ip, &imm_expr);
8966               if ((unsigned long) imm_expr.X_add_number > 31)
8967                 as_warn (_("Improper shift amount (%lu)"),
8968                          (unsigned long) imm_expr.X_add_number);
8969               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
8970               imm_expr.X_op = O_absent;
8971               s = expr_end;
8972               continue;
8973
8974             case '>':           /* shift amount minus 32 */
8975               my_getExpression (&imm_expr, s);
8976               check_absolute_expr (ip, &imm_expr);
8977               if ((unsigned long) imm_expr.X_add_number < 32
8978                   || (unsigned long) imm_expr.X_add_number > 63)
8979                 break;
8980               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
8981               imm_expr.X_op = O_absent;
8982               s = expr_end;
8983               continue;
8984
8985             case 'k':           /* cache code */
8986             case 'h':           /* prefx code */
8987               my_getExpression (&imm_expr, s);
8988               check_absolute_expr (ip, &imm_expr);
8989               if ((unsigned long) imm_expr.X_add_number > 31)
8990                 as_warn (_("Invalid value for `%s' (%lu)"),
8991                          ip->insn_mo->name,
8992                          (unsigned long) imm_expr.X_add_number);
8993               if (*args == 'k')
8994                 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
8995               else
8996                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
8997               imm_expr.X_op = O_absent;
8998               s = expr_end;
8999               continue;
9000
9001             case 'c':           /* break code */
9002               my_getExpression (&imm_expr, s);
9003               check_absolute_expr (ip, &imm_expr);
9004               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9005                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9006                          ip->insn_mo->name,
9007                          (unsigned long) imm_expr.X_add_number);
9008               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9009               imm_expr.X_op = O_absent;
9010               s = expr_end;
9011               continue;
9012
9013             case 'q':           /* lower break code */
9014               my_getExpression (&imm_expr, s);
9015               check_absolute_expr (ip, &imm_expr);
9016               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9017                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9018                          ip->insn_mo->name,
9019                          (unsigned long) imm_expr.X_add_number);
9020               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9021               imm_expr.X_op = O_absent;
9022               s = expr_end;
9023               continue;
9024
9025             case 'B':           /* 20-bit syscall/break code.  */
9026               my_getExpression (&imm_expr, s);
9027               check_absolute_expr (ip, &imm_expr);
9028               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9029                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9030                          ip->insn_mo->name,
9031                          (unsigned long) imm_expr.X_add_number);
9032               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9033               imm_expr.X_op = O_absent;
9034               s = expr_end;
9035               continue;
9036
9037             case 'C':           /* Coprocessor code */
9038               my_getExpression (&imm_expr, s);
9039               check_absolute_expr (ip, &imm_expr);
9040               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9041                 {
9042                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9043                            (unsigned long) imm_expr.X_add_number);
9044                   imm_expr.X_add_number &= OP_MASK_COPZ;
9045                 }
9046               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9047               imm_expr.X_op = O_absent;
9048               s = expr_end;
9049               continue;
9050
9051             case 'J':           /* 19-bit wait code.  */
9052               my_getExpression (&imm_expr, s);
9053               check_absolute_expr (ip, &imm_expr);
9054               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9055                 {
9056                   as_warn (_("Illegal 19-bit code (%lu)"),
9057                            (unsigned long) imm_expr.X_add_number);
9058                   imm_expr.X_add_number &= OP_MASK_CODE19;
9059                 }
9060               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9061               imm_expr.X_op = O_absent;
9062               s = expr_end;
9063               continue;
9064
9065             case 'P':           /* Performance register.  */
9066               my_getExpression (&imm_expr, s);
9067               check_absolute_expr (ip, &imm_expr);
9068               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9069                 as_warn (_("Invalid performance register (%lu)"),
9070                          (unsigned long) imm_expr.X_add_number);
9071               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9072               imm_expr.X_op = O_absent;
9073               s = expr_end;
9074               continue;
9075
9076             case 'G':           /* Coprocessor destination register.  */
9077               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9078                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9079               else
9080                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9081               INSERT_OPERAND (RD, *ip, regno);
9082               if (ok) 
9083                 {
9084                   lastregno = regno;
9085                   continue;
9086                 }
9087               else
9088                 break;
9089
9090             case 'b':           /* base register */
9091             case 'd':           /* destination register */
9092             case 's':           /* source register */
9093             case 't':           /* target register */
9094             case 'r':           /* both target and source */
9095             case 'v':           /* both dest and source */
9096             case 'w':           /* both dest and target */
9097             case 'E':           /* coprocessor target register */
9098             case 'K':           /* 'rdhwr' destination register */
9099             case 'x':           /* ignore register name */
9100             case 'z':           /* must be zero register */
9101             case 'U':           /* destination register (clo/clz).  */
9102             case 'g':           /* coprocessor destination register */
9103               s_reset = s;            
9104               if (*args == 'E' || *args == 'K')
9105                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9106               else
9107                 {
9108                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9109                   if (regno == AT && mips_opts.at)
9110                     {
9111                       if (mips_opts.at == ATREG)
9112                         as_warn (_("used $at without \".set noat\""));
9113                       else
9114                         as_warn (_("used $%u with \".set at=$%u\""),
9115                                  regno, mips_opts.at);
9116                     }
9117                 }
9118               if (ok)
9119                 {
9120                   c = *args;
9121                   if (*s == ' ')
9122                     ++s;
9123                   if (args[1] != *s)
9124                     {
9125                       if (c == 'r' || c == 'v' || c == 'w')
9126                         {
9127                           regno = lastregno;
9128                           s = s_reset;
9129                           ++args;
9130                         }
9131                     }
9132                   /* 'z' only matches $0.  */
9133                   if (c == 'z' && regno != 0)
9134                     break;
9135
9136         /* Now that we have assembled one operand, we use the args string
9137          * to figure out where it goes in the instruction.  */
9138                   switch (c)
9139                     {
9140                     case 'r':
9141                     case 's':
9142                     case 'v':
9143                     case 'b':
9144                       INSERT_OPERAND (RS, *ip, regno);
9145                       break;
9146                     case 'd':
9147                     case 'G':
9148                     case 'K':
9149                     case 'g':
9150                       INSERT_OPERAND (RD, *ip, regno);
9151                       break;
9152                     case 'U':
9153                       INSERT_OPERAND (RD, *ip, regno);
9154                       INSERT_OPERAND (RT, *ip, regno);
9155                       break;
9156                     case 'w':
9157                     case 't':
9158                     case 'E':
9159                       INSERT_OPERAND (RT, *ip, regno);
9160                       break;
9161                     case 'x':
9162                       /* This case exists because on the r3000 trunc
9163                          expands into a macro which requires a gp
9164                          register.  On the r6000 or r4000 it is
9165                          assembled into a single instruction which
9166                          ignores the register.  Thus the insn version
9167                          is MIPS_ISA2 and uses 'x', and the macro
9168                          version is MIPS_ISA1 and uses 't'.  */
9169                       break;
9170                     case 'z':
9171                       /* This case is for the div instruction, which
9172                          acts differently if the destination argument
9173                          is $0.  This only matches $0, and is checked
9174                          outside the switch.  */
9175                       break;
9176                     case 'D':
9177                       /* Itbl operand; not yet implemented. FIXME ?? */
9178                       break;
9179                       /* What about all other operands like 'i', which
9180                          can be specified in the opcode table? */
9181                     }
9182                   lastregno = regno;
9183                   continue;
9184                 }
9185               switch (*args++)
9186                 {
9187                 case 'r':
9188                 case 'v':
9189                   INSERT_OPERAND (RS, *ip, lastregno);
9190                   continue;
9191                 case 'w':
9192                   INSERT_OPERAND (RT, *ip, lastregno);
9193                   continue;
9194                 }
9195               break;
9196
9197             case 'O':           /* MDMX alignment immediate constant.  */
9198               my_getExpression (&imm_expr, s);
9199               check_absolute_expr (ip, &imm_expr);
9200               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9201                 as_warn ("Improper align amount (%ld), using low bits",
9202                          (long) imm_expr.X_add_number);
9203               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9204               imm_expr.X_op = O_absent;
9205               s = expr_end;
9206               continue;
9207
9208             case 'Q':           /* MDMX vector, element sel, or const.  */
9209               if (s[0] != '$')
9210                 {
9211                   /* MDMX Immediate.  */
9212                   my_getExpression (&imm_expr, s);
9213                   check_absolute_expr (ip, &imm_expr);
9214                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9215                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9216                              (long) imm_expr.X_add_number);
9217                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9218                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9219                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9220                   else
9221                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9222                   imm_expr.X_op = O_absent;
9223                   s = expr_end;
9224                   continue;
9225                 }
9226               /* Not MDMX Immediate.  Fall through.  */
9227             case 'X':           /* MDMX destination register.  */
9228             case 'Y':           /* MDMX source register.  */
9229             case 'Z':           /* MDMX target register.  */
9230               is_mdmx = 1;
9231             case 'D':           /* floating point destination register */
9232             case 'S':           /* floating point source register */
9233             case 'T':           /* floating point target register */
9234             case 'R':           /* floating point source register */
9235             case 'V':
9236             case 'W':
9237               rtype = RTYPE_FPU;
9238               if (is_mdmx
9239                   || (mips_opts.ase_mdmx
9240                       && (ip->insn_mo->pinfo & FP_D)
9241                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9242                                                 | INSN_COPROC_MEMORY_DELAY
9243                                                 | INSN_LOAD_COPROC_DELAY
9244                                                 | INSN_LOAD_MEMORY_DELAY
9245                                                 | INSN_STORE_MEMORY))))
9246                 rtype |= RTYPE_VEC;
9247               s_reset = s;
9248               if (reg_lookup (&s, rtype, &regno))
9249                 {
9250                   if ((regno & 1) != 0
9251                       && HAVE_32BIT_FPRS
9252                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9253                     as_warn (_("Float register should be even, was %d"),
9254                              regno);
9255
9256                   c = *args;
9257                   if (*s == ' ')
9258                     ++s;
9259                   if (args[1] != *s)
9260                     {
9261                       if (c == 'V' || c == 'W')
9262                         {
9263                           regno = lastregno;
9264                           s = s_reset;
9265                           ++args;
9266                         }
9267                     }
9268                   switch (c)
9269                     {
9270                     case 'D':
9271                     case 'X':
9272                       INSERT_OPERAND (FD, *ip, regno);
9273                       break;
9274                     case 'V':
9275                     case 'S':
9276                     case 'Y':
9277                       INSERT_OPERAND (FS, *ip, regno);
9278                       break;
9279                     case 'Q':
9280                       /* This is like 'Z', but also needs to fix the MDMX
9281                          vector/scalar select bits.  Note that the
9282                          scalar immediate case is handled above.  */
9283                       if (*s == '[')
9284                         {
9285                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9286                           int max_el = (is_qh ? 3 : 7);
9287                           s++;
9288                           my_getExpression(&imm_expr, s);
9289                           check_absolute_expr (ip, &imm_expr);
9290                           s = expr_end;
9291                           if (imm_expr.X_add_number > max_el)
9292                             as_bad(_("Bad element selector %ld"),
9293                                    (long) imm_expr.X_add_number);
9294                           imm_expr.X_add_number &= max_el;
9295                           ip->insn_opcode |= (imm_expr.X_add_number
9296                                               << (OP_SH_VSEL +
9297                                                   (is_qh ? 2 : 1)));
9298                           imm_expr.X_op = O_absent;
9299                           if (*s != ']')
9300                             as_warn(_("Expecting ']' found '%s'"), s);
9301                           else
9302                             s++;
9303                         }
9304                       else
9305                         {
9306                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9307                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9308                                                 << OP_SH_VSEL);
9309                           else
9310                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9311                                                 OP_SH_VSEL);
9312                         }
9313                       /* Fall through */
9314                     case 'W':
9315                     case 'T':
9316                     case 'Z':
9317                       INSERT_OPERAND (FT, *ip, regno);
9318                       break;
9319                     case 'R':
9320                       INSERT_OPERAND (FR, *ip, regno);
9321                       break;
9322                     }
9323                   lastregno = regno;
9324                   continue;
9325                 }
9326
9327               switch (*args++)
9328                 {
9329                 case 'V':
9330                   INSERT_OPERAND (FS, *ip, lastregno);
9331                   continue;
9332                 case 'W':
9333                   INSERT_OPERAND (FT, *ip, lastregno);
9334                   continue;
9335                 }
9336               break;
9337
9338             case 'I':
9339               my_getExpression (&imm_expr, s);
9340               if (imm_expr.X_op != O_big
9341                   && imm_expr.X_op != O_constant)
9342                 insn_error = _("absolute expression required");
9343               if (HAVE_32BIT_GPRS)
9344                 normalize_constant_expr (&imm_expr);
9345               s = expr_end;
9346               continue;
9347
9348             case 'A':
9349               my_getExpression (&offset_expr, s);
9350               normalize_address_expr (&offset_expr);
9351               *imm_reloc = BFD_RELOC_32;
9352               s = expr_end;
9353               continue;
9354
9355             case 'F':
9356             case 'L':
9357             case 'f':
9358             case 'l':
9359               {
9360                 int f64;
9361                 int using_gprs;
9362                 char *save_in;
9363                 char *err;
9364                 unsigned char temp[8];
9365                 int len;
9366                 unsigned int length;
9367                 segT seg;
9368                 subsegT subseg;
9369                 char *p;
9370
9371                 /* These only appear as the last operand in an
9372                    instruction, and every instruction that accepts
9373                    them in any variant accepts them in all variants.
9374                    This means we don't have to worry about backing out
9375                    any changes if the instruction does not match.
9376
9377                    The difference between them is the size of the
9378                    floating point constant and where it goes.  For 'F'
9379                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9380                    is 32 bits.  Where the constant is placed is based
9381                    on how the MIPS assembler does things:
9382                     F -- .rdata
9383                     L -- .lit8
9384                     f -- immediate value
9385                     l -- .lit4
9386
9387                     The .lit4 and .lit8 sections are only used if
9388                     permitted by the -G argument.
9389
9390                     The code below needs to know whether the target register
9391                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9392                     'F' are used with GPR-based instructions and 'l' and
9393                     'L' are used with FPR-based instructions.  */
9394
9395                 f64 = *args == 'F' || *args == 'L';
9396                 using_gprs = *args == 'F' || *args == 'f';
9397
9398                 save_in = input_line_pointer;
9399                 input_line_pointer = s;
9400                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9401                 length = len;
9402                 s = input_line_pointer;
9403                 input_line_pointer = save_in;
9404                 if (err != NULL && *err != '\0')
9405                   {
9406                     as_bad (_("Bad floating point constant: %s"), err);
9407                     memset (temp, '\0', sizeof temp);
9408                     length = f64 ? 8 : 4;
9409                   }
9410
9411                 assert (length == (unsigned) (f64 ? 8 : 4));
9412
9413                 if (*args == 'f'
9414                     || (*args == 'l'
9415                         && (g_switch_value < 4
9416                             || (temp[0] == 0 && temp[1] == 0)
9417                             || (temp[2] == 0 && temp[3] == 0))))
9418                   {
9419                     imm_expr.X_op = O_constant;
9420                     if (! target_big_endian)
9421                       imm_expr.X_add_number = bfd_getl32 (temp);
9422                     else
9423                       imm_expr.X_add_number = bfd_getb32 (temp);
9424                   }
9425                 else if (length > 4
9426                          && ! mips_disable_float_construction
9427                          /* Constants can only be constructed in GPRs and
9428                             copied to FPRs if the GPRs are at least as wide
9429                             as the FPRs.  Force the constant into memory if
9430                             we are using 64-bit FPRs but the GPRs are only
9431                             32 bits wide.  */
9432                          && (using_gprs
9433                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9434                          && ((temp[0] == 0 && temp[1] == 0)
9435                              || (temp[2] == 0 && temp[3] == 0))
9436                          && ((temp[4] == 0 && temp[5] == 0)
9437                              || (temp[6] == 0 && temp[7] == 0)))
9438                   {
9439                     /* The value is simple enough to load with a couple of
9440                        instructions.  If using 32-bit registers, set
9441                        imm_expr to the high order 32 bits and offset_expr to
9442                        the low order 32 bits.  Otherwise, set imm_expr to
9443                        the entire 64 bit constant.  */
9444                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9445                       {
9446                         imm_expr.X_op = O_constant;
9447                         offset_expr.X_op = O_constant;
9448                         if (! target_big_endian)
9449                           {
9450                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9451                             offset_expr.X_add_number = bfd_getl32 (temp);
9452                           }
9453                         else
9454                           {
9455                             imm_expr.X_add_number = bfd_getb32 (temp);
9456                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9457                           }
9458                         if (offset_expr.X_add_number == 0)
9459                           offset_expr.X_op = O_absent;
9460                       }
9461                     else if (sizeof (imm_expr.X_add_number) > 4)
9462                       {
9463                         imm_expr.X_op = O_constant;
9464                         if (! target_big_endian)
9465                           imm_expr.X_add_number = bfd_getl64 (temp);
9466                         else
9467                           imm_expr.X_add_number = bfd_getb64 (temp);
9468                       }
9469                     else
9470                       {
9471                         imm_expr.X_op = O_big;
9472                         imm_expr.X_add_number = 4;
9473                         if (! target_big_endian)
9474                           {
9475                             generic_bignum[0] = bfd_getl16 (temp);
9476                             generic_bignum[1] = bfd_getl16 (temp + 2);
9477                             generic_bignum[2] = bfd_getl16 (temp + 4);
9478                             generic_bignum[3] = bfd_getl16 (temp + 6);
9479                           }
9480                         else
9481                           {
9482                             generic_bignum[0] = bfd_getb16 (temp + 6);
9483                             generic_bignum[1] = bfd_getb16 (temp + 4);
9484                             generic_bignum[2] = bfd_getb16 (temp + 2);
9485                             generic_bignum[3] = bfd_getb16 (temp);
9486                           }
9487                       }
9488                   }
9489                 else
9490                   {
9491                     const char *newname;
9492                     segT new_seg;
9493
9494                     /* Switch to the right section.  */
9495                     seg = now_seg;
9496                     subseg = now_subseg;
9497                     switch (*args)
9498                       {
9499                       default: /* unused default case avoids warnings.  */
9500                       case 'L':
9501                         newname = RDATA_SECTION_NAME;
9502                         if (g_switch_value >= 8)
9503                           newname = ".lit8";
9504                         break;
9505                       case 'F':
9506                         newname = RDATA_SECTION_NAME;
9507                         break;
9508                       case 'l':
9509                         assert (g_switch_value >= 4);
9510                         newname = ".lit4";
9511                         break;
9512                       }
9513                     new_seg = subseg_new (newname, (subsegT) 0);
9514                     if (IS_ELF)
9515                       bfd_set_section_flags (stdoutput, new_seg,
9516                                              (SEC_ALLOC
9517                                               | SEC_LOAD
9518                                               | SEC_READONLY
9519                                               | SEC_DATA));
9520                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9521                     if (IS_ELF && strcmp (TARGET_OS, "elf") != 0)
9522                       record_alignment (new_seg, 4);
9523                     else
9524                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9525                     if (seg == now_seg)
9526                       as_bad (_("Can't use floating point insn in this section"));
9527
9528                     /* Set the argument to the current address in the
9529                        section.  */
9530                     offset_expr.X_op = O_symbol;
9531                     offset_expr.X_add_symbol =
9532                       symbol_new ("L0\001", now_seg,
9533                                   (valueT) frag_now_fix (), frag_now);
9534                     offset_expr.X_add_number = 0;
9535
9536                     /* Put the floating point number into the section.  */
9537                     p = frag_more ((int) length);
9538                     memcpy (p, temp, length);
9539
9540                     /* Switch back to the original section.  */
9541                     subseg_set (seg, subseg);
9542                   }
9543               }
9544               continue;
9545
9546             case 'i':           /* 16 bit unsigned immediate */
9547             case 'j':           /* 16 bit signed immediate */
9548               *imm_reloc = BFD_RELOC_LO16;
9549               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9550                 {
9551                   int more;
9552                   offsetT minval, maxval;
9553
9554                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9555                           && strcmp (insn->name, insn[1].name) == 0);
9556
9557                   /* If the expression was written as an unsigned number,
9558                      only treat it as signed if there are no more
9559                      alternatives.  */
9560                   if (more
9561                       && *args == 'j'
9562                       && sizeof (imm_expr.X_add_number) <= 4
9563                       && imm_expr.X_op == O_constant
9564                       && imm_expr.X_add_number < 0
9565                       && imm_expr.X_unsigned
9566                       && HAVE_64BIT_GPRS)
9567                     break;
9568
9569                   /* For compatibility with older assemblers, we accept
9570                      0x8000-0xffff as signed 16-bit numbers when only
9571                      signed numbers are allowed.  */
9572                   if (*args == 'i')
9573                     minval = 0, maxval = 0xffff;
9574                   else if (more)
9575                     minval = -0x8000, maxval = 0x7fff;
9576                   else
9577                     minval = -0x8000, maxval = 0xffff;
9578
9579                   if (imm_expr.X_op != O_constant
9580                       || imm_expr.X_add_number < minval
9581                       || imm_expr.X_add_number > maxval)
9582                     {
9583                       if (more)
9584                         break;
9585                       if (imm_expr.X_op == O_constant
9586                           || imm_expr.X_op == O_big)
9587                         as_bad (_("expression out of range"));
9588                     }
9589                 }
9590               s = expr_end;
9591               continue;
9592
9593             case 'o':           /* 16 bit offset */
9594               /* Check whether there is only a single bracketed expression
9595                  left.  If so, it must be the base register and the
9596                  constant must be zero.  */
9597               if (*s == '(' && strchr (s + 1, '(') == 0)
9598                 {
9599                   offset_expr.X_op = O_constant;
9600                   offset_expr.X_add_number = 0;
9601                   continue;
9602                 }
9603
9604               /* If this value won't fit into a 16 bit offset, then go
9605                  find a macro that will generate the 32 bit offset
9606                  code pattern.  */
9607               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9608                   && (offset_expr.X_op != O_constant
9609                       || offset_expr.X_add_number >= 0x8000
9610                       || offset_expr.X_add_number < -0x8000))
9611                 break;
9612
9613               s = expr_end;
9614               continue;
9615
9616             case 'p':           /* pc relative offset */
9617               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9618               my_getExpression (&offset_expr, s);
9619               s = expr_end;
9620               continue;
9621
9622             case 'u':           /* upper 16 bits */
9623               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9624                   && imm_expr.X_op == O_constant
9625                   && (imm_expr.X_add_number < 0
9626                       || imm_expr.X_add_number >= 0x10000))
9627                 as_bad (_("lui expression not in range 0..65535"));
9628               s = expr_end;
9629               continue;
9630
9631             case 'a':           /* 26 bit address */
9632               my_getExpression (&offset_expr, s);
9633               s = expr_end;
9634               *offset_reloc = BFD_RELOC_MIPS_JMP;
9635               continue;
9636
9637             case 'N':           /* 3 bit branch condition code */
9638             case 'M':           /* 3 bit compare condition code */
9639               rtype = RTYPE_CCC;
9640               if (ip->insn_mo->pinfo & (FP_D| FP_S))
9641                 rtype |= RTYPE_FCC;
9642               if (!reg_lookup (&s, rtype, &regno))
9643                 break;
9644               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
9645                    || strcmp(str + strlen(str) - 5, "any2f") == 0
9646                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
9647                   && (regno & 1) != 0)
9648                 as_warn(_("Condition code register should be even for %s, was %d"),
9649                         str, regno);
9650               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
9651                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
9652                   && (regno & 3) != 0)
9653                 as_warn(_("Condition code register should be 0 or 4 for %s, was %d"),
9654                         str, regno);
9655               if (*args == 'N')
9656                 INSERT_OPERAND (BCC, *ip, regno);
9657               else
9658                 INSERT_OPERAND (CCC, *ip, regno);
9659               continue;
9660
9661             case 'H':
9662               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
9663                 s += 2;
9664               if (ISDIGIT (*s))
9665                 {
9666                   c = 0;
9667                   do
9668                     {
9669                       c *= 10;
9670                       c += *s - '0';
9671                       ++s;
9672                     }
9673                   while (ISDIGIT (*s));
9674                 }
9675               else
9676                 c = 8; /* Invalid sel value.  */
9677
9678               if (c > 7)
9679                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
9680               ip->insn_opcode |= c;
9681               continue;
9682
9683             case 'e':
9684               /* Must be at least one digit.  */
9685               my_getExpression (&imm_expr, s);
9686               check_absolute_expr (ip, &imm_expr);
9687
9688               if ((unsigned long) imm_expr.X_add_number
9689                   > (unsigned long) OP_MASK_VECBYTE)
9690                 {
9691                   as_bad (_("bad byte vector index (%ld)"),
9692                            (long) imm_expr.X_add_number);
9693                   imm_expr.X_add_number = 0;
9694                 }
9695
9696               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
9697               imm_expr.X_op = O_absent;
9698               s = expr_end;
9699               continue;
9700
9701             case '%':
9702               my_getExpression (&imm_expr, s);
9703               check_absolute_expr (ip, &imm_expr);
9704
9705               if ((unsigned long) imm_expr.X_add_number
9706                   > (unsigned long) OP_MASK_VECALIGN)
9707                 {
9708                   as_bad (_("bad byte vector index (%ld)"),
9709                            (long) imm_expr.X_add_number);
9710                   imm_expr.X_add_number = 0;
9711                 }
9712
9713               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
9714               imm_expr.X_op = O_absent;
9715               s = expr_end;
9716               continue;
9717
9718             default:
9719               as_bad (_("bad char = '%c'\n"), *args);
9720               internalError ();
9721             }
9722           break;
9723         }
9724       /* Args don't match.  */
9725       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
9726           !strcmp (insn->name, insn[1].name))
9727         {
9728           ++insn;
9729           s = argsStart;
9730           insn_error = _("illegal operands");
9731           continue;
9732         }
9733       if (save_c)
9734         *(--s) = save_c;
9735       insn_error = _("illegal operands");
9736       return;
9737     }
9738 }
9739
9740 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
9741
9742 /* This routine assembles an instruction into its binary format when
9743    assembling for the mips16.  As a side effect, it sets one of the
9744    global variables imm_reloc or offset_reloc to the type of
9745    relocation to do if one of the operands is an address expression.
9746    It also sets mips16_small and mips16_ext if the user explicitly
9747    requested a small or extended instruction.  */
9748
9749 static void
9750 mips16_ip (char *str, struct mips_cl_insn *ip)
9751 {
9752   char *s;
9753   const char *args;
9754   struct mips_opcode *insn;
9755   char *argsstart;
9756   unsigned int regno;
9757   unsigned int lastregno = 0;
9758   char *s_reset;
9759   size_t i;
9760
9761   insn_error = NULL;
9762
9763   mips16_small = FALSE;
9764   mips16_ext = FALSE;
9765
9766   for (s = str; ISLOWER (*s); ++s)
9767     ;
9768   switch (*s)
9769     {
9770     case '\0':
9771       break;
9772
9773     case ' ':
9774       *s++ = '\0';
9775       break;
9776
9777     case '.':
9778       if (s[1] == 't' && s[2] == ' ')
9779         {
9780           *s = '\0';
9781           mips16_small = TRUE;
9782           s += 3;
9783           break;
9784         }
9785       else if (s[1] == 'e' && s[2] == ' ')
9786         {
9787           *s = '\0';
9788           mips16_ext = TRUE;
9789           s += 3;
9790           break;
9791         }
9792       /* Fall through.  */
9793     default:
9794       insn_error = _("unknown opcode");
9795       return;
9796     }
9797
9798   if (mips_opts.noautoextend && ! mips16_ext)
9799     mips16_small = TRUE;
9800
9801   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
9802     {
9803       insn_error = _("unrecognized opcode");
9804       return;
9805     }
9806
9807   argsstart = s;
9808   for (;;)
9809     {
9810       bfd_boolean ok;
9811
9812       assert (strcmp (insn->name, str) == 0);
9813
9814       if (OPCODE_IS_MEMBER (insn, mips_opts.isa, mips_opts.arch))
9815         ok = TRUE;
9816       else
9817         ok = FALSE;
9818
9819       if (! ok)
9820         {
9821           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
9822               && strcmp (insn->name, insn[1].name) == 0)
9823             {
9824               ++insn;
9825               continue;
9826             }
9827           else
9828             {
9829               if (!insn_error)
9830                 {
9831                   static char buf[100];
9832                   sprintf (buf,
9833                            _("opcode not supported on this processor: %s (%s)"),
9834                            mips_cpu_info_from_arch (mips_opts.arch)->name,
9835                            mips_cpu_info_from_isa (mips_opts.isa)->name);
9836                   insn_error = buf;
9837                 }
9838               return;
9839             }
9840         }
9841
9842       create_insn (ip, insn);
9843       imm_expr.X_op = O_absent;
9844       imm_reloc[0] = BFD_RELOC_UNUSED;
9845       imm_reloc[1] = BFD_RELOC_UNUSED;
9846       imm_reloc[2] = BFD_RELOC_UNUSED;
9847       imm2_expr.X_op = O_absent;
9848       offset_expr.X_op = O_absent;
9849       offset_reloc[0] = BFD_RELOC_UNUSED;
9850       offset_reloc[1] = BFD_RELOC_UNUSED;
9851       offset_reloc[2] = BFD_RELOC_UNUSED;
9852       for (args = insn->args; 1; ++args)
9853         {
9854           int c;
9855
9856           if (*s == ' ')
9857             ++s;
9858
9859           /* In this switch statement we call break if we did not find
9860              a match, continue if we did find a match, or return if we
9861              are done.  */
9862
9863           c = *args;
9864           switch (c)
9865             {
9866             case '\0':
9867               if (*s == '\0')
9868                 {
9869                   /* Stuff the immediate value in now, if we can.  */
9870                   if (imm_expr.X_op == O_constant
9871                       && *imm_reloc > BFD_RELOC_UNUSED
9872                       && insn->pinfo != INSN_MACRO)
9873                     {
9874                       valueT tmp;
9875
9876                       switch (*offset_reloc)
9877                         {
9878                           case BFD_RELOC_MIPS16_HI16_S:
9879                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
9880                             break;
9881
9882                           case BFD_RELOC_MIPS16_HI16:
9883                             tmp = imm_expr.X_add_number >> 16;
9884                             break;
9885
9886                           case BFD_RELOC_MIPS16_LO16:
9887                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
9888                                   - 0x8000;
9889                             break;
9890
9891                           case BFD_RELOC_UNUSED:
9892                             tmp = imm_expr.X_add_number;
9893                             break;
9894
9895                           default:
9896                             internalError ();
9897                         }
9898                       *offset_reloc = BFD_RELOC_UNUSED;
9899
9900                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
9901                                     tmp, TRUE, mips16_small,
9902                                     mips16_ext, &ip->insn_opcode,
9903                                     &ip->use_extend, &ip->extend);
9904                       imm_expr.X_op = O_absent;
9905                       *imm_reloc = BFD_RELOC_UNUSED;
9906                     }
9907
9908                   return;
9909                 }
9910               break;
9911
9912             case ',':
9913               if (*s++ == c)
9914                 continue;
9915               s--;
9916               switch (*++args)
9917                 {
9918                 case 'v':
9919                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9920                   continue;
9921                 case 'w':
9922                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9923                   continue;
9924                 }
9925               break;
9926
9927             case '(':
9928             case ')':
9929               if (*s++ == c)
9930                 continue;
9931               break;
9932
9933             case 'v':
9934             case 'w':
9935               if (s[0] != '$')
9936                 {
9937                   if (c == 'v')
9938                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9939                   else
9940                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9941                   ++args;
9942                   continue;
9943                 }
9944               /* Fall through.  */
9945             case 'x':
9946             case 'y':
9947             case 'z':
9948             case 'Z':
9949             case '0':
9950             case 'S':
9951             case 'R':
9952             case 'X':
9953             case 'Y':
9954               s_reset = s;
9955               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9956                 {
9957                   if (c == 'v' || c == 'w')
9958                     {
9959                       if (c == 'v')
9960                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
9961                       else
9962                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
9963                       ++args;
9964                       continue;
9965                     }
9966                   break;
9967                 }
9968
9969               if (*s == ' ')
9970                 ++s;
9971               if (args[1] != *s)
9972                 {
9973                   if (c == 'v' || c == 'w')
9974                     {
9975                       regno = mips16_to_32_reg_map[lastregno];
9976                       s = s_reset;
9977                       ++args;
9978                     }
9979                 }
9980
9981               switch (c)
9982                 {
9983                 case 'x':
9984                 case 'y':
9985                 case 'z':
9986                 case 'v':
9987                 case 'w':
9988                 case 'Z':
9989                   regno = mips32_to_16_reg_map[regno];
9990                   break;
9991
9992                 case '0':
9993                   if (regno != 0)
9994                     regno = ILLEGAL_REG;
9995                   break;
9996
9997                 case 'S':
9998                   if (regno != SP)
9999                     regno = ILLEGAL_REG;
10000                   break;
10001
10002                 case 'R':
10003                   if (regno != RA)
10004                     regno = ILLEGAL_REG;
10005                   break;
10006
10007                 case 'X':
10008                 case 'Y':
10009                   if (regno == AT && mips_opts.at)
10010                     {
10011                       if (mips_opts.at == ATREG)
10012                         as_warn (_("used $at without \".set noat\""));
10013                       else
10014                         as_warn (_("used $%u with \".set at=$%u\""),
10015                                  regno, mips_opts.at);
10016                     }
10017                   break;
10018
10019                 default:
10020                   internalError ();
10021                 }
10022
10023               if (regno == ILLEGAL_REG)
10024                 break;
10025
10026               switch (c)
10027                 {
10028                 case 'x':
10029                 case 'v':
10030                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10031                   break;
10032                 case 'y':
10033                 case 'w':
10034                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10035                   break;
10036                 case 'z':
10037                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10038                   break;
10039                 case 'Z':
10040                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10041                 case '0':
10042                 case 'S':
10043                 case 'R':
10044                   break;
10045                 case 'X':
10046                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10047                   break;
10048                 case 'Y':
10049                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10050                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10051                   break;
10052                 default:
10053                   internalError ();
10054                 }
10055
10056               lastregno = regno;
10057               continue;
10058
10059             case 'P':
10060               if (strncmp (s, "$pc", 3) == 0)
10061                 {
10062                   s += 3;
10063                   continue;
10064                 }
10065               break;
10066
10067             case '5':
10068             case 'H':
10069             case 'W':
10070             case 'D':
10071             case 'j':
10072             case 'V':
10073             case 'C':
10074             case 'U':
10075             case 'k':
10076             case 'K':
10077               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10078               if (i > 0)
10079                 {
10080                   if (imm_expr.X_op != O_constant)
10081                     {
10082                       mips16_ext = TRUE;
10083                       ip->use_extend = TRUE;
10084                       ip->extend = 0;
10085                     }
10086                   else
10087                     {
10088                       /* We need to relax this instruction.  */
10089                       *offset_reloc = *imm_reloc;
10090                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10091                     }
10092                   s = expr_end;
10093                   continue;
10094                 }
10095               *imm_reloc = BFD_RELOC_UNUSED;
10096               /* Fall through.  */
10097             case '<':
10098             case '>':
10099             case '[':
10100             case ']':
10101             case '4':
10102             case '8':
10103               my_getExpression (&imm_expr, s);
10104               if (imm_expr.X_op == O_register)
10105                 {
10106                   /* What we thought was an expression turned out to
10107                      be a register.  */
10108
10109                   if (s[0] == '(' && args[1] == '(')
10110                     {
10111                       /* It looks like the expression was omitted
10112                          before a register indirection, which means
10113                          that the expression is implicitly zero.  We
10114                          still set up imm_expr, so that we handle
10115                          explicit extensions correctly.  */
10116                       imm_expr.X_op = O_constant;
10117                       imm_expr.X_add_number = 0;
10118                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10119                       continue;
10120                     }
10121
10122                   break;
10123                 }
10124
10125               /* We need to relax this instruction.  */
10126               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10127               s = expr_end;
10128               continue;
10129
10130             case 'p':
10131             case 'q':
10132             case 'A':
10133             case 'B':
10134             case 'E':
10135               /* We use offset_reloc rather than imm_reloc for the PC
10136                  relative operands.  This lets macros with both
10137                  immediate and address operands work correctly.  */
10138               my_getExpression (&offset_expr, s);
10139
10140               if (offset_expr.X_op == O_register)
10141                 break;
10142
10143               /* We need to relax this instruction.  */
10144               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10145               s = expr_end;
10146               continue;
10147
10148             case '6':           /* break code */
10149               my_getExpression (&imm_expr, s);
10150               check_absolute_expr (ip, &imm_expr);
10151               if ((unsigned long) imm_expr.X_add_number > 63)
10152                 as_warn (_("Invalid value for `%s' (%lu)"),
10153                          ip->insn_mo->name,
10154                          (unsigned long) imm_expr.X_add_number);
10155               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10156               imm_expr.X_op = O_absent;
10157               s = expr_end;
10158               continue;
10159
10160             case 'a':           /* 26 bit address */
10161               my_getExpression (&offset_expr, s);
10162               s = expr_end;
10163               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10164               ip->insn_opcode <<= 16;
10165               continue;
10166
10167             case 'l':           /* register list for entry macro */
10168             case 'L':           /* register list for exit macro */
10169               {
10170                 int mask;
10171
10172                 if (c == 'l')
10173                   mask = 0;
10174                 else
10175                   mask = 7 << 3;
10176                 while (*s != '\0')
10177                   {
10178                     unsigned int freg, reg1, reg2;
10179
10180                     while (*s == ' ' || *s == ',')
10181                       ++s;
10182                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10183                       freg = 0;
10184                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10185                       freg = 1;
10186                     else
10187                       {
10188                         as_bad (_("can't parse register list"));
10189                         break;
10190                       }
10191                     if (*s == ' ')
10192                       ++s;
10193                     if (*s != '-')
10194                       reg2 = reg1;
10195                     else
10196                       {
10197                         ++s;
10198                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10199                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10200                           {
10201                             as_bad (_("invalid register list"));
10202                             break;
10203                           }
10204                       }
10205                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10206                       {
10207                         mask &= ~ (7 << 3);
10208                         mask |= 5 << 3;
10209                       }
10210                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10211                       {
10212                         mask &= ~ (7 << 3);
10213                         mask |= 6 << 3;
10214                       }
10215                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10216                       mask |= (reg2 - 3) << 3;
10217                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10218                       mask |= (reg2 - 15) << 1;
10219                     else if (reg1 == RA && reg2 == RA)
10220                       mask |= 1;
10221                     else
10222                       {
10223                         as_bad (_("invalid register list"));
10224                         break;
10225                       }
10226                   }
10227                 /* The mask is filled in in the opcode table for the
10228                    benefit of the disassembler.  We remove it before
10229                    applying the actual mask.  */
10230                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10231                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10232               }
10233             continue;
10234
10235             case 'm':           /* Register list for save insn.  */
10236             case 'M':           /* Register list for restore insn.  */
10237               {
10238                 int opcode = 0;
10239                 int framesz = 0, seen_framesz = 0;
10240                 int args = 0, statics = 0, sregs = 0;
10241
10242                 while (*s != '\0')
10243                   {
10244                     unsigned int reg1, reg2;
10245
10246                     SKIP_SPACE_TABS (s);
10247                     while (*s == ',')
10248                       ++s;
10249                     SKIP_SPACE_TABS (s);
10250
10251                     my_getExpression (&imm_expr, s);
10252                     if (imm_expr.X_op == O_constant)
10253                       {
10254                         /* Handle the frame size.  */
10255                         if (seen_framesz)
10256                           {
10257                             as_bad (_("more than one frame size in list"));
10258                             break;
10259                           }
10260                         seen_framesz = 1;
10261                         framesz = imm_expr.X_add_number;
10262                         imm_expr.X_op = O_absent;
10263                         s = expr_end;
10264                         continue;
10265                       }
10266
10267                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10268                       {
10269                         as_bad (_("can't parse register list"));
10270                         break;
10271                       }
10272
10273                     while (*s == ' ')
10274                       ++s;
10275
10276                     if (*s != '-')
10277                       reg2 = reg1;
10278                     else
10279                       {
10280                         ++s;
10281                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10282                             || reg2 < reg1)
10283                           {
10284                             as_bad (_("can't parse register list"));
10285                             break;
10286                           }
10287                       }
10288
10289                     while (reg1 <= reg2)
10290                       {
10291                         if (reg1 >= 4 && reg1 <= 7)
10292                           {
10293                             if (!seen_framesz)
10294                                 /* args $a0-$a3 */
10295                                 args |= 1 << (reg1 - 4);
10296                             else
10297                                 /* statics $a0-$a3 */
10298                                 statics |= 1 << (reg1 - 4);
10299                           }
10300                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10301                           {
10302                             /* $s0-$s8 */
10303                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10304                           }
10305                         else if (reg1 == 31)
10306                           {
10307                             /* Add $ra to insn.  */
10308                             opcode |= 0x40;
10309                           }
10310                         else
10311                           {
10312                             as_bad (_("unexpected register in list"));
10313                             break;
10314                           }
10315                         if (++reg1 == 24)
10316                           reg1 = 30;
10317                       }
10318                   }
10319
10320                 /* Encode args/statics combination.  */
10321                 if (args & statics)
10322                   as_bad (_("arg/static registers overlap"));
10323                 else if (args == 0xf)
10324                   /* All $a0-$a3 are args.  */
10325                   opcode |= MIPS16_ALL_ARGS << 16;
10326                 else if (statics == 0xf)
10327                   /* All $a0-$a3 are statics.  */
10328                   opcode |= MIPS16_ALL_STATICS << 16;
10329                 else 
10330                   {
10331                     int narg = 0, nstat = 0;
10332
10333                     /* Count arg registers.  */
10334                     while (args & 0x1)
10335                       {
10336                         args >>= 1;
10337                         narg++;
10338                       }
10339                     if (args != 0)
10340                       as_bad (_("invalid arg register list"));
10341
10342                     /* Count static registers.  */
10343                     while (statics & 0x8)
10344                       {
10345                         statics = (statics << 1) & 0xf;
10346                         nstat++;
10347                       }
10348                     if (statics != 0) 
10349                       as_bad (_("invalid static register list"));
10350
10351                     /* Encode args/statics.  */
10352                     opcode |= ((narg << 2) | nstat) << 16;
10353                   }
10354
10355                 /* Encode $s0/$s1.  */
10356                 if (sregs & (1 << 0))           /* $s0 */
10357                   opcode |= 0x20;
10358                 if (sregs & (1 << 1))           /* $s1 */
10359                   opcode |= 0x10;
10360                 sregs >>= 2;
10361
10362                 if (sregs != 0)
10363                   {
10364                     /* Count regs $s2-$s8.  */
10365                     int nsreg = 0;
10366                     while (sregs & 1)
10367                       {
10368                         sregs >>= 1;
10369                         nsreg++;
10370                       }
10371                     if (sregs != 0)
10372                       as_bad (_("invalid static register list"));
10373                     /* Encode $s2-$s8. */
10374                     opcode |= nsreg << 24;
10375                   }
10376
10377                 /* Encode frame size.  */
10378                 if (!seen_framesz)
10379                   as_bad (_("missing frame size"));
10380                 else if ((framesz & 7) != 0 || framesz < 0
10381                          || framesz > 0xff * 8)
10382                   as_bad (_("invalid frame size"));
10383                 else if (framesz != 128 || (opcode >> 16) != 0)
10384                   {
10385                     framesz /= 8;
10386                     opcode |= (((framesz & 0xf0) << 16)
10387                              | (framesz & 0x0f));
10388                   }
10389
10390                 /* Finally build the instruction.  */
10391                 if ((opcode >> 16) != 0 || framesz == 0)
10392                   {
10393                     ip->use_extend = TRUE;
10394                     ip->extend = opcode >> 16;
10395                   }
10396                 ip->insn_opcode |= opcode & 0x7f;
10397               }
10398             continue;
10399
10400             case 'e':           /* extend code */
10401               my_getExpression (&imm_expr, s);
10402               check_absolute_expr (ip, &imm_expr);
10403               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10404                 {
10405                   as_warn (_("Invalid value for `%s' (%lu)"),
10406                            ip->insn_mo->name,
10407                            (unsigned long) imm_expr.X_add_number);
10408                   imm_expr.X_add_number &= 0x7ff;
10409                 }
10410               ip->insn_opcode |= imm_expr.X_add_number;
10411               imm_expr.X_op = O_absent;
10412               s = expr_end;
10413               continue;
10414
10415             default:
10416               internalError ();
10417             }
10418           break;
10419         }
10420
10421       /* Args don't match.  */
10422       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10423           strcmp (insn->name, insn[1].name) == 0)
10424         {
10425           ++insn;
10426           s = argsstart;
10427           continue;
10428         }
10429
10430       insn_error = _("illegal operands");
10431
10432       return;
10433     }
10434 }
10435
10436 /* This structure holds information we know about a mips16 immediate
10437    argument type.  */
10438
10439 struct mips16_immed_operand
10440 {
10441   /* The type code used in the argument string in the opcode table.  */
10442   int type;
10443   /* The number of bits in the short form of the opcode.  */
10444   int nbits;
10445   /* The number of bits in the extended form of the opcode.  */
10446   int extbits;
10447   /* The amount by which the short form is shifted when it is used;
10448      for example, the sw instruction has a shift count of 2.  */
10449   int shift;
10450   /* The amount by which the short form is shifted when it is stored
10451      into the instruction code.  */
10452   int op_shift;
10453   /* Non-zero if the short form is unsigned.  */
10454   int unsp;
10455   /* Non-zero if the extended form is unsigned.  */
10456   int extu;
10457   /* Non-zero if the value is PC relative.  */
10458   int pcrel;
10459 };
10460
10461 /* The mips16 immediate operand types.  */
10462
10463 static const struct mips16_immed_operand mips16_immed_operands[] =
10464 {
10465   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10466   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10467   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10468   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10469   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10470   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10471   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10472   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10473   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10474   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10475   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10476   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10477   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10478   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10479   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10480   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10481   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10482   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10483   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10484   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10485   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10486 };
10487
10488 #define MIPS16_NUM_IMMED \
10489   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10490
10491 /* Handle a mips16 instruction with an immediate value.  This or's the
10492    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10493    whether an extended value is needed; if one is needed, it sets
10494    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10495    If SMALL is true, an unextended opcode was explicitly requested.
10496    If EXT is true, an extended opcode was explicitly requested.  If
10497    WARN is true, warn if EXT does not match reality.  */
10498
10499 static void
10500 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10501               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10502               unsigned long *insn, bfd_boolean *use_extend,
10503               unsigned short *extend)
10504 {
10505   const struct mips16_immed_operand *op;
10506   int mintiny, maxtiny;
10507   bfd_boolean needext;
10508
10509   op = mips16_immed_operands;
10510   while (op->type != type)
10511     {
10512       ++op;
10513       assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10514     }
10515
10516   if (op->unsp)
10517     {
10518       if (type == '<' || type == '>' || type == '[' || type == ']')
10519         {
10520           mintiny = 1;
10521           maxtiny = 1 << op->nbits;
10522         }
10523       else
10524         {
10525           mintiny = 0;
10526           maxtiny = (1 << op->nbits) - 1;
10527         }
10528     }
10529   else
10530     {
10531       mintiny = - (1 << (op->nbits - 1));
10532       maxtiny = (1 << (op->nbits - 1)) - 1;
10533     }
10534
10535   /* Branch offsets have an implicit 0 in the lowest bit.  */
10536   if (type == 'p' || type == 'q')
10537     val /= 2;
10538
10539   if ((val & ((1 << op->shift) - 1)) != 0
10540       || val < (mintiny << op->shift)
10541       || val > (maxtiny << op->shift))
10542     needext = TRUE;
10543   else
10544     needext = FALSE;
10545
10546   if (warn && ext && ! needext)
10547     as_warn_where (file, line,
10548                    _("extended operand requested but not required"));
10549   if (small && needext)
10550     as_bad_where (file, line, _("invalid unextended operand value"));
10551
10552   if (small || (! ext && ! needext))
10553     {
10554       int insnval;
10555
10556       *use_extend = FALSE;
10557       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10558       insnval <<= op->op_shift;
10559       *insn |= insnval;
10560     }
10561   else
10562     {
10563       long minext, maxext;
10564       int extval;
10565
10566       if (op->extu)
10567         {
10568           minext = 0;
10569           maxext = (1 << op->extbits) - 1;
10570         }
10571       else
10572         {
10573           minext = - (1 << (op->extbits - 1));
10574           maxext = (1 << (op->extbits - 1)) - 1;
10575         }
10576       if (val < minext || val > maxext)
10577         as_bad_where (file, line,
10578                       _("operand value out of range for instruction"));
10579
10580       *use_extend = TRUE;
10581       if (op->extbits == 16)
10582         {
10583           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10584           val &= 0x1f;
10585         }
10586       else if (op->extbits == 15)
10587         {
10588           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10589           val &= 0xf;
10590         }
10591       else
10592         {
10593           extval = ((val & 0x1f) << 6) | (val & 0x20);
10594           val = 0;
10595         }
10596
10597       *extend = (unsigned short) extval;
10598       *insn |= val;
10599     }
10600 }
10601 \f
10602 struct percent_op_match
10603 {
10604   const char *str;
10605   bfd_reloc_code_real_type reloc;
10606 };
10607
10608 static const struct percent_op_match mips_percent_op[] =
10609 {
10610   {"%lo", BFD_RELOC_LO16},
10611 #ifdef OBJ_ELF
10612   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10613   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10614   {"%call16", BFD_RELOC_MIPS_CALL16},
10615   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10616   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10617   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10618   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10619   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10620   {"%got", BFD_RELOC_MIPS_GOT16},
10621   {"%gp_rel", BFD_RELOC_GPREL16},
10622   {"%half", BFD_RELOC_16},
10623   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10624   {"%higher", BFD_RELOC_MIPS_HIGHER},
10625   {"%neg", BFD_RELOC_MIPS_SUB},
10626   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10627   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10628   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10629   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10630   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10631   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10632   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10633 #endif
10634   {"%hi", BFD_RELOC_HI16_S}
10635 };
10636
10637 static const struct percent_op_match mips16_percent_op[] =
10638 {
10639   {"%lo", BFD_RELOC_MIPS16_LO16},
10640   {"%gprel", BFD_RELOC_MIPS16_GPREL},
10641   {"%hi", BFD_RELOC_MIPS16_HI16_S}
10642 };
10643
10644
10645 /* Return true if *STR points to a relocation operator.  When returning true,
10646    move *STR over the operator and store its relocation code in *RELOC.
10647    Leave both *STR and *RELOC alone when returning false.  */
10648
10649 static bfd_boolean
10650 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
10651 {
10652   const struct percent_op_match *percent_op;
10653   size_t limit, i;
10654
10655   if (mips_opts.mips16)
10656     {
10657       percent_op = mips16_percent_op;
10658       limit = ARRAY_SIZE (mips16_percent_op);
10659     }
10660   else
10661     {
10662       percent_op = mips_percent_op;
10663       limit = ARRAY_SIZE (mips_percent_op);
10664     }
10665
10666   for (i = 0; i < limit; i++)
10667     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
10668       {
10669         int len = strlen (percent_op[i].str);
10670
10671         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
10672           continue;
10673
10674         *str += strlen (percent_op[i].str);
10675         *reloc = percent_op[i].reloc;
10676
10677         /* Check whether the output BFD supports this relocation.
10678            If not, issue an error and fall back on something safe.  */
10679         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
10680           {
10681             as_bad ("relocation %s isn't supported by the current ABI",
10682                     percent_op[i].str);
10683             *reloc = BFD_RELOC_UNUSED;
10684           }
10685         return TRUE;
10686       }
10687   return FALSE;
10688 }
10689
10690
10691 /* Parse string STR as a 16-bit relocatable operand.  Store the
10692    expression in *EP and the relocations in the array starting
10693    at RELOC.  Return the number of relocation operators used.
10694
10695    On exit, EXPR_END points to the first character after the expression.  */
10696
10697 static size_t
10698 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
10699                        char *str)
10700 {
10701   bfd_reloc_code_real_type reversed_reloc[3];
10702   size_t reloc_index, i;
10703   int crux_depth, str_depth;
10704   char *crux;
10705
10706   /* Search for the start of the main expression, recoding relocations
10707      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
10708      of the main expression and with CRUX_DEPTH containing the number
10709      of open brackets at that point.  */
10710   reloc_index = -1;
10711   str_depth = 0;
10712   do
10713     {
10714       reloc_index++;
10715       crux = str;
10716       crux_depth = str_depth;
10717
10718       /* Skip over whitespace and brackets, keeping count of the number
10719          of brackets.  */
10720       while (*str == ' ' || *str == '\t' || *str == '(')
10721         if (*str++ == '(')
10722           str_depth++;
10723     }
10724   while (*str == '%'
10725          && reloc_index < (HAVE_NEWABI ? 3 : 1)
10726          && parse_relocation (&str, &reversed_reloc[reloc_index]));
10727
10728   my_getExpression (ep, crux);
10729   str = expr_end;
10730
10731   /* Match every open bracket.  */
10732   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
10733     if (*str++ == ')')
10734       crux_depth--;
10735
10736   if (crux_depth > 0)
10737     as_bad ("unclosed '('");
10738
10739   expr_end = str;
10740
10741   if (reloc_index != 0)
10742     {
10743       prev_reloc_op_frag = frag_now;
10744       for (i = 0; i < reloc_index; i++)
10745         reloc[i] = reversed_reloc[reloc_index - 1 - i];
10746     }
10747
10748   return reloc_index;
10749 }
10750
10751 static void
10752 my_getExpression (expressionS *ep, char *str)
10753 {
10754   char *save_in;
10755   valueT val;
10756
10757   save_in = input_line_pointer;
10758   input_line_pointer = str;
10759   expression (ep);
10760   expr_end = input_line_pointer;
10761   input_line_pointer = save_in;
10762
10763   /* If we are in mips16 mode, and this is an expression based on `.',
10764      then we bump the value of the symbol by 1 since that is how other
10765      text symbols are handled.  We don't bother to handle complex
10766      expressions, just `.' plus or minus a constant.  */
10767   if (mips_opts.mips16
10768       && ep->X_op == O_symbol
10769       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
10770       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
10771       && symbol_get_frag (ep->X_add_symbol) == frag_now
10772       && symbol_constant_p (ep->X_add_symbol)
10773       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
10774     S_SET_VALUE (ep->X_add_symbol, val + 1);
10775 }
10776
10777 char *
10778 md_atof (int type, char *litP, int *sizeP)
10779 {
10780   return ieee_md_atof (type, litP, sizeP, target_big_endian);
10781 }
10782
10783 void
10784 md_number_to_chars (char *buf, valueT val, int n)
10785 {
10786   if (target_big_endian)
10787     number_to_chars_bigendian (buf, val, n);
10788   else
10789     number_to_chars_littleendian (buf, val, n);
10790 }
10791 \f
10792 #ifdef OBJ_ELF
10793 static int support_64bit_objects(void)
10794 {
10795   const char **list, **l;
10796   int yes;
10797
10798   list = bfd_target_list ();
10799   for (l = list; *l != NULL; l++)
10800 #ifdef TE_TMIPS
10801     /* This is traditional mips */
10802     if (strcmp (*l, "elf64-tradbigmips") == 0
10803         || strcmp (*l, "elf64-tradlittlemips") == 0)
10804 #else
10805     if (strcmp (*l, "elf64-bigmips") == 0
10806         || strcmp (*l, "elf64-littlemips") == 0)
10807 #endif
10808       break;
10809   yes = (*l != NULL);
10810   free (list);
10811   return yes;
10812 }
10813 #endif /* OBJ_ELF */
10814
10815 const char *md_shortopts = "O::g::G:";
10816
10817 struct option md_longopts[] =
10818 {
10819   /* Options which specify architecture.  */
10820 #define OPTION_ARCH_BASE    (OPTION_MD_BASE)
10821 #define OPTION_MARCH (OPTION_ARCH_BASE + 0)
10822   {"march", required_argument, NULL, OPTION_MARCH},
10823 #define OPTION_MTUNE (OPTION_ARCH_BASE + 1)
10824   {"mtune", required_argument, NULL, OPTION_MTUNE},
10825 #define OPTION_MIPS1 (OPTION_ARCH_BASE + 2)
10826   {"mips0", no_argument, NULL, OPTION_MIPS1},
10827   {"mips1", no_argument, NULL, OPTION_MIPS1},
10828 #define OPTION_MIPS2 (OPTION_ARCH_BASE + 3)
10829   {"mips2", no_argument, NULL, OPTION_MIPS2},
10830 #define OPTION_MIPS3 (OPTION_ARCH_BASE + 4)
10831   {"mips3", no_argument, NULL, OPTION_MIPS3},
10832 #define OPTION_MIPS4 (OPTION_ARCH_BASE + 5)
10833   {"mips4", no_argument, NULL, OPTION_MIPS4},
10834 #define OPTION_MIPS5 (OPTION_ARCH_BASE + 6)
10835   {"mips5", no_argument, NULL, OPTION_MIPS5},
10836 #define OPTION_MIPS32 (OPTION_ARCH_BASE + 7)
10837   {"mips32", no_argument, NULL, OPTION_MIPS32},
10838 #define OPTION_MIPS64 (OPTION_ARCH_BASE + 8)
10839   {"mips64", no_argument, NULL, OPTION_MIPS64},
10840 #define OPTION_MIPS32R2 (OPTION_ARCH_BASE + 9)
10841   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
10842 #define OPTION_MIPS64R2 (OPTION_ARCH_BASE + 10)
10843   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
10844
10845   /* Options which specify Application Specific Extensions (ASEs).  */
10846 #define OPTION_ASE_BASE (OPTION_ARCH_BASE + 11)
10847 #define OPTION_MIPS16 (OPTION_ASE_BASE + 0)
10848   {"mips16", no_argument, NULL, OPTION_MIPS16},
10849 #define OPTION_NO_MIPS16 (OPTION_ASE_BASE + 1)
10850   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
10851 #define OPTION_MIPS3D (OPTION_ASE_BASE + 2)
10852   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
10853 #define OPTION_NO_MIPS3D (OPTION_ASE_BASE + 3)
10854   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
10855 #define OPTION_MDMX (OPTION_ASE_BASE + 4)
10856   {"mdmx", no_argument, NULL, OPTION_MDMX},
10857 #define OPTION_NO_MDMX (OPTION_ASE_BASE + 5)
10858   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
10859 #define OPTION_DSP (OPTION_ASE_BASE + 6)
10860   {"mdsp", no_argument, NULL, OPTION_DSP},
10861 #define OPTION_NO_DSP (OPTION_ASE_BASE + 7)
10862   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
10863 #define OPTION_MT (OPTION_ASE_BASE + 8)
10864   {"mmt", no_argument, NULL, OPTION_MT},
10865 #define OPTION_NO_MT (OPTION_ASE_BASE + 9)
10866   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
10867 #define OPTION_SMARTMIPS (OPTION_ASE_BASE + 10)
10868   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
10869 #define OPTION_NO_SMARTMIPS (OPTION_ASE_BASE + 11)
10870   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
10871 #define OPTION_DSPR2 (OPTION_ASE_BASE + 12)
10872   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
10873 #define OPTION_NO_DSPR2 (OPTION_ASE_BASE + 13)
10874   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
10875
10876   /* Old-style architecture options.  Don't add more of these.  */
10877 #define OPTION_COMPAT_ARCH_BASE (OPTION_ASE_BASE + 14)
10878 #define OPTION_M4650 (OPTION_COMPAT_ARCH_BASE + 0)
10879   {"m4650", no_argument, NULL, OPTION_M4650},
10880 #define OPTION_NO_M4650 (OPTION_COMPAT_ARCH_BASE + 1)
10881   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
10882 #define OPTION_M4010 (OPTION_COMPAT_ARCH_BASE + 2)
10883   {"m4010", no_argument, NULL, OPTION_M4010},
10884 #define OPTION_NO_M4010 (OPTION_COMPAT_ARCH_BASE + 3)
10885   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
10886 #define OPTION_M4100 (OPTION_COMPAT_ARCH_BASE + 4)
10887   {"m4100", no_argument, NULL, OPTION_M4100},
10888 #define OPTION_NO_M4100 (OPTION_COMPAT_ARCH_BASE + 5)
10889   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
10890 #define OPTION_M3900 (OPTION_COMPAT_ARCH_BASE + 6)
10891   {"m3900", no_argument, NULL, OPTION_M3900},
10892 #define OPTION_NO_M3900 (OPTION_COMPAT_ARCH_BASE + 7)
10893   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
10894
10895   /* Options which enable bug fixes.  */
10896 #define OPTION_FIX_BASE    (OPTION_COMPAT_ARCH_BASE + 8)
10897 #define OPTION_M7000_HILO_FIX (OPTION_FIX_BASE + 0)
10898   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
10899 #define OPTION_MNO_7000_HILO_FIX (OPTION_FIX_BASE + 1)
10900   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10901   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
10902 #define OPTION_FIX_VR4120 (OPTION_FIX_BASE + 2)
10903 #define OPTION_NO_FIX_VR4120 (OPTION_FIX_BASE + 3)
10904   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
10905   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
10906 #define OPTION_FIX_VR4130 (OPTION_FIX_BASE + 4)
10907 #define OPTION_NO_FIX_VR4130 (OPTION_FIX_BASE + 5)
10908   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
10909   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
10910
10911   /* Miscellaneous options.  */
10912 #define OPTION_MISC_BASE (OPTION_FIX_BASE + 6)
10913 #define OPTION_TRAP (OPTION_MISC_BASE + 0)
10914   {"trap", no_argument, NULL, OPTION_TRAP},
10915   {"no-break", no_argument, NULL, OPTION_TRAP},
10916 #define OPTION_BREAK (OPTION_MISC_BASE + 1)
10917   {"break", no_argument, NULL, OPTION_BREAK},
10918   {"no-trap", no_argument, NULL, OPTION_BREAK},
10919 #define OPTION_EB (OPTION_MISC_BASE + 2)
10920   {"EB", no_argument, NULL, OPTION_EB},
10921 #define OPTION_EL (OPTION_MISC_BASE + 3)
10922   {"EL", no_argument, NULL, OPTION_EL},
10923 #define OPTION_FP32 (OPTION_MISC_BASE + 4)
10924   {"mfp32", no_argument, NULL, OPTION_FP32},
10925 #define OPTION_GP32 (OPTION_MISC_BASE + 5)
10926   {"mgp32", no_argument, NULL, OPTION_GP32},
10927 #define OPTION_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 6)
10928   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
10929 #define OPTION_NO_CONSTRUCT_FLOATS (OPTION_MISC_BASE + 7)
10930   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
10931 #define OPTION_FP64 (OPTION_MISC_BASE + 8)
10932   {"mfp64", no_argument, NULL, OPTION_FP64},
10933 #define OPTION_GP64 (OPTION_MISC_BASE + 9)
10934   {"mgp64", no_argument, NULL, OPTION_GP64},
10935 #define OPTION_RELAX_BRANCH (OPTION_MISC_BASE + 10)
10936 #define OPTION_NO_RELAX_BRANCH (OPTION_MISC_BASE + 11)
10937   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
10938   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
10939 #define OPTION_MSHARED (OPTION_MISC_BASE + 12)
10940 #define OPTION_MNO_SHARED (OPTION_MISC_BASE + 13)
10941   {"mshared", no_argument, NULL, OPTION_MSHARED},
10942   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
10943 #define OPTION_MSYM32 (OPTION_MISC_BASE + 14)
10944 #define OPTION_MNO_SYM32 (OPTION_MISC_BASE + 15)
10945   {"msym32", no_argument, NULL, OPTION_MSYM32},
10946   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
10947
10948   /* ELF-specific options.  */
10949 #ifdef OBJ_ELF
10950 #define OPTION_ELF_BASE    (OPTION_MISC_BASE + 16)
10951 #define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
10952   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
10953   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
10954 #define OPTION_NON_SHARED  (OPTION_ELF_BASE + 1)
10955   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
10956 #define OPTION_XGOT        (OPTION_ELF_BASE + 2)
10957   {"xgot",        no_argument, NULL, OPTION_XGOT},
10958 #define OPTION_MABI        (OPTION_ELF_BASE + 3)
10959   {"mabi", required_argument, NULL, OPTION_MABI},
10960 #define OPTION_32          (OPTION_ELF_BASE + 4)
10961   {"32",          no_argument, NULL, OPTION_32},
10962 #define OPTION_N32         (OPTION_ELF_BASE + 5)
10963   {"n32",         no_argument, NULL, OPTION_N32},
10964 #define OPTION_64          (OPTION_ELF_BASE + 6)
10965   {"64",          no_argument, NULL, OPTION_64},
10966 #define OPTION_MDEBUG      (OPTION_ELF_BASE + 7)
10967   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
10968 #define OPTION_NO_MDEBUG   (OPTION_ELF_BASE + 8)
10969   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
10970 #define OPTION_PDR         (OPTION_ELF_BASE + 9)
10971   {"mpdr", no_argument, NULL, OPTION_PDR},
10972 #define OPTION_NO_PDR      (OPTION_ELF_BASE + 10)
10973   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
10974 #define OPTION_MVXWORKS_PIC (OPTION_ELF_BASE + 11)
10975   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
10976 #endif /* OBJ_ELF */
10977
10978   {NULL, no_argument, NULL, 0}
10979 };
10980 size_t md_longopts_size = sizeof (md_longopts);
10981
10982 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
10983    NEW_VALUE.  Warn if another value was already specified.  Note:
10984    we have to defer parsing the -march and -mtune arguments in order
10985    to handle 'from-abi' correctly, since the ABI might be specified
10986    in a later argument.  */
10987
10988 static void
10989 mips_set_option_string (const char **string_ptr, const char *new_value)
10990 {
10991   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
10992     as_warn (_("A different %s was already specified, is now %s"),
10993              string_ptr == &mips_arch_string ? "-march" : "-mtune",
10994              new_value);
10995
10996   *string_ptr = new_value;
10997 }
10998
10999 int
11000 md_parse_option (int c, char *arg)
11001 {
11002   switch (c)
11003     {
11004     case OPTION_CONSTRUCT_FLOATS:
11005       mips_disable_float_construction = 0;
11006       break;
11007
11008     case OPTION_NO_CONSTRUCT_FLOATS:
11009       mips_disable_float_construction = 1;
11010       break;
11011
11012     case OPTION_TRAP:
11013       mips_trap = 1;
11014       break;
11015
11016     case OPTION_BREAK:
11017       mips_trap = 0;
11018       break;
11019
11020     case OPTION_EB:
11021       target_big_endian = 1;
11022       break;
11023
11024     case OPTION_EL:
11025       target_big_endian = 0;
11026       break;
11027
11028     case 'O':
11029       if (arg == NULL)
11030         mips_optimize = 1;
11031       else if (arg[0] == '0')
11032         mips_optimize = 0;
11033       else if (arg[0] == '1')
11034         mips_optimize = 1;
11035       else
11036         mips_optimize = 2;
11037       break;
11038
11039     case 'g':
11040       if (arg == NULL)
11041         mips_debug = 2;
11042       else
11043         mips_debug = atoi (arg);
11044       break;
11045
11046     case OPTION_MIPS1:
11047       file_mips_isa = ISA_MIPS1;
11048       break;
11049
11050     case OPTION_MIPS2:
11051       file_mips_isa = ISA_MIPS2;
11052       break;
11053
11054     case OPTION_MIPS3:
11055       file_mips_isa = ISA_MIPS3;
11056       break;
11057
11058     case OPTION_MIPS4:
11059       file_mips_isa = ISA_MIPS4;
11060       break;
11061
11062     case OPTION_MIPS5:
11063       file_mips_isa = ISA_MIPS5;
11064       break;
11065
11066     case OPTION_MIPS32:
11067       file_mips_isa = ISA_MIPS32;
11068       break;
11069
11070     case OPTION_MIPS32R2:
11071       file_mips_isa = ISA_MIPS32R2;
11072       break;
11073
11074     case OPTION_MIPS64R2:
11075       file_mips_isa = ISA_MIPS64R2;
11076       break;
11077
11078     case OPTION_MIPS64:
11079       file_mips_isa = ISA_MIPS64;
11080       break;
11081
11082     case OPTION_MTUNE:
11083       mips_set_option_string (&mips_tune_string, arg);
11084       break;
11085
11086     case OPTION_MARCH:
11087       mips_set_option_string (&mips_arch_string, arg);
11088       break;
11089
11090     case OPTION_M4650:
11091       mips_set_option_string (&mips_arch_string, "4650");
11092       mips_set_option_string (&mips_tune_string, "4650");
11093       break;
11094
11095     case OPTION_NO_M4650:
11096       break;
11097
11098     case OPTION_M4010:
11099       mips_set_option_string (&mips_arch_string, "4010");
11100       mips_set_option_string (&mips_tune_string, "4010");
11101       break;
11102
11103     case OPTION_NO_M4010:
11104       break;
11105
11106     case OPTION_M4100:
11107       mips_set_option_string (&mips_arch_string, "4100");
11108       mips_set_option_string (&mips_tune_string, "4100");
11109       break;
11110
11111     case OPTION_NO_M4100:
11112       break;
11113
11114     case OPTION_M3900:
11115       mips_set_option_string (&mips_arch_string, "3900");
11116       mips_set_option_string (&mips_tune_string, "3900");
11117       break;
11118
11119     case OPTION_NO_M3900:
11120       break;
11121
11122     case OPTION_MDMX:
11123       mips_opts.ase_mdmx = 1;
11124       break;
11125
11126     case OPTION_NO_MDMX:
11127       mips_opts.ase_mdmx = 0;
11128       break;
11129
11130     case OPTION_DSP:
11131       mips_opts.ase_dsp = 1;
11132       mips_opts.ase_dspr2 = 0;
11133       break;
11134
11135     case OPTION_NO_DSP:
11136       mips_opts.ase_dsp = 0;
11137       mips_opts.ase_dspr2 = 0;
11138       break;
11139
11140     case OPTION_DSPR2:
11141       mips_opts.ase_dspr2 = 1;
11142       mips_opts.ase_dsp = 1;
11143       break;
11144
11145     case OPTION_NO_DSPR2:
11146       mips_opts.ase_dspr2 = 0;
11147       mips_opts.ase_dsp = 0;
11148       break;
11149
11150     case OPTION_MT:
11151       mips_opts.ase_mt = 1;
11152       break;
11153
11154     case OPTION_NO_MT:
11155       mips_opts.ase_mt = 0;
11156       break;
11157
11158     case OPTION_MIPS16:
11159       mips_opts.mips16 = 1;
11160       mips_no_prev_insn ();
11161       break;
11162
11163     case OPTION_NO_MIPS16:
11164       mips_opts.mips16 = 0;
11165       mips_no_prev_insn ();
11166       break;
11167
11168     case OPTION_MIPS3D:
11169       mips_opts.ase_mips3d = 1;
11170       break;
11171
11172     case OPTION_NO_MIPS3D:
11173       mips_opts.ase_mips3d = 0;
11174       break;
11175
11176     case OPTION_SMARTMIPS:
11177       mips_opts.ase_smartmips = 1;
11178       break;
11179
11180     case OPTION_NO_SMARTMIPS:
11181       mips_opts.ase_smartmips = 0;
11182       break;
11183
11184     case OPTION_FIX_VR4120:
11185       mips_fix_vr4120 = 1;
11186       break;
11187
11188     case OPTION_NO_FIX_VR4120:
11189       mips_fix_vr4120 = 0;
11190       break;
11191
11192     case OPTION_FIX_VR4130:
11193       mips_fix_vr4130 = 1;
11194       break;
11195
11196     case OPTION_NO_FIX_VR4130:
11197       mips_fix_vr4130 = 0;
11198       break;
11199
11200     case OPTION_RELAX_BRANCH:
11201       mips_relax_branch = 1;
11202       break;
11203
11204     case OPTION_NO_RELAX_BRANCH:
11205       mips_relax_branch = 0;
11206       break;
11207
11208     case OPTION_MSHARED:
11209       mips_in_shared = TRUE;
11210       break;
11211
11212     case OPTION_MNO_SHARED:
11213       mips_in_shared = FALSE;
11214       break;
11215
11216     case OPTION_MSYM32:
11217       mips_opts.sym32 = TRUE;
11218       break;
11219
11220     case OPTION_MNO_SYM32:
11221       mips_opts.sym32 = FALSE;
11222       break;
11223
11224 #ifdef OBJ_ELF
11225       /* When generating ELF code, we permit -KPIC and -call_shared to
11226          select SVR4_PIC, and -non_shared to select no PIC.  This is
11227          intended to be compatible with Irix 5.  */
11228     case OPTION_CALL_SHARED:
11229       if (!IS_ELF)
11230         {
11231           as_bad (_("-call_shared is supported only for ELF format"));
11232           return 0;
11233         }
11234       mips_pic = SVR4_PIC;
11235       mips_abicalls = TRUE;
11236       break;
11237
11238     case OPTION_NON_SHARED:
11239       if (!IS_ELF)
11240         {
11241           as_bad (_("-non_shared is supported only for ELF format"));
11242           return 0;
11243         }
11244       mips_pic = NO_PIC;
11245       mips_abicalls = FALSE;
11246       break;
11247
11248       /* The -xgot option tells the assembler to use 32 bit offsets
11249          when accessing the got in SVR4_PIC mode.  It is for Irix
11250          compatibility.  */
11251     case OPTION_XGOT:
11252       mips_big_got = 1;
11253       break;
11254 #endif /* OBJ_ELF */
11255
11256     case 'G':
11257       g_switch_value = atoi (arg);
11258       g_switch_seen = 1;
11259       break;
11260
11261 #ifdef OBJ_ELF
11262       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11263          and -mabi=64.  */
11264     case OPTION_32:
11265       if (!IS_ELF)
11266         {
11267           as_bad (_("-32 is supported for ELF format only"));
11268           return 0;
11269         }
11270       mips_abi = O32_ABI;
11271       break;
11272
11273     case OPTION_N32:
11274       if (!IS_ELF)
11275         {
11276           as_bad (_("-n32 is supported for ELF format only"));
11277           return 0;
11278         }
11279       mips_abi = N32_ABI;
11280       break;
11281
11282     case OPTION_64:
11283       if (!IS_ELF)
11284         {
11285           as_bad (_("-64 is supported for ELF format only"));
11286           return 0;
11287         }
11288       mips_abi = N64_ABI;
11289       if (!support_64bit_objects())
11290         as_fatal (_("No compiled in support for 64 bit object file format"));
11291       break;
11292 #endif /* OBJ_ELF */
11293
11294     case OPTION_GP32:
11295       file_mips_gp32 = 1;
11296       break;
11297
11298     case OPTION_GP64:
11299       file_mips_gp32 = 0;
11300       break;
11301
11302     case OPTION_FP32:
11303       file_mips_fp32 = 1;
11304       break;
11305
11306     case OPTION_FP64:
11307       file_mips_fp32 = 0;
11308       break;
11309
11310 #ifdef OBJ_ELF
11311     case OPTION_MABI:
11312       if (!IS_ELF)
11313         {
11314           as_bad (_("-mabi is supported for ELF format only"));
11315           return 0;
11316         }
11317       if (strcmp (arg, "32") == 0)
11318         mips_abi = O32_ABI;
11319       else if (strcmp (arg, "o64") == 0)
11320         mips_abi = O64_ABI;
11321       else if (strcmp (arg, "n32") == 0)
11322         mips_abi = N32_ABI;
11323       else if (strcmp (arg, "64") == 0)
11324         {
11325           mips_abi = N64_ABI;
11326           if (! support_64bit_objects())
11327             as_fatal (_("No compiled in support for 64 bit object file "
11328                         "format"));
11329         }
11330       else if (strcmp (arg, "eabi") == 0)
11331         mips_abi = EABI_ABI;
11332       else
11333         {
11334           as_fatal (_("invalid abi -mabi=%s"), arg);
11335           return 0;
11336         }
11337       break;
11338 #endif /* OBJ_ELF */
11339
11340     case OPTION_M7000_HILO_FIX:
11341       mips_7000_hilo_fix = TRUE;
11342       break;
11343
11344     case OPTION_MNO_7000_HILO_FIX:
11345       mips_7000_hilo_fix = FALSE;
11346       break;
11347
11348 #ifdef OBJ_ELF
11349     case OPTION_MDEBUG:
11350       mips_flag_mdebug = TRUE;
11351       break;
11352
11353     case OPTION_NO_MDEBUG:
11354       mips_flag_mdebug = FALSE;
11355       break;
11356
11357     case OPTION_PDR:
11358       mips_flag_pdr = TRUE;
11359       break;
11360
11361     case OPTION_NO_PDR:
11362       mips_flag_pdr = FALSE;
11363       break;
11364
11365     case OPTION_MVXWORKS_PIC:
11366       mips_pic = VXWORKS_PIC;
11367       break;
11368 #endif /* OBJ_ELF */
11369
11370     default:
11371       return 0;
11372     }
11373
11374   return 1;
11375 }
11376 \f
11377 /* Set up globals to generate code for the ISA or processor
11378    described by INFO.  */
11379
11380 static void
11381 mips_set_architecture (const struct mips_cpu_info *info)
11382 {
11383   if (info != 0)
11384     {
11385       file_mips_arch = info->cpu;
11386       mips_opts.arch = info->cpu;
11387       mips_opts.isa = info->isa;
11388     }
11389 }
11390
11391
11392 /* Likewise for tuning.  */
11393
11394 static void
11395 mips_set_tune (const struct mips_cpu_info *info)
11396 {
11397   if (info != 0)
11398     mips_tune = info->cpu;
11399 }
11400
11401
11402 void
11403 mips_after_parse_args (void)
11404 {
11405   const struct mips_cpu_info *arch_info = 0;
11406   const struct mips_cpu_info *tune_info = 0;
11407
11408   /* GP relative stuff not working for PE */
11409   if (strncmp (TARGET_OS, "pe", 2) == 0)
11410     {
11411       if (g_switch_seen && g_switch_value != 0)
11412         as_bad (_("-G not supported in this configuration."));
11413       g_switch_value = 0;
11414     }
11415
11416   if (mips_abi == NO_ABI)
11417     mips_abi = MIPS_DEFAULT_ABI;
11418
11419   /* The following code determines the architecture and register size.
11420      Similar code was added to GCC 3.3 (see override_options() in
11421      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11422      as much as possible.  */
11423
11424   if (mips_arch_string != 0)
11425     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11426
11427   if (file_mips_isa != ISA_UNKNOWN)
11428     {
11429       /* Handle -mipsN.  At this point, file_mips_isa contains the
11430          ISA level specified by -mipsN, while arch_info->isa contains
11431          the -march selection (if any).  */
11432       if (arch_info != 0)
11433         {
11434           /* -march takes precedence over -mipsN, since it is more descriptive.
11435              There's no harm in specifying both as long as the ISA levels
11436              are the same.  */
11437           if (file_mips_isa != arch_info->isa)
11438             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11439                     mips_cpu_info_from_isa (file_mips_isa)->name,
11440                     mips_cpu_info_from_isa (arch_info->isa)->name);
11441         }
11442       else
11443         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11444     }
11445
11446   if (arch_info == 0)
11447     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11448
11449   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11450     as_bad ("-march=%s is not compatible with the selected ABI",
11451             arch_info->name);
11452
11453   mips_set_architecture (arch_info);
11454
11455   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11456   if (mips_tune_string != 0)
11457     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11458
11459   if (tune_info == 0)
11460     mips_set_tune (arch_info);
11461   else
11462     mips_set_tune (tune_info);
11463
11464   if (file_mips_gp32 >= 0)
11465     {
11466       /* The user specified the size of the integer registers.  Make sure
11467          it agrees with the ABI and ISA.  */
11468       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11469         as_bad (_("-mgp64 used with a 32-bit processor"));
11470       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11471         as_bad (_("-mgp32 used with a 64-bit ABI"));
11472       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11473         as_bad (_("-mgp64 used with a 32-bit ABI"));
11474     }
11475   else
11476     {
11477       /* Infer the integer register size from the ABI and processor.
11478          Restrict ourselves to 32-bit registers if that's all the
11479          processor has, or if the ABI cannot handle 64-bit registers.  */
11480       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11481                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11482     }
11483
11484   switch (file_mips_fp32)
11485     {
11486     default:
11487     case -1:
11488       /* No user specified float register size.
11489          ??? GAS treats single-float processors as though they had 64-bit
11490          float registers (although it complains when double-precision
11491          instructions are used).  As things stand, saying they have 32-bit
11492          registers would lead to spurious "register must be even" messages.
11493          So here we assume float registers are never smaller than the
11494          integer ones.  */
11495       if (file_mips_gp32 == 0)
11496         /* 64-bit integer registers implies 64-bit float registers.  */
11497         file_mips_fp32 = 0;
11498       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11499                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11500         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11501         file_mips_fp32 = 0;
11502       else
11503         /* 32-bit float registers.  */
11504         file_mips_fp32 = 1;
11505       break;
11506
11507     /* The user specified the size of the float registers.  Check if it
11508        agrees with the ABI and ISA.  */
11509     case 0:
11510       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11511         as_bad (_("-mfp64 used with a 32-bit fpu"));
11512       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11513                && !ISA_HAS_MXHC1 (mips_opts.isa))
11514         as_warn (_("-mfp64 used with a 32-bit ABI"));
11515       break;
11516     case 1:
11517       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11518         as_warn (_("-mfp32 used with a 64-bit ABI"));
11519       break;
11520     }
11521
11522   /* End of GCC-shared inference code.  */
11523
11524   /* This flag is set when we have a 64-bit capable CPU but use only
11525      32-bit wide registers.  Note that EABI does not use it.  */
11526   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11527       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11528           || mips_abi == O32_ABI))
11529     mips_32bitmode = 1;
11530
11531   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11532     as_bad (_("trap exception not supported at ISA 1"));
11533
11534   /* If the selected architecture includes support for ASEs, enable
11535      generation of code for them.  */
11536   if (mips_opts.mips16 == -1)
11537     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11538   if (mips_opts.ase_mips3d == -1)
11539     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11540                             && file_mips_fp32 == 0) ? 1 : 0;
11541   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11542     as_bad (_("-mfp32 used with -mips3d"));
11543
11544   if (mips_opts.ase_mdmx == -1)
11545     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11546                           && file_mips_fp32 == 0) ? 1 : 0;
11547   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11548     as_bad (_("-mfp32 used with -mdmx"));
11549
11550   if (mips_opts.ase_smartmips == -1)
11551     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11552   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11553       as_warn ("%s ISA does not support SmartMIPS", 
11554                mips_cpu_info_from_isa (mips_opts.isa)->name);
11555
11556   if (mips_opts.ase_dsp == -1)
11557     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11558   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11559       as_warn ("%s ISA does not support DSP ASE", 
11560                mips_cpu_info_from_isa (mips_opts.isa)->name);
11561
11562   if (mips_opts.ase_dspr2 == -1)
11563     {
11564       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11565       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11566     }
11567   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11568       as_warn ("%s ISA does not support DSP R2 ASE",
11569                mips_cpu_info_from_isa (mips_opts.isa)->name);
11570
11571   if (mips_opts.ase_mt == -1)
11572     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11573   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11574       as_warn ("%s ISA does not support MT ASE",
11575                mips_cpu_info_from_isa (mips_opts.isa)->name);
11576
11577   file_mips_isa = mips_opts.isa;
11578   file_ase_mips16 = mips_opts.mips16;
11579   file_ase_mips3d = mips_opts.ase_mips3d;
11580   file_ase_mdmx = mips_opts.ase_mdmx;
11581   file_ase_smartmips = mips_opts.ase_smartmips;
11582   file_ase_dsp = mips_opts.ase_dsp;
11583   file_ase_dspr2 = mips_opts.ase_dspr2;
11584   file_ase_mt = mips_opts.ase_mt;
11585   mips_opts.gp32 = file_mips_gp32;
11586   mips_opts.fp32 = file_mips_fp32;
11587
11588   if (mips_flag_mdebug < 0)
11589     {
11590 #ifdef OBJ_MAYBE_ECOFF
11591       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
11592         mips_flag_mdebug = 1;
11593       else
11594 #endif /* OBJ_MAYBE_ECOFF */
11595         mips_flag_mdebug = 0;
11596     }
11597 }
11598 \f
11599 void
11600 mips_init_after_args (void)
11601 {
11602   /* initialize opcodes */
11603   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
11604   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
11605 }
11606
11607 long
11608 md_pcrel_from (fixS *fixP)
11609 {
11610   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
11611   switch (fixP->fx_r_type)
11612     {
11613     case BFD_RELOC_16_PCREL_S2:
11614     case BFD_RELOC_MIPS_JMP:
11615       /* Return the address of the delay slot.  */
11616       return addr + 4;
11617     default:
11618       /* We have no relocation type for PC relative MIPS16 instructions.  */
11619       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
11620         as_bad_where (fixP->fx_file, fixP->fx_line,
11621                       _("PC relative MIPS16 instruction references a different section"));
11622       return addr;
11623     }
11624 }
11625
11626 /* This is called before the symbol table is processed.  In order to
11627    work with gcc when using mips-tfile, we must keep all local labels.
11628    However, in other cases, we want to discard them.  If we were
11629    called with -g, but we didn't see any debugging information, it may
11630    mean that gcc is smuggling debugging information through to
11631    mips-tfile, in which case we must generate all local labels.  */
11632
11633 void
11634 mips_frob_file_before_adjust (void)
11635 {
11636 #ifndef NO_ECOFF_DEBUGGING
11637   if (ECOFF_DEBUGGING
11638       && mips_debug != 0
11639       && ! ecoff_debugging_seen)
11640     flag_keep_locals = 1;
11641 #endif
11642 }
11643
11644 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
11645    the corresponding LO16 reloc.  This is called before md_apply_fix and
11646    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
11647    relocation operators.
11648
11649    For our purposes, a %lo() expression matches a %got() or %hi()
11650    expression if:
11651
11652       (a) it refers to the same symbol; and
11653       (b) the offset applied in the %lo() expression is no lower than
11654           the offset applied in the %got() or %hi().
11655
11656    (b) allows us to cope with code like:
11657
11658         lui     $4,%hi(foo)
11659         lh      $4,%lo(foo+2)($4)
11660
11661    ...which is legal on RELA targets, and has a well-defined behaviour
11662    if the user knows that adding 2 to "foo" will not induce a carry to
11663    the high 16 bits.
11664
11665    When several %lo()s match a particular %got() or %hi(), we use the
11666    following rules to distinguish them:
11667
11668      (1) %lo()s with smaller offsets are a better match than %lo()s with
11669          higher offsets.
11670
11671      (2) %lo()s with no matching %got() or %hi() are better than those
11672          that already have a matching %got() or %hi().
11673
11674      (3) later %lo()s are better than earlier %lo()s.
11675
11676    These rules are applied in order.
11677
11678    (1) means, among other things, that %lo()s with identical offsets are
11679    chosen if they exist.
11680
11681    (2) means that we won't associate several high-part relocations with
11682    the same low-part relocation unless there's no alternative.  Having
11683    several high parts for the same low part is a GNU extension; this rule
11684    allows careful users to avoid it.
11685
11686    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
11687    with the last high-part relocation being at the front of the list.
11688    It therefore makes sense to choose the last matching low-part
11689    relocation, all other things being equal.  It's also easier
11690    to code that way.  */
11691
11692 void
11693 mips_frob_file (void)
11694 {
11695   struct mips_hi_fixup *l;
11696
11697   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
11698     {
11699       segment_info_type *seginfo;
11700       bfd_boolean matched_lo_p;
11701       fixS **hi_pos, **lo_pos, **pos;
11702
11703       assert (reloc_needs_lo_p (l->fixp->fx_r_type));
11704
11705       /* If a GOT16 relocation turns out to be against a global symbol,
11706          there isn't supposed to be a matching LO.  */
11707       if (l->fixp->fx_r_type == BFD_RELOC_MIPS_GOT16
11708           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
11709         continue;
11710
11711       /* Check quickly whether the next fixup happens to be a matching %lo.  */
11712       if (fixup_has_matching_lo_p (l->fixp))
11713         continue;
11714
11715       seginfo = seg_info (l->seg);
11716
11717       /* Set HI_POS to the position of this relocation in the chain.
11718          Set LO_POS to the position of the chosen low-part relocation.
11719          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
11720          relocation that matches an immediately-preceding high-part
11721          relocation.  */
11722       hi_pos = NULL;
11723       lo_pos = NULL;
11724       matched_lo_p = FALSE;
11725       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
11726         {
11727           if (*pos == l->fixp)
11728             hi_pos = pos;
11729
11730           if (((*pos)->fx_r_type == BFD_RELOC_LO16
11731                || (*pos)->fx_r_type == BFD_RELOC_MIPS16_LO16)
11732               && (*pos)->fx_addsy == l->fixp->fx_addsy
11733               && (*pos)->fx_offset >= l->fixp->fx_offset
11734               && (lo_pos == NULL
11735                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
11736                   || (!matched_lo_p
11737                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
11738             lo_pos = pos;
11739
11740           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
11741                           && fixup_has_matching_lo_p (*pos));
11742         }
11743
11744       /* If we found a match, remove the high-part relocation from its
11745          current position and insert it before the low-part relocation.
11746          Make the offsets match so that fixup_has_matching_lo_p()
11747          will return true.
11748
11749          We don't warn about unmatched high-part relocations since some
11750          versions of gcc have been known to emit dead "lui ...%hi(...)"
11751          instructions.  */
11752       if (lo_pos != NULL)
11753         {
11754           l->fixp->fx_offset = (*lo_pos)->fx_offset;
11755           if (l->fixp->fx_next != *lo_pos)
11756             {
11757               *hi_pos = l->fixp->fx_next;
11758               l->fixp->fx_next = *lo_pos;
11759               *lo_pos = l->fixp;
11760             }
11761         }
11762     }
11763 }
11764
11765 /* We may have combined relocations without symbols in the N32/N64 ABI.
11766    We have to prevent gas from dropping them.  */
11767
11768 int
11769 mips_force_relocation (fixS *fixp)
11770 {
11771   if (generic_force_reloc (fixp))
11772     return 1;
11773
11774   if (HAVE_NEWABI
11775       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
11776       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
11777           || fixp->fx_r_type == BFD_RELOC_HI16_S
11778           || fixp->fx_r_type == BFD_RELOC_LO16))
11779     return 1;
11780
11781   return 0;
11782 }
11783
11784 /* Apply a fixup to the object file.  */
11785
11786 void
11787 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
11788 {
11789   bfd_byte *buf;
11790   long insn;
11791   reloc_howto_type *howto;
11792
11793   /* We ignore generic BFD relocations we don't know about.  */
11794   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
11795   if (! howto)
11796     return;
11797
11798   assert (fixP->fx_size == 4
11799           || fixP->fx_r_type == BFD_RELOC_16
11800           || fixP->fx_r_type == BFD_RELOC_64
11801           || fixP->fx_r_type == BFD_RELOC_CTOR
11802           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
11803           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11804           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
11805           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
11806
11807   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
11808
11809   assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
11810
11811   /* Don't treat parts of a composite relocation as done.  There are two
11812      reasons for this:
11813
11814      (1) The second and third parts will be against 0 (RSS_UNDEF) but
11815          should nevertheless be emitted if the first part is.
11816
11817      (2) In normal usage, composite relocations are never assembly-time
11818          constants.  The easiest way of dealing with the pathological
11819          exceptions is to generate a relocation against STN_UNDEF and
11820          leave everything up to the linker.  */
11821   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
11822     fixP->fx_done = 1;
11823
11824   switch (fixP->fx_r_type)
11825     {
11826     case BFD_RELOC_MIPS_TLS_GD:
11827     case BFD_RELOC_MIPS_TLS_LDM:
11828     case BFD_RELOC_MIPS_TLS_DTPREL32:
11829     case BFD_RELOC_MIPS_TLS_DTPREL64:
11830     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
11831     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
11832     case BFD_RELOC_MIPS_TLS_GOTTPREL:
11833     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
11834     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
11835       S_SET_THREAD_LOCAL (fixP->fx_addsy);
11836       /* fall through */
11837
11838     case BFD_RELOC_MIPS_JMP:
11839     case BFD_RELOC_MIPS_SHIFT5:
11840     case BFD_RELOC_MIPS_SHIFT6:
11841     case BFD_RELOC_MIPS_GOT_DISP:
11842     case BFD_RELOC_MIPS_GOT_PAGE:
11843     case BFD_RELOC_MIPS_GOT_OFST:
11844     case BFD_RELOC_MIPS_SUB:
11845     case BFD_RELOC_MIPS_INSERT_A:
11846     case BFD_RELOC_MIPS_INSERT_B:
11847     case BFD_RELOC_MIPS_DELETE:
11848     case BFD_RELOC_MIPS_HIGHEST:
11849     case BFD_RELOC_MIPS_HIGHER:
11850     case BFD_RELOC_MIPS_SCN_DISP:
11851     case BFD_RELOC_MIPS_REL16:
11852     case BFD_RELOC_MIPS_RELGOT:
11853     case BFD_RELOC_MIPS_JALR:
11854     case BFD_RELOC_HI16:
11855     case BFD_RELOC_HI16_S:
11856     case BFD_RELOC_GPREL16:
11857     case BFD_RELOC_MIPS_LITERAL:
11858     case BFD_RELOC_MIPS_CALL16:
11859     case BFD_RELOC_MIPS_GOT16:
11860     case BFD_RELOC_GPREL32:
11861     case BFD_RELOC_MIPS_GOT_HI16:
11862     case BFD_RELOC_MIPS_GOT_LO16:
11863     case BFD_RELOC_MIPS_CALL_HI16:
11864     case BFD_RELOC_MIPS_CALL_LO16:
11865     case BFD_RELOC_MIPS16_GPREL:
11866     case BFD_RELOC_MIPS16_HI16:
11867     case BFD_RELOC_MIPS16_HI16_S:
11868     case BFD_RELOC_MIPS16_JMP:
11869       /* Nothing needed to do.  The value comes from the reloc entry.  */
11870       break;
11871
11872     case BFD_RELOC_64:
11873       /* This is handled like BFD_RELOC_32, but we output a sign
11874          extended value if we are only 32 bits.  */
11875       if (fixP->fx_done)
11876         {
11877           if (8 <= sizeof (valueT))
11878             md_number_to_chars ((char *) buf, *valP, 8);
11879           else
11880             {
11881               valueT hiv;
11882
11883               if ((*valP & 0x80000000) != 0)
11884                 hiv = 0xffffffff;
11885               else
11886                 hiv = 0;
11887               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
11888                                   *valP, 4);
11889               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
11890                                   hiv, 4);
11891             }
11892         }
11893       break;
11894
11895     case BFD_RELOC_RVA:
11896     case BFD_RELOC_32:
11897     case BFD_RELOC_16:
11898       /* If we are deleting this reloc entry, we must fill in the
11899          value now.  This can happen if we have a .word which is not
11900          resolved when it appears but is later defined.  */
11901       if (fixP->fx_done)
11902         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
11903       break;
11904
11905     case BFD_RELOC_LO16:
11906     case BFD_RELOC_MIPS16_LO16:
11907       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
11908          may be safe to remove, but if so it's not obvious.  */
11909       /* When handling an embedded PIC switch statement, we can wind
11910          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
11911       if (fixP->fx_done)
11912         {
11913           if (*valP + 0x8000 > 0xffff)
11914             as_bad_where (fixP->fx_file, fixP->fx_line,
11915                           _("relocation overflow"));
11916           if (target_big_endian)
11917             buf += 2;
11918           md_number_to_chars ((char *) buf, *valP, 2);
11919         }
11920       break;
11921
11922     case BFD_RELOC_16_PCREL_S2:
11923       if ((*valP & 0x3) != 0)
11924         as_bad_where (fixP->fx_file, fixP->fx_line,
11925                       _("Branch to misaligned address (%lx)"), (long) *valP);
11926
11927       /* We need to save the bits in the instruction since fixup_segment()
11928          might be deleting the relocation entry (i.e., a branch within
11929          the current segment).  */
11930       if (! fixP->fx_done)
11931         break;
11932
11933       /* Update old instruction data.  */
11934       if (target_big_endian)
11935         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
11936       else
11937         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
11938
11939       if (*valP + 0x20000 <= 0x3ffff)
11940         {
11941           insn |= (*valP >> 2) & 0xffff;
11942           md_number_to_chars ((char *) buf, insn, 4);
11943         }
11944       else if (mips_pic == NO_PIC
11945                && fixP->fx_done
11946                && fixP->fx_frag->fr_address >= text_section->vma
11947                && (fixP->fx_frag->fr_address
11948                    < text_section->vma + bfd_get_section_size (text_section))
11949                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
11950                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
11951                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
11952         {
11953           /* The branch offset is too large.  If this is an
11954              unconditional branch, and we are not generating PIC code,
11955              we can convert it to an absolute jump instruction.  */
11956           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
11957             insn = 0x0c000000;  /* jal */
11958           else
11959             insn = 0x08000000;  /* j */
11960           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
11961           fixP->fx_done = 0;
11962           fixP->fx_addsy = section_symbol (text_section);
11963           *valP += md_pcrel_from (fixP);
11964           md_number_to_chars ((char *) buf, insn, 4);
11965         }
11966       else
11967         {
11968           /* If we got here, we have branch-relaxation disabled,
11969              and there's nothing we can do to fix this instruction
11970              without turning it into a longer sequence.  */
11971           as_bad_where (fixP->fx_file, fixP->fx_line,
11972                         _("Branch out of range"));
11973         }
11974       break;
11975
11976     case BFD_RELOC_VTABLE_INHERIT:
11977       fixP->fx_done = 0;
11978       if (fixP->fx_addsy
11979           && !S_IS_DEFINED (fixP->fx_addsy)
11980           && !S_IS_WEAK (fixP->fx_addsy))
11981         S_SET_WEAK (fixP->fx_addsy);
11982       break;
11983
11984     case BFD_RELOC_VTABLE_ENTRY:
11985       fixP->fx_done = 0;
11986       break;
11987
11988     default:
11989       internalError ();
11990     }
11991
11992   /* Remember value for tc_gen_reloc.  */
11993   fixP->fx_addnumber = *valP;
11994 }
11995
11996 static symbolS *
11997 get_symbol (void)
11998 {
11999   int c;
12000   char *name;
12001   symbolS *p;
12002
12003   name = input_line_pointer;
12004   c = get_symbol_end ();
12005   p = (symbolS *) symbol_find_or_make (name);
12006   *input_line_pointer = c;
12007   return p;
12008 }
12009
12010 /* Align the current frag to a given power of two.  If a particular
12011    fill byte should be used, FILL points to an integer that contains
12012    that byte, otherwise FILL is null.
12013
12014    The MIPS assembler also automatically adjusts any preceding
12015    label.  */
12016
12017 static void
12018 mips_align (int to, int *fill, symbolS *label)
12019 {
12020   mips_emit_delays ();
12021   mips_record_mips16_mode ();
12022   if (fill == NULL && subseg_text_p (now_seg))
12023     frag_align_code (to, 0);
12024   else
12025     frag_align (to, fill ? *fill : 0, 0);
12026   record_alignment (now_seg, to);
12027   if (label != NULL)
12028     {
12029       assert (S_GET_SEGMENT (label) == now_seg);
12030       symbol_set_frag (label, frag_now);
12031       S_SET_VALUE (label, (valueT) frag_now_fix ());
12032     }
12033 }
12034
12035 /* Align to a given power of two.  .align 0 turns off the automatic
12036    alignment used by the data creating pseudo-ops.  */
12037
12038 static void
12039 s_align (int x ATTRIBUTE_UNUSED)
12040 {
12041   int temp, fill_value, *fill_ptr;
12042   long max_alignment = 28;
12043
12044   /* o Note that the assembler pulls down any immediately preceding label
12045        to the aligned address.
12046      o It's not documented but auto alignment is reinstated by
12047        a .align pseudo instruction.
12048      o Note also that after auto alignment is turned off the mips assembler
12049        issues an error on attempt to assemble an improperly aligned data item.
12050        We don't.  */
12051
12052   temp = get_absolute_expression ();
12053   if (temp > max_alignment)
12054     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12055   else if (temp < 0)
12056     {
12057       as_warn (_("Alignment negative: 0 assumed."));
12058       temp = 0;
12059     }
12060   if (*input_line_pointer == ',')
12061     {
12062       ++input_line_pointer;
12063       fill_value = get_absolute_expression ();
12064       fill_ptr = &fill_value;
12065     }
12066   else
12067     fill_ptr = 0;
12068   if (temp)
12069     {
12070       segment_info_type *si = seg_info (now_seg);
12071       struct insn_label_list *l = si->label_list;
12072       /* Auto alignment should be switched on by next section change.  */
12073       auto_align = 1;
12074       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12075     }
12076   else
12077     {
12078       auto_align = 0;
12079     }
12080
12081   demand_empty_rest_of_line ();
12082 }
12083
12084 static void
12085 s_change_sec (int sec)
12086 {
12087   segT seg;
12088
12089 #ifdef OBJ_ELF
12090   /* The ELF backend needs to know that we are changing sections, so
12091      that .previous works correctly.  We could do something like check
12092      for an obj_section_change_hook macro, but that might be confusing
12093      as it would not be appropriate to use it in the section changing
12094      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12095      This should be cleaner, somehow.  */
12096   if (IS_ELF)
12097     obj_elf_section_change_hook ();
12098 #endif
12099
12100   mips_emit_delays ();
12101   switch (sec)
12102     {
12103     case 't':
12104       s_text (0);
12105       break;
12106     case 'd':
12107       s_data (0);
12108       break;
12109     case 'b':
12110       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12111       demand_empty_rest_of_line ();
12112       break;
12113
12114     case 'r':
12115       seg = subseg_new (RDATA_SECTION_NAME,
12116                         (subsegT) get_absolute_expression ());
12117       if (IS_ELF)
12118         {
12119           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12120                                                   | SEC_READONLY | SEC_RELOC
12121                                                   | SEC_DATA));
12122           if (strcmp (TARGET_OS, "elf") != 0)
12123             record_alignment (seg, 4);
12124         }
12125       demand_empty_rest_of_line ();
12126       break;
12127
12128     case 's':
12129       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12130       if (IS_ELF)
12131         {
12132           bfd_set_section_flags (stdoutput, seg,
12133                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12134           if (strcmp (TARGET_OS, "elf") != 0)
12135             record_alignment (seg, 4);
12136         }
12137       demand_empty_rest_of_line ();
12138       break;
12139     }
12140
12141   auto_align = 1;
12142 }
12143
12144 void
12145 s_change_section (int ignore ATTRIBUTE_UNUSED)
12146 {
12147 #ifdef OBJ_ELF
12148   char *section_name;
12149   char c;
12150   char next_c = 0;
12151   int section_type;
12152   int section_flag;
12153   int section_entry_size;
12154   int section_alignment;
12155
12156   if (!IS_ELF)
12157     return;
12158
12159   section_name = input_line_pointer;
12160   c = get_symbol_end ();
12161   if (c)
12162     next_c = *(input_line_pointer + 1);
12163
12164   /* Do we have .section Name<,"flags">?  */
12165   if (c != ',' || (c == ',' && next_c == '"'))
12166     {
12167       /* just after name is now '\0'.  */
12168       *input_line_pointer = c;
12169       input_line_pointer = section_name;
12170       obj_elf_section (ignore);
12171       return;
12172     }
12173   input_line_pointer++;
12174
12175   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12176   if (c == ',')
12177     section_type = get_absolute_expression ();
12178   else
12179     section_type = 0;
12180   if (*input_line_pointer++ == ',')
12181     section_flag = get_absolute_expression ();
12182   else
12183     section_flag = 0;
12184   if (*input_line_pointer++ == ',')
12185     section_entry_size = get_absolute_expression ();
12186   else
12187     section_entry_size = 0;
12188   if (*input_line_pointer++ == ',')
12189     section_alignment = get_absolute_expression ();
12190   else
12191     section_alignment = 0;
12192
12193   section_name = xstrdup (section_name);
12194
12195   /* When using the generic form of .section (as implemented by obj-elf.c),
12196      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12197      traditionally had to fall back on the more common @progbits instead.
12198
12199      There's nothing really harmful in this, since bfd will correct
12200      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12201      means that, for backwards compatibility, the special_section entries
12202      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12203
12204      Even so, we shouldn't force users of the MIPS .section syntax to
12205      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12206      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12207      generic type-checking code.  */
12208   if (section_type == SHT_MIPS_DWARF)
12209     section_type = SHT_PROGBITS;
12210
12211   obj_elf_change_section (section_name, section_type, section_flag,
12212                           section_entry_size, 0, 0, 0);
12213
12214   if (now_seg->name != section_name)
12215     free (section_name);
12216 #endif /* OBJ_ELF */
12217 }
12218
12219 void
12220 mips_enable_auto_align (void)
12221 {
12222   auto_align = 1;
12223 }
12224
12225 static void
12226 s_cons (int log_size)
12227 {
12228   segment_info_type *si = seg_info (now_seg);
12229   struct insn_label_list *l = si->label_list;
12230   symbolS *label;
12231
12232   label = l != NULL ? l->label : NULL;
12233   mips_emit_delays ();
12234   if (log_size > 0 && auto_align)
12235     mips_align (log_size, 0, label);
12236   mips_clear_insn_labels ();
12237   cons (1 << log_size);
12238 }
12239
12240 static void
12241 s_float_cons (int type)
12242 {
12243   segment_info_type *si = seg_info (now_seg);
12244   struct insn_label_list *l = si->label_list;
12245   symbolS *label;
12246
12247   label = l != NULL ? l->label : NULL;
12248
12249   mips_emit_delays ();
12250
12251   if (auto_align)
12252     {
12253       if (type == 'd')
12254         mips_align (3, 0, label);
12255       else
12256         mips_align (2, 0, label);
12257     }
12258
12259   mips_clear_insn_labels ();
12260
12261   float_cons (type);
12262 }
12263
12264 /* Handle .globl.  We need to override it because on Irix 5 you are
12265    permitted to say
12266        .globl foo .text
12267    where foo is an undefined symbol, to mean that foo should be
12268    considered to be the address of a function.  */
12269
12270 static void
12271 s_mips_globl (int x ATTRIBUTE_UNUSED)
12272 {
12273   char *name;
12274   int c;
12275   symbolS *symbolP;
12276   flagword flag;
12277
12278   do
12279     {
12280       name = input_line_pointer;
12281       c = get_symbol_end ();
12282       symbolP = symbol_find_or_make (name);
12283       S_SET_EXTERNAL (symbolP);
12284
12285       *input_line_pointer = c;
12286       SKIP_WHITESPACE ();
12287
12288       /* On Irix 5, every global symbol that is not explicitly labelled as
12289          being a function is apparently labelled as being an object.  */
12290       flag = BSF_OBJECT;
12291
12292       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12293           && (*input_line_pointer != ','))
12294         {
12295           char *secname;
12296           asection *sec;
12297
12298           secname = input_line_pointer;
12299           c = get_symbol_end ();
12300           sec = bfd_get_section_by_name (stdoutput, secname);
12301           if (sec == NULL)
12302             as_bad (_("%s: no such section"), secname);
12303           *input_line_pointer = c;
12304
12305           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12306             flag = BSF_FUNCTION;
12307         }
12308
12309       symbol_get_bfdsym (symbolP)->flags |= flag;
12310
12311       c = *input_line_pointer;
12312       if (c == ',')
12313         {
12314           input_line_pointer++;
12315           SKIP_WHITESPACE ();
12316           if (is_end_of_line[(unsigned char) *input_line_pointer])
12317             c = '\n';
12318         }
12319     }
12320   while (c == ',');
12321
12322   demand_empty_rest_of_line ();
12323 }
12324
12325 static void
12326 s_option (int x ATTRIBUTE_UNUSED)
12327 {
12328   char *opt;
12329   char c;
12330
12331   opt = input_line_pointer;
12332   c = get_symbol_end ();
12333
12334   if (*opt == 'O')
12335     {
12336       /* FIXME: What does this mean?  */
12337     }
12338   else if (strncmp (opt, "pic", 3) == 0)
12339     {
12340       int i;
12341
12342       i = atoi (opt + 3);
12343       if (i == 0)
12344         mips_pic = NO_PIC;
12345       else if (i == 2)
12346         {
12347         mips_pic = SVR4_PIC;
12348           mips_abicalls = TRUE;
12349         }
12350       else
12351         as_bad (_(".option pic%d not supported"), i);
12352
12353       if (mips_pic == SVR4_PIC)
12354         {
12355           if (g_switch_seen && g_switch_value != 0)
12356             as_warn (_("-G may not be used with SVR4 PIC code"));
12357           g_switch_value = 0;
12358           bfd_set_gp_size (stdoutput, 0);
12359         }
12360     }
12361   else
12362     as_warn (_("Unrecognized option \"%s\""), opt);
12363
12364   *input_line_pointer = c;
12365   demand_empty_rest_of_line ();
12366 }
12367
12368 /* This structure is used to hold a stack of .set values.  */
12369
12370 struct mips_option_stack
12371 {
12372   struct mips_option_stack *next;
12373   struct mips_set_options options;
12374 };
12375
12376 static struct mips_option_stack *mips_opts_stack;
12377
12378 /* Handle the .set pseudo-op.  */
12379
12380 static void
12381 s_mipsset (int x ATTRIBUTE_UNUSED)
12382 {
12383   char *name = input_line_pointer, ch;
12384
12385   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12386     ++input_line_pointer;
12387   ch = *input_line_pointer;
12388   *input_line_pointer = '\0';
12389
12390   if (strcmp (name, "reorder") == 0)
12391     {
12392       if (mips_opts.noreorder)
12393         end_noreorder ();
12394     }
12395   else if (strcmp (name, "noreorder") == 0)
12396     {
12397       if (!mips_opts.noreorder)
12398         start_noreorder ();
12399     }
12400   else if (strncmp (name, "at=", 3) == 0)
12401     {
12402       char *s = name + 3;
12403
12404       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12405         as_bad (_("Unrecognized register name `%s'"), s);
12406     }
12407   else if (strcmp (name, "at") == 0)
12408     {
12409       mips_opts.at = ATREG;
12410     }
12411   else if (strcmp (name, "noat") == 0)
12412     {
12413       mips_opts.at = ZERO;
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 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14346    nop as "0".  */
14347
14348 char
14349 mips_nop_opcode (void)
14350 {
14351   return seg_info (now_seg)->tc_segment_info_data.mips16;
14352 }
14353
14354 /* Fill in an rs_align_code fragment.  This only needs to do something
14355    for MIPS16 code, where 0 is not a nop.  */
14356
14357 void
14358 mips_handle_align (fragS *fragp)
14359 {
14360   char *p;
14361
14362   if (fragp->fr_type != rs_align_code)
14363     return;
14364
14365   p = fragp->fr_literal + fragp->fr_fix;
14366   if (*p)
14367     {
14368       int bytes;
14369
14370       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14371       if (bytes & 1)
14372         {
14373           *p++ = 0;
14374           fragp->fr_fix++;
14375         }
14376       md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
14377       fragp->fr_var = 2;
14378     }
14379 }
14380
14381 static void
14382 md_obj_begin (void)
14383 {
14384 }
14385
14386 static void
14387 md_obj_end (void)
14388 {
14389   /* Check for premature end, nesting errors, etc.  */
14390   if (cur_proc_ptr)
14391     as_warn (_("missing .end at end of assembly"));
14392 }
14393
14394 static long
14395 get_number (void)
14396 {
14397   int negative = 0;
14398   long val = 0;
14399
14400   if (*input_line_pointer == '-')
14401     {
14402       ++input_line_pointer;
14403       negative = 1;
14404     }
14405   if (!ISDIGIT (*input_line_pointer))
14406     as_bad (_("expected simple number"));
14407   if (input_line_pointer[0] == '0')
14408     {
14409       if (input_line_pointer[1] == 'x')
14410         {
14411           input_line_pointer += 2;
14412           while (ISXDIGIT (*input_line_pointer))
14413             {
14414               val <<= 4;
14415               val |= hex_value (*input_line_pointer++);
14416             }
14417           return negative ? -val : val;
14418         }
14419       else
14420         {
14421           ++input_line_pointer;
14422           while (ISDIGIT (*input_line_pointer))
14423             {
14424               val <<= 3;
14425               val |= *input_line_pointer++ - '0';
14426             }
14427           return negative ? -val : val;
14428         }
14429     }
14430   if (!ISDIGIT (*input_line_pointer))
14431     {
14432       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14433               *input_line_pointer, *input_line_pointer);
14434       as_warn (_("invalid number"));
14435       return -1;
14436     }
14437   while (ISDIGIT (*input_line_pointer))
14438     {
14439       val *= 10;
14440       val += *input_line_pointer++ - '0';
14441     }
14442   return negative ? -val : val;
14443 }
14444
14445 /* The .file directive; just like the usual .file directive, but there
14446    is an initial number which is the ECOFF file index.  In the non-ECOFF
14447    case .file implies DWARF-2.  */
14448
14449 static void
14450 s_mips_file (int x ATTRIBUTE_UNUSED)
14451 {
14452   static int first_file_directive = 0;
14453
14454   if (ECOFF_DEBUGGING)
14455     {
14456       get_number ();
14457       s_app_file (0);
14458     }
14459   else
14460     {
14461       char *filename;
14462
14463       filename = dwarf2_directive_file (0);
14464
14465       /* Versions of GCC up to 3.1 start files with a ".file"
14466          directive even for stabs output.  Make sure that this
14467          ".file" is handled.  Note that you need a version of GCC
14468          after 3.1 in order to support DWARF-2 on MIPS.  */
14469       if (filename != NULL && ! first_file_directive)
14470         {
14471           (void) new_logical_line (filename, -1);
14472           s_app_file_string (filename, 0);
14473         }
14474       first_file_directive = 1;
14475     }
14476 }
14477
14478 /* The .loc directive, implying DWARF-2.  */
14479
14480 static void
14481 s_mips_loc (int x ATTRIBUTE_UNUSED)
14482 {
14483   if (!ECOFF_DEBUGGING)
14484     dwarf2_directive_loc (0);
14485 }
14486
14487 /* The .end directive.  */
14488
14489 static void
14490 s_mips_end (int x ATTRIBUTE_UNUSED)
14491 {
14492   symbolS *p;
14493
14494   /* Following functions need their own .frame and .cprestore directives.  */
14495   mips_frame_reg_valid = 0;
14496   mips_cprestore_valid = 0;
14497
14498   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14499     {
14500       p = get_symbol ();
14501       demand_empty_rest_of_line ();
14502     }
14503   else
14504     p = NULL;
14505
14506   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14507     as_warn (_(".end not in text section"));
14508
14509   if (!cur_proc_ptr)
14510     {
14511       as_warn (_(".end directive without a preceding .ent directive."));
14512       demand_empty_rest_of_line ();
14513       return;
14514     }
14515
14516   if (p != NULL)
14517     {
14518       assert (S_GET_NAME (p));
14519       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14520         as_warn (_(".end symbol does not match .ent symbol."));
14521
14522       if (debug_type == DEBUG_STABS)
14523         stabs_generate_asm_endfunc (S_GET_NAME (p),
14524                                     S_GET_NAME (p));
14525     }
14526   else
14527     as_warn (_(".end directive missing or unknown symbol"));
14528
14529 #ifdef OBJ_ELF
14530   /* Create an expression to calculate the size of the function.  */
14531   if (p && cur_proc_ptr)
14532     {
14533       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14534       expressionS *exp = xmalloc (sizeof (expressionS));
14535
14536       obj->size = exp;
14537       exp->X_op = O_subtract;
14538       exp->X_add_symbol = symbol_temp_new_now ();
14539       exp->X_op_symbol = p;
14540       exp->X_add_number = 0;
14541
14542       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14543     }
14544
14545   /* Generate a .pdr section.  */
14546   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14547     {
14548       segT saved_seg = now_seg;
14549       subsegT saved_subseg = now_subseg;
14550       valueT dot;
14551       expressionS exp;
14552       char *fragp;
14553
14554       dot = frag_now_fix ();
14555
14556 #ifdef md_flush_pending_output
14557       md_flush_pending_output ();
14558 #endif
14559
14560       assert (pdr_seg);
14561       subseg_set (pdr_seg, 0);
14562
14563       /* Write the symbol.  */
14564       exp.X_op = O_symbol;
14565       exp.X_add_symbol = p;
14566       exp.X_add_number = 0;
14567       emit_expr (&exp, 4);
14568
14569       fragp = frag_more (7 * 4);
14570
14571       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
14572       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
14573       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
14574       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
14575       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
14576       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
14577       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
14578
14579       subseg_set (saved_seg, saved_subseg);
14580     }
14581 #endif /* OBJ_ELF */
14582
14583   cur_proc_ptr = NULL;
14584 }
14585
14586 /* The .aent and .ent directives.  */
14587
14588 static void
14589 s_mips_ent (int aent)
14590 {
14591   symbolS *symbolP;
14592
14593   symbolP = get_symbol ();
14594   if (*input_line_pointer == ',')
14595     ++input_line_pointer;
14596   SKIP_WHITESPACE ();
14597   if (ISDIGIT (*input_line_pointer)
14598       || *input_line_pointer == '-')
14599     get_number ();
14600
14601   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14602     as_warn (_(".ent or .aent not in text section."));
14603
14604   if (!aent && cur_proc_ptr)
14605     as_warn (_("missing .end"));
14606
14607   if (!aent)
14608     {
14609       /* This function needs its own .frame and .cprestore directives.  */
14610       mips_frame_reg_valid = 0;
14611       mips_cprestore_valid = 0;
14612
14613       cur_proc_ptr = &cur_proc;
14614       memset (cur_proc_ptr, '\0', sizeof (procS));
14615
14616       cur_proc_ptr->func_sym = symbolP;
14617
14618       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
14619
14620       ++numprocs;
14621
14622       if (debug_type == DEBUG_STABS)
14623         stabs_generate_asm_func (S_GET_NAME (symbolP),
14624                                  S_GET_NAME (symbolP));
14625     }
14626
14627   demand_empty_rest_of_line ();
14628 }
14629
14630 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
14631    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
14632    s_mips_frame is used so that we can set the PDR information correctly.
14633    We can't use the ecoff routines because they make reference to the ecoff
14634    symbol table (in the mdebug section).  */
14635
14636 static void
14637 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
14638 {
14639 #ifdef OBJ_ELF
14640   if (IS_ELF && !ECOFF_DEBUGGING)
14641     {
14642       long val;
14643
14644       if (cur_proc_ptr == (procS *) NULL)
14645         {
14646           as_warn (_(".frame outside of .ent"));
14647           demand_empty_rest_of_line ();
14648           return;
14649         }
14650
14651       cur_proc_ptr->frame_reg = tc_get_register (1);
14652
14653       SKIP_WHITESPACE ();
14654       if (*input_line_pointer++ != ','
14655           || get_absolute_expression_and_terminator (&val) != ',')
14656         {
14657           as_warn (_("Bad .frame directive"));
14658           --input_line_pointer;
14659           demand_empty_rest_of_line ();
14660           return;
14661         }
14662
14663       cur_proc_ptr->frame_offset = val;
14664       cur_proc_ptr->pc_reg = tc_get_register (0);
14665
14666       demand_empty_rest_of_line ();
14667     }
14668   else
14669 #endif /* OBJ_ELF */
14670     s_ignore (ignore);
14671 }
14672
14673 /* The .fmask and .mask directives. If the mdebug section is present
14674    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
14675    embedded targets, s_mips_mask is used so that we can set the PDR
14676    information correctly. We can't use the ecoff routines because they
14677    make reference to the ecoff symbol table (in the mdebug section).  */
14678
14679 static void
14680 s_mips_mask (int reg_type)
14681 {
14682 #ifdef OBJ_ELF
14683   if (IS_ELF && !ECOFF_DEBUGGING)
14684     {
14685       long mask, off;
14686
14687       if (cur_proc_ptr == (procS *) NULL)
14688         {
14689           as_warn (_(".mask/.fmask outside of .ent"));
14690           demand_empty_rest_of_line ();
14691           return;
14692         }
14693
14694       if (get_absolute_expression_and_terminator (&mask) != ',')
14695         {
14696           as_warn (_("Bad .mask/.fmask directive"));
14697           --input_line_pointer;
14698           demand_empty_rest_of_line ();
14699           return;
14700         }
14701
14702       off = get_absolute_expression ();
14703
14704       if (reg_type == 'F')
14705         {
14706           cur_proc_ptr->fpreg_mask = mask;
14707           cur_proc_ptr->fpreg_offset = off;
14708         }
14709       else
14710         {
14711           cur_proc_ptr->reg_mask = mask;
14712           cur_proc_ptr->reg_offset = off;
14713         }
14714
14715       demand_empty_rest_of_line ();
14716     }
14717   else
14718 #endif /* OBJ_ELF */
14719     s_ignore (reg_type);
14720 }
14721
14722 /* A table describing all the processors gas knows about.  Names are
14723    matched in the order listed.
14724
14725    To ease comparison, please keep this table in the same order as
14726    gcc's mips_cpu_info_table[].  */
14727 static const struct mips_cpu_info mips_cpu_info_table[] =
14728 {
14729   /* Entries for generic ISAs */
14730   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
14731   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
14732   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
14733   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
14734   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
14735   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
14736   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
14737   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
14738   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
14739
14740   /* MIPS I */
14741   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
14742   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
14743   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
14744
14745   /* MIPS II */
14746   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
14747
14748   /* MIPS III */
14749   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
14750   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
14751   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
14752   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
14753   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
14754   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
14755   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
14756   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
14757   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
14758   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
14759   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
14760   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
14761
14762   /* MIPS IV */
14763   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
14764   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
14765   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
14766   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
14767   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
14768   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
14769   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
14770   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
14771   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
14772   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
14773   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
14774   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
14775   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
14776
14777   /* MIPS 32 */
14778   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14779   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14780   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
14781   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
14782
14783   /* MIPS 32 Release 2 */
14784   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14785   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14786   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14787   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
14788   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14789   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14790   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14791   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14792   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14793   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14794   /* Deprecated forms of the above.  */
14795   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14796   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
14797   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
14798   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14799   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14800   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14801   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14802   /* Deprecated forms of the above.  */
14803   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14804   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
14805   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
14806   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14807                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14808   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14809                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14810   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14811                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14812   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14813                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14814   /* Deprecated forms of the above.  */
14815   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14816                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14817   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
14818                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14819   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
14820   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14821                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14822   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14823                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14824   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14825                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14826   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14827                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14828   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14829                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14830   /* Deprecated forms of the above.  */
14831   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14832                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14833   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
14834                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
14835
14836   /* MIPS 64 */
14837   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
14838   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
14839   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
14840   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
14841
14842   /* MIPS 64 Release 2 */
14843
14844   /* Broadcom SB-1 CPU core */
14845   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14846                                                 ISA_MIPS64,     CPU_SB1 },
14847   /* Broadcom SB-1A CPU core */
14848   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
14849                                                 ISA_MIPS64,     CPU_SB1 },
14850
14851   /* ST Microelectronics Loongson 2E and 2F cores */
14852   { "loongson2e",     0,      ISA_MIPS3,      CPU_LOONGSON_2E },
14853   { "loongson2f",     0,      ISA_MIPS3,      CPU_LOONGSON_2F },
14854
14855   /* End marker */
14856   { NULL, 0, 0, 0 }
14857 };
14858
14859
14860 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
14861    with a final "000" replaced by "k".  Ignore case.
14862
14863    Note: this function is shared between GCC and GAS.  */
14864
14865 static bfd_boolean
14866 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
14867 {
14868   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
14869     given++, canonical++;
14870
14871   return ((*given == 0 && *canonical == 0)
14872           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
14873 }
14874
14875
14876 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
14877    CPU name.  We've traditionally allowed a lot of variation here.
14878
14879    Note: this function is shared between GCC and GAS.  */
14880
14881 static bfd_boolean
14882 mips_matching_cpu_name_p (const char *canonical, const char *given)
14883 {
14884   /* First see if the name matches exactly, or with a final "000"
14885      turned into "k".  */
14886   if (mips_strict_matching_cpu_name_p (canonical, given))
14887     return TRUE;
14888
14889   /* If not, try comparing based on numerical designation alone.
14890      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
14891   if (TOLOWER (*given) == 'r')
14892     given++;
14893   if (!ISDIGIT (*given))
14894     return FALSE;
14895
14896   /* Skip over some well-known prefixes in the canonical name,
14897      hoping to find a number there too.  */
14898   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
14899     canonical += 2;
14900   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
14901     canonical += 2;
14902   else if (TOLOWER (canonical[0]) == 'r')
14903     canonical += 1;
14904
14905   return mips_strict_matching_cpu_name_p (canonical, given);
14906 }
14907
14908
14909 /* Parse an option that takes the name of a processor as its argument.
14910    OPTION is the name of the option and CPU_STRING is the argument.
14911    Return the corresponding processor enumeration if the CPU_STRING is
14912    recognized, otherwise report an error and return null.
14913
14914    A similar function exists in GCC.  */
14915
14916 static const struct mips_cpu_info *
14917 mips_parse_cpu (const char *option, const char *cpu_string)
14918 {
14919   const struct mips_cpu_info *p;
14920
14921   /* 'from-abi' selects the most compatible architecture for the given
14922      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
14923      EABIs, we have to decide whether we're using the 32-bit or 64-bit
14924      version.  Look first at the -mgp options, if given, otherwise base
14925      the choice on MIPS_DEFAULT_64BIT.
14926
14927      Treat NO_ABI like the EABIs.  One reason to do this is that the
14928      plain 'mips' and 'mips64' configs have 'from-abi' as their default
14929      architecture.  This code picks MIPS I for 'mips' and MIPS III for
14930      'mips64', just as we did in the days before 'from-abi'.  */
14931   if (strcasecmp (cpu_string, "from-abi") == 0)
14932     {
14933       if (ABI_NEEDS_32BIT_REGS (mips_abi))
14934         return mips_cpu_info_from_isa (ISA_MIPS1);
14935
14936       if (ABI_NEEDS_64BIT_REGS (mips_abi))
14937         return mips_cpu_info_from_isa (ISA_MIPS3);
14938
14939       if (file_mips_gp32 >= 0)
14940         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
14941
14942       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
14943                                      ? ISA_MIPS3
14944                                      : ISA_MIPS1);
14945     }
14946
14947   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
14948   if (strcasecmp (cpu_string, "default") == 0)
14949     return 0;
14950
14951   for (p = mips_cpu_info_table; p->name != 0; p++)
14952     if (mips_matching_cpu_name_p (p->name, cpu_string))
14953       return p;
14954
14955   as_bad ("Bad value (%s) for %s", cpu_string, option);
14956   return 0;
14957 }
14958
14959 /* Return the canonical processor information for ISA (a member of the
14960    ISA_MIPS* enumeration).  */
14961
14962 static const struct mips_cpu_info *
14963 mips_cpu_info_from_isa (int isa)
14964 {
14965   int i;
14966
14967   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14968     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
14969         && isa == mips_cpu_info_table[i].isa)
14970       return (&mips_cpu_info_table[i]);
14971
14972   return NULL;
14973 }
14974
14975 static const struct mips_cpu_info *
14976 mips_cpu_info_from_arch (int arch)
14977 {
14978   int i;
14979
14980   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
14981     if (arch == mips_cpu_info_table[i].cpu)
14982       return (&mips_cpu_info_table[i]);
14983
14984   return NULL;
14985 }
14986 \f
14987 static void
14988 show (FILE *stream, const char *string, int *col_p, int *first_p)
14989 {
14990   if (*first_p)
14991     {
14992       fprintf (stream, "%24s", "");
14993       *col_p = 24;
14994     }
14995   else
14996     {
14997       fprintf (stream, ", ");
14998       *col_p += 2;
14999     }
15000
15001   if (*col_p + strlen (string) > 72)
15002     {
15003       fprintf (stream, "\n%24s", "");
15004       *col_p = 24;
15005     }
15006
15007   fprintf (stream, "%s", string);
15008   *col_p += strlen (string);
15009
15010   *first_p = 0;
15011 }
15012
15013 void
15014 md_show_usage (FILE *stream)
15015 {
15016   int column, first;
15017   size_t i;
15018
15019   fprintf (stream, _("\
15020 MIPS options:\n\
15021 -EB                     generate big endian output\n\
15022 -EL                     generate little endian output\n\
15023 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15024 -G NUM                  allow referencing objects up to NUM bytes\n\
15025                         implicitly with the gp register [default 8]\n"));
15026   fprintf (stream, _("\
15027 -mips1                  generate MIPS ISA I instructions\n\
15028 -mips2                  generate MIPS ISA II instructions\n\
15029 -mips3                  generate MIPS ISA III instructions\n\
15030 -mips4                  generate MIPS ISA IV instructions\n\
15031 -mips5                  generate MIPS ISA V instructions\n\
15032 -mips32                 generate MIPS32 ISA instructions\n\
15033 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15034 -mips64                 generate MIPS64 ISA instructions\n\
15035 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15036 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15037
15038   first = 1;
15039
15040   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15041     show (stream, mips_cpu_info_table[i].name, &column, &first);
15042   show (stream, "from-abi", &column, &first);
15043   fputc ('\n', stream);
15044
15045   fprintf (stream, _("\
15046 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15047 -no-mCPU                don't generate code specific to CPU.\n\
15048                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15049
15050   first = 1;
15051
15052   show (stream, "3900", &column, &first);
15053   show (stream, "4010", &column, &first);
15054   show (stream, "4100", &column, &first);
15055   show (stream, "4650", &column, &first);
15056   fputc ('\n', stream);
15057
15058   fprintf (stream, _("\
15059 -mips16                 generate mips16 instructions\n\
15060 -no-mips16              do not generate mips16 instructions\n"));
15061   fprintf (stream, _("\
15062 -msmartmips             generate smartmips instructions\n\
15063 -mno-smartmips          do not generate smartmips instructions\n"));  
15064   fprintf (stream, _("\
15065 -mdsp                   generate DSP instructions\n\
15066 -mno-dsp                do not generate DSP instructions\n"));
15067   fprintf (stream, _("\
15068 -mdspr2                 generate DSP R2 instructions\n\
15069 -mno-dspr2              do not generate DSP R2 instructions\n"));
15070   fprintf (stream, _("\
15071 -mmt                    generate MT instructions\n\
15072 -mno-mt                 do not generate MT instructions\n"));
15073   fprintf (stream, _("\
15074 -mfix-vr4120            work around certain VR4120 errata\n\
15075 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15076 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15077 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15078 -msym32                 assume all symbols have 32-bit values\n\
15079 -O0                     remove unneeded NOPs, do not swap branches\n\
15080 -O                      remove unneeded NOPs and swap branches\n\
15081 --[no-]construct-floats [dis]allow floating point values to be constructed\n\
15082 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15083 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15084 #ifdef OBJ_ELF
15085   fprintf (stream, _("\
15086 -KPIC, -call_shared     generate SVR4 position independent code\n\
15087 -mvxworks-pic           generate VxWorks position independent code\n\
15088 -non_shared             do not generate position independent code\n\
15089 -xgot                   assume a 32 bit GOT\n\
15090 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15091 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15092                         position dependent (non shared) code\n\
15093 -mabi=ABI               create ABI conformant object file for:\n"));
15094
15095   first = 1;
15096
15097   show (stream, "32", &column, &first);
15098   show (stream, "o64", &column, &first);
15099   show (stream, "n32", &column, &first);
15100   show (stream, "64", &column, &first);
15101   show (stream, "eabi", &column, &first);
15102
15103   fputc ('\n', stream);
15104
15105   fprintf (stream, _("\
15106 -32                     create o32 ABI object file (default)\n\
15107 -n32                    create n32 ABI object file\n\
15108 -64                     create 64 ABI object file\n"));
15109 #endif
15110 }
15111
15112 enum dwarf2_format
15113 mips_dwarf2_format (void)
15114 {
15115   if (HAVE_64BIT_SYMBOLS)
15116     {
15117 #ifdef TE_IRIX
15118       return dwarf2_format_64bit_irix;
15119 #else
15120       return dwarf2_format_64bit;
15121 #endif
15122     }
15123   else
15124     return dwarf2_format_32bit;
15125 }
15126
15127 int
15128 mips_dwarf2_addr_size (void)
15129 {
15130   if (HAVE_64BIT_SYMBOLS)
15131     return 8;
15132   else
15133     return 4;
15134 }
15135
15136 /* Standard calling conventions leave the CFA at SP on entry.  */
15137 void
15138 mips_cfi_frame_initial_instructions (void)
15139 {
15140   cfi_add_CFA_def_cfa_register (SP);
15141 }
15142
15143 int
15144 tc_mips_regname_to_dw2regnum (char *regname)
15145 {
15146   unsigned int regnum = -1;
15147   unsigned int reg;
15148
15149   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15150     regnum = reg;
15151
15152   return regnum;
15153 }