2009-08-05 Chao-ying Fu <fu@mips.com>
[external/binutils.git] / gas / config / tc-mips.c
1 /* tc-mips.c -- assemble code for a MIPS chip.
2    Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3    2003, 2004, 2005, 2006, 2007, 2008, 2009  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   /* True if floating-point operations are not allowed.  Changed by .set
239      softfloat or .set hardfloat, by command line options -msoft-float or
240      -mhard-float.  The default is false.  */
241   bfd_boolean soft_float;
242
243   /* True if only single-precision floating-point operations are allowed.
244      Changed by .set singlefloat or .set doublefloat, command-line options
245      -msingle-float or -mdouble-float.  The default is false.  */
246   bfd_boolean single_float;
247 };
248
249 /* This is the struct we use to hold the current set of options.  Note
250    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
251    -1 to indicate that they have not been initialized.  */
252
253 /* True if -mgp32 was passed.  */
254 static int file_mips_gp32 = -1;
255
256 /* True if -mfp32 was passed.  */
257 static int file_mips_fp32 = -1;
258
259 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
260 static int file_mips_soft_float = 0;
261
262 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
263 static int file_mips_single_float = 0;
264
265 static struct mips_set_options mips_opts =
266 {
267   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
268   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
269   /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
270   /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
271   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
272   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
273 };
274
275 /* These variables are filled in with the masks of registers used.
276    The object format code reads them and puts them in the appropriate
277    place.  */
278 unsigned long mips_gprmask;
279 unsigned long mips_cprmask[4];
280
281 /* MIPS ISA we are using for this output file.  */
282 static int file_mips_isa = ISA_UNKNOWN;
283
284 /* True if -mips16 was passed or implied by arguments passed on the
285    command line (e.g., by -march).  */
286 static int file_ase_mips16;
287
288 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
289                               || mips_opts.isa == ISA_MIPS32R2          \
290                               || mips_opts.isa == ISA_MIPS64            \
291                               || mips_opts.isa == ISA_MIPS64R2)
292
293 /* True if we want to create R_MIPS_JALR for jalr $25.  */
294 #ifdef TE_IRIX
295 #define MIPS_JALR_HINT_P HAVE_NEWABI
296 #else
297 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  */
298 #define MIPS_JALR_HINT_P 1
299 #endif
300
301 /* True if -mips3d was passed or implied by arguments passed on the
302    command line (e.g., by -march).  */
303 static int file_ase_mips3d;
304
305 /* True if -mdmx was passed or implied by arguments passed on the
306    command line (e.g., by -march).  */
307 static int file_ase_mdmx;
308
309 /* True if -msmartmips was passed or implied by arguments passed on the
310    command line (e.g., by -march).  */
311 static int file_ase_smartmips;
312
313 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
314                                 || mips_opts.isa == ISA_MIPS32R2)
315
316 /* True if -mdsp was passed or implied by arguments passed on the
317    command line (e.g., by -march).  */
318 static int file_ase_dsp;
319
320 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
321                               || mips_opts.isa == ISA_MIPS64R2)
322
323 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
324
325 /* True if -mdspr2 was passed or implied by arguments passed on the
326    command line (e.g., by -march).  */
327 static int file_ase_dspr2;
328
329 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
330                                 || mips_opts.isa == ISA_MIPS64R2)
331
332 /* True if -mmt was passed or implied by arguments passed on the
333    command line (e.g., by -march).  */
334 static int file_ase_mt;
335
336 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
337                              || mips_opts.isa == ISA_MIPS64R2)
338
339 /* The argument of the -march= flag.  The architecture we are assembling.  */
340 static int file_mips_arch = CPU_UNKNOWN;
341 static const char *mips_arch_string;
342
343 /* The argument of the -mtune= flag.  The architecture for which we
344    are optimizing.  */
345 static int mips_tune = CPU_UNKNOWN;
346 static const char *mips_tune_string;
347
348 /* True when generating 32-bit code for a 64-bit processor.  */
349 static int mips_32bitmode = 0;
350
351 /* True if the given ABI requires 32-bit registers.  */
352 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
353
354 /* Likewise 64-bit registers.  */
355 #define ABI_NEEDS_64BIT_REGS(ABI)       \
356   ((ABI) == N32_ABI                     \
357    || (ABI) == N64_ABI                  \
358    || (ABI) == O64_ABI)
359
360 /*  Return true if ISA supports 64 bit wide gp registers.  */
361 #define ISA_HAS_64BIT_REGS(ISA)         \
362   ((ISA) == ISA_MIPS3                   \
363    || (ISA) == ISA_MIPS4                \
364    || (ISA) == ISA_MIPS5                \
365    || (ISA) == ISA_MIPS64               \
366    || (ISA) == ISA_MIPS64R2)
367
368 /*  Return true if ISA supports 64 bit wide float registers.  */
369 #define ISA_HAS_64BIT_FPRS(ISA)         \
370   ((ISA) == ISA_MIPS3                   \
371    || (ISA) == ISA_MIPS4                \
372    || (ISA) == ISA_MIPS5                \
373    || (ISA) == ISA_MIPS32R2             \
374    || (ISA) == ISA_MIPS64               \
375    || (ISA) == ISA_MIPS64R2)
376
377 /* Return true if ISA supports 64-bit right rotate (dror et al.)
378    instructions.  */
379 #define ISA_HAS_DROR(ISA)               \
380   ((ISA) == ISA_MIPS64R2)
381
382 /* Return true if ISA supports 32-bit right rotate (ror et al.)
383    instructions.  */
384 #define ISA_HAS_ROR(ISA)                \
385   ((ISA) == ISA_MIPS32R2                \
386    || (ISA) == ISA_MIPS64R2             \
387    || mips_opts.ase_smartmips)
388
389 /* Return true if ISA supports single-precision floats in odd registers.  */
390 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
391   ((ISA) == ISA_MIPS32                  \
392    || (ISA) == ISA_MIPS32R2             \
393    || (ISA) == ISA_MIPS64               \
394    || (ISA) == ISA_MIPS64R2)
395
396 /* Return true if ISA supports move to/from high part of a 64-bit
397    floating-point register. */
398 #define ISA_HAS_MXHC1(ISA)              \
399   ((ISA) == ISA_MIPS32R2                \
400    || (ISA) == ISA_MIPS64R2)
401
402 #define HAVE_32BIT_GPRS                            \
403     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
404
405 #define HAVE_32BIT_FPRS                            \
406     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
407
408 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
409 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
410
411 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
412
413 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
414
415 /* True if relocations are stored in-place.  */
416 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
417
418 /* The ABI-derived address size.  */
419 #define HAVE_64BIT_ADDRESSES \
420   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
421 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
422
423 /* The size of symbolic constants (i.e., expressions of the form
424    "SYMBOL" or "SYMBOL + OFFSET").  */
425 #define HAVE_32BIT_SYMBOLS \
426   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
427 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
428
429 /* Addresses are loaded in different ways, depending on the address size
430    in use.  The n32 ABI Documentation also mandates the use of additions
431    with overflow checking, but existing implementations don't follow it.  */
432 #define ADDRESS_ADD_INSN                                                \
433    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
434
435 #define ADDRESS_ADDI_INSN                                               \
436    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
437
438 #define ADDRESS_LOAD_INSN                                               \
439    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
440
441 #define ADDRESS_STORE_INSN                                              \
442    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
443
444 /* Return true if the given CPU supports the MIPS16 ASE.  */
445 #define CPU_HAS_MIPS16(cpu)                                             \
446    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
447     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
448
449 /* True if CPU has a dror instruction.  */
450 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
451
452 /* True if CPU has a ror instruction.  */
453 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
454
455 /* True if CPU has seq/sne and seqi/snei instructions.  */
456 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
457
458 /* True if CPU does not implement the all the coprocessor insns.  For these
459    CPUs only those COP insns are accepted that are explicitly marked to be
460    available on the CPU.  ISA membership for COP insns is ignored.  */
461 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
462
463 /* True if mflo and mfhi can be immediately followed by instructions
464    which write to the HI and LO registers.
465
466    According to MIPS specifications, MIPS ISAs I, II, and III need
467    (at least) two instructions between the reads of HI/LO and
468    instructions which write them, and later ISAs do not.  Contradicting
469    the MIPS specifications, some MIPS IV processor user manuals (e.g.
470    the UM for the NEC Vr5000) document needing the instructions between
471    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
472    MIPS64 and later ISAs to have the interlocks, plus any specific
473    earlier-ISA CPUs for which CPU documentation declares that the
474    instructions are really interlocked.  */
475 #define hilo_interlocks \
476   (mips_opts.isa == ISA_MIPS32                        \
477    || mips_opts.isa == ISA_MIPS32R2                   \
478    || mips_opts.isa == ISA_MIPS64                     \
479    || mips_opts.isa == ISA_MIPS64R2                   \
480    || mips_opts.arch == CPU_R4010                     \
481    || mips_opts.arch == CPU_R10000                    \
482    || mips_opts.arch == CPU_R12000                    \
483    || mips_opts.arch == CPU_R14000                    \
484    || mips_opts.arch == CPU_R16000                    \
485    || mips_opts.arch == CPU_RM7000                    \
486    || mips_opts.arch == CPU_VR5500                    \
487    )
488
489 /* Whether the processor uses hardware interlocks to protect reads
490    from the GPRs after they are loaded from memory, and thus does not
491    require nops to be inserted.  This applies to instructions marked
492    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
493    level I.  */
494 #define gpr_interlocks \
495   (mips_opts.isa != ISA_MIPS1  \
496    || mips_opts.arch == CPU_R3900)
497
498 /* Whether the processor uses hardware interlocks to avoid delays
499    required by coprocessor instructions, and thus does not require
500    nops to be inserted.  This applies to instructions marked
501    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
502    between instructions marked INSN_WRITE_COND_CODE and ones marked
503    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
504    levels I, II, and III.  */
505 /* Itbl support may require additional care here.  */
506 #define cop_interlocks                                \
507   ((mips_opts.isa != ISA_MIPS1                        \
508     && mips_opts.isa != ISA_MIPS2                     \
509     && mips_opts.isa != ISA_MIPS3)                    \
510    || mips_opts.arch == CPU_R4300                     \
511    )
512
513 /* Whether the processor uses hardware interlocks to protect reads
514    from coprocessor registers after they are loaded from memory, and
515    thus does not require nops to be inserted.  This applies to
516    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
517    requires at MIPS ISA level I.  */
518 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
519
520 /* Is this a mfhi or mflo instruction?  */
521 #define MF_HILO_INSN(PINFO) \
522   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
523
524 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
525    or writing the condition code is only possible on the coprocessors and
526    these insns are not marked with INSN_COP.  Thus for these insns use the
527    condition-code flags.  */
528 #define COP_INSN(PINFO)                                                 \
529   (PINFO != INSN_MACRO                                                  \
530    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
531    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
532
533 /* MIPS PIC level.  */
534
535 enum mips_pic_level mips_pic;
536
537 /* 1 if we should generate 32 bit offsets from the $gp register in
538    SVR4_PIC mode.  Currently has no meaning in other modes.  */
539 static int mips_big_got = 0;
540
541 /* 1 if trap instructions should used for overflow rather than break
542    instructions.  */
543 static int mips_trap = 0;
544
545 /* 1 if double width floating point constants should not be constructed
546    by assembling two single width halves into two single width floating
547    point registers which just happen to alias the double width destination
548    register.  On some architectures this aliasing can be disabled by a bit
549    in the status register, and the setting of this bit cannot be determined
550    automatically at assemble time.  */
551 static int mips_disable_float_construction;
552
553 /* Non-zero if any .set noreorder directives were used.  */
554
555 static int mips_any_noreorder;
556
557 /* Non-zero if nops should be inserted when the register referenced in
558    an mfhi/mflo instruction is read in the next two instructions.  */
559 static int mips_7000_hilo_fix;
560
561 /* The size of objects in the small data section.  */
562 static unsigned int g_switch_value = 8;
563 /* Whether the -G option was used.  */
564 static int g_switch_seen = 0;
565
566 #define N_RMASK 0xc4
567 #define N_VFP   0xd4
568
569 /* If we can determine in advance that GP optimization won't be
570    possible, we can skip the relaxation stuff that tries to produce
571    GP-relative references.  This makes delay slot optimization work
572    better.
573
574    This function can only provide a guess, but it seems to work for
575    gcc output.  It needs to guess right for gcc, otherwise gcc
576    will put what it thinks is a GP-relative instruction in a branch
577    delay slot.
578
579    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
580    fixed it for the non-PIC mode.  KR 95/04/07  */
581 static int nopic_need_relax (symbolS *, int);
582
583 /* handle of the OPCODE hash table */
584 static struct hash_control *op_hash = NULL;
585
586 /* The opcode hash table we use for the mips16.  */
587 static struct hash_control *mips16_op_hash = NULL;
588
589 /* This array holds the chars that always start a comment.  If the
590     pre-processor is disabled, these aren't very useful */
591 const char comment_chars[] = "#";
592
593 /* This array holds the chars that only start a comment at the beginning of
594    a line.  If the line seems to have the form '# 123 filename'
595    .line and .file directives will appear in the pre-processed output */
596 /* Note that input_file.c hand checks for '#' at the beginning of the
597    first line of the input file.  This is because the compiler outputs
598    #NO_APP at the beginning of its output.  */
599 /* Also note that C style comments are always supported.  */
600 const char line_comment_chars[] = "#";
601
602 /* This array holds machine specific line separator characters.  */
603 const char line_separator_chars[] = ";";
604
605 /* Chars that can be used to separate mant from exp in floating point nums */
606 const char EXP_CHARS[] = "eE";
607
608 /* Chars that mean this number is a floating point constant */
609 /* As in 0f12.456 */
610 /* or    0d1.2345e12 */
611 const char FLT_CHARS[] = "rRsSfFdDxXpP";
612
613 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
614    changed in read.c .  Ideally it shouldn't have to know about it at all,
615    but nothing is ideal around here.
616  */
617
618 static char *insn_error;
619
620 static int auto_align = 1;
621
622 /* When outputting SVR4 PIC code, the assembler needs to know the
623    offset in the stack frame from which to restore the $gp register.
624    This is set by the .cprestore pseudo-op, and saved in this
625    variable.  */
626 static offsetT mips_cprestore_offset = -1;
627
628 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
629    more optimizations, it can use a register value instead of a memory-saved
630    offset and even an other register than $gp as global pointer.  */
631 static offsetT mips_cpreturn_offset = -1;
632 static int mips_cpreturn_register = -1;
633 static int mips_gp_register = GP;
634 static int mips_gprel_offset = 0;
635
636 /* Whether mips_cprestore_offset has been set in the current function
637    (or whether it has already been warned about, if not).  */
638 static int mips_cprestore_valid = 0;
639
640 /* This is the register which holds the stack frame, as set by the
641    .frame pseudo-op.  This is needed to implement .cprestore.  */
642 static int mips_frame_reg = SP;
643
644 /* Whether mips_frame_reg has been set in the current function
645    (or whether it has already been warned about, if not).  */
646 static int mips_frame_reg_valid = 0;
647
648 /* To output NOP instructions correctly, we need to keep information
649    about the previous two instructions.  */
650
651 /* Whether we are optimizing.  The default value of 2 means to remove
652    unneeded NOPs and swap branch instructions when possible.  A value
653    of 1 means to not swap branches.  A value of 0 means to always
654    insert NOPs.  */
655 static int mips_optimize = 2;
656
657 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
658    equivalent to seeing no -g option at all.  */
659 static int mips_debug = 0;
660
661 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
662 #define MAX_VR4130_NOPS 4
663
664 /* The maximum number of NOPs needed to fill delay slots.  */
665 #define MAX_DELAY_NOPS 2
666
667 /* The maximum number of NOPs needed for any purpose.  */
668 #define MAX_NOPS 4
669
670 /* A list of previous instructions, with index 0 being the most recent.
671    We need to look back MAX_NOPS instructions when filling delay slots
672    or working around processor errata.  We need to look back one
673    instruction further if we're thinking about using history[0] to
674    fill a branch delay slot.  */
675 static struct mips_cl_insn history[1 + MAX_NOPS];
676
677 /* Nop instructions used by emit_nop.  */
678 static struct mips_cl_insn nop_insn, mips16_nop_insn;
679
680 /* The appropriate nop for the current mode.  */
681 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
682
683 /* If this is set, it points to a frag holding nop instructions which
684    were inserted before the start of a noreorder section.  If those
685    nops turn out to be unnecessary, the size of the frag can be
686    decreased.  */
687 static fragS *prev_nop_frag;
688
689 /* The number of nop instructions we created in prev_nop_frag.  */
690 static int prev_nop_frag_holds;
691
692 /* The number of nop instructions that we know we need in
693    prev_nop_frag.  */
694 static int prev_nop_frag_required;
695
696 /* The number of instructions we've seen since prev_nop_frag.  */
697 static int prev_nop_frag_since;
698
699 /* For ECOFF and ELF, relocations against symbols are done in two
700    parts, with a HI relocation and a LO relocation.  Each relocation
701    has only 16 bits of space to store an addend.  This means that in
702    order for the linker to handle carries correctly, it must be able
703    to locate both the HI and the LO relocation.  This means that the
704    relocations must appear in order in the relocation table.
705
706    In order to implement this, we keep track of each unmatched HI
707    relocation.  We then sort them so that they immediately precede the
708    corresponding LO relocation.  */
709
710 struct mips_hi_fixup
711 {
712   /* Next HI fixup.  */
713   struct mips_hi_fixup *next;
714   /* This fixup.  */
715   fixS *fixp;
716   /* The section this fixup is in.  */
717   segT seg;
718 };
719
720 /* The list of unmatched HI relocs.  */
721
722 static struct mips_hi_fixup *mips_hi_fixup_list;
723
724 /* The frag containing the last explicit relocation operator.
725    Null if explicit relocations have not been used.  */
726
727 static fragS *prev_reloc_op_frag;
728
729 /* Map normal MIPS register numbers to mips16 register numbers.  */
730
731 #define X ILLEGAL_REG
732 static const int mips32_to_16_reg_map[] =
733 {
734   X, X, 2, 3, 4, 5, 6, 7,
735   X, X, X, X, X, X, X, X,
736   0, 1, X, X, X, X, X, X,
737   X, X, X, X, X, X, X, X
738 };
739 #undef X
740
741 /* Map mips16 register numbers to normal MIPS register numbers.  */
742
743 static const unsigned int mips16_to_32_reg_map[] =
744 {
745   16, 17, 2, 3, 4, 5, 6, 7
746 };
747
748 /* Classifies the kind of instructions we're interested in when
749    implementing -mfix-vr4120.  */
750 enum fix_vr4120_class {
751   FIX_VR4120_MACC,
752   FIX_VR4120_DMACC,
753   FIX_VR4120_MULT,
754   FIX_VR4120_DMULT,
755   FIX_VR4120_DIV,
756   FIX_VR4120_MTHILO,
757   NUM_FIX_VR4120_CLASSES
758 };
759
760 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
761    there must be at least one other instruction between an instruction
762    of type X and an instruction of type Y.  */
763 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
764
765 /* True if -mfix-vr4120 is in force.  */
766 static int mips_fix_vr4120;
767
768 /* ...likewise -mfix-vr4130.  */
769 static int mips_fix_vr4130;
770
771 /* ...likewise -mfix-24k.  */
772 static int mips_fix_24k;
773
774 /* We don't relax branches by default, since this causes us to expand
775    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
776    fail to compute the offset before expanding the macro to the most
777    efficient expansion.  */
778
779 static int mips_relax_branch;
780 \f
781 /* The expansion of many macros depends on the type of symbol that
782    they refer to.  For example, when generating position-dependent code,
783    a macro that refers to a symbol may have two different expansions,
784    one which uses GP-relative addresses and one which uses absolute
785    addresses.  When generating SVR4-style PIC, a macro may have
786    different expansions for local and global symbols.
787
788    We handle these situations by generating both sequences and putting
789    them in variant frags.  In position-dependent code, the first sequence
790    will be the GP-relative one and the second sequence will be the
791    absolute one.  In SVR4 PIC, the first sequence will be for global
792    symbols and the second will be for local symbols.
793
794    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
795    SECOND are the lengths of the two sequences in bytes.  These fields
796    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
797    the subtype has the following flags:
798
799    RELAX_USE_SECOND
800         Set if it has been decided that we should use the second
801         sequence instead of the first.
802
803    RELAX_SECOND_LONGER
804         Set in the first variant frag if the macro's second implementation
805         is longer than its first.  This refers to the macro as a whole,
806         not an individual relaxation.
807
808    RELAX_NOMACRO
809         Set in the first variant frag if the macro appeared in a .set nomacro
810         block and if one alternative requires a warning but the other does not.
811
812    RELAX_DELAY_SLOT
813         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
814         delay slot.
815
816    The frag's "opcode" points to the first fixup for relaxable code.
817
818    Relaxable macros are generated using a sequence such as:
819
820       relax_start (SYMBOL);
821       ... generate first expansion ...
822       relax_switch ();
823       ... generate second expansion ...
824       relax_end ();
825
826    The code and fixups for the unwanted alternative are discarded
827    by md_convert_frag.  */
828 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
829
830 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
831 #define RELAX_SECOND(X) ((X) & 0xff)
832 #define RELAX_USE_SECOND 0x10000
833 #define RELAX_SECOND_LONGER 0x20000
834 #define RELAX_NOMACRO 0x40000
835 #define RELAX_DELAY_SLOT 0x80000
836
837 /* Branch without likely bit.  If label is out of range, we turn:
838
839         beq reg1, reg2, label
840         delay slot
841
842    into
843
844         bne reg1, reg2, 0f
845         nop
846         j label
847      0: delay slot
848
849    with the following opcode replacements:
850
851         beq <-> bne
852         blez <-> bgtz
853         bltz <-> bgez
854         bc1f <-> bc1t
855
856         bltzal <-> bgezal  (with jal label instead of j label)
857
858    Even though keeping the delay slot instruction in the delay slot of
859    the branch would be more efficient, it would be very tricky to do
860    correctly, because we'd have to introduce a variable frag *after*
861    the delay slot instruction, and expand that instead.  Let's do it
862    the easy way for now, even if the branch-not-taken case now costs
863    one additional instruction.  Out-of-range branches are not supposed
864    to be common, anyway.
865
866    Branch likely.  If label is out of range, we turn:
867
868         beql reg1, reg2, label
869         delay slot (annulled if branch not taken)
870
871    into
872
873         beql reg1, reg2, 1f
874         nop
875         beql $0, $0, 2f
876         nop
877      1: j[al] label
878         delay slot (executed only if branch taken)
879      2:
880
881    It would be possible to generate a shorter sequence by losing the
882    likely bit, generating something like:
883
884         bne reg1, reg2, 0f
885         nop
886         j[al] label
887         delay slot (executed only if branch taken)
888      0:
889
890         beql -> bne
891         bnel -> beq
892         blezl -> bgtz
893         bgtzl -> blez
894         bltzl -> bgez
895         bgezl -> bltz
896         bc1fl -> bc1t
897         bc1tl -> bc1f
898
899         bltzall -> bgezal  (with jal label instead of j label)
900         bgezall -> bltzal  (ditto)
901
902
903    but it's not clear that it would actually improve performance.  */
904 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
905   ((relax_substateT) \
906    (0xc0000000 \
907     | ((toofar) ? 1 : 0) \
908     | ((link) ? 2 : 0) \
909     | ((likely) ? 4 : 0) \
910     | ((uncond) ? 8 : 0)))
911 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
912 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
913 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
914 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
915 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
916
917 /* For mips16 code, we use an entirely different form of relaxation.
918    mips16 supports two versions of most instructions which take
919    immediate values: a small one which takes some small value, and a
920    larger one which takes a 16 bit value.  Since branches also follow
921    this pattern, relaxing these values is required.
922
923    We can assemble both mips16 and normal MIPS code in a single
924    object.  Therefore, we need to support this type of relaxation at
925    the same time that we support the relaxation described above.  We
926    use the high bit of the subtype field to distinguish these cases.
927
928    The information we store for this type of relaxation is the
929    argument code found in the opcode file for this relocation, whether
930    the user explicitly requested a small or extended form, and whether
931    the relocation is in a jump or jal delay slot.  That tells us the
932    size of the value, and how it should be stored.  We also store
933    whether the fragment is considered to be extended or not.  We also
934    store whether this is known to be a branch to a different section,
935    whether we have tried to relax this frag yet, and whether we have
936    ever extended a PC relative fragment because of a shift count.  */
937 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
938   (0x80000000                                                   \
939    | ((type) & 0xff)                                            \
940    | ((small) ? 0x100 : 0)                                      \
941    | ((ext) ? 0x200 : 0)                                        \
942    | ((dslot) ? 0x400 : 0)                                      \
943    | ((jal_dslot) ? 0x800 : 0))
944 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
945 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
946 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
947 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
948 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
949 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
950 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
951 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
952 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
953 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
954 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
955 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
956
957 /* Is the given value a sign-extended 32-bit value?  */
958 #define IS_SEXT_32BIT_NUM(x)                                            \
959   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
960    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
961
962 /* Is the given value a sign-extended 16-bit value?  */
963 #define IS_SEXT_16BIT_NUM(x)                                            \
964   (((x) &~ (offsetT) 0x7fff) == 0                                       \
965    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
966
967 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
968 #define IS_ZEXT_32BIT_NUM(x)                                            \
969   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
970    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
971
972 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
973    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
974 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
975   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
976               | (((VALUE) & (MASK)) << (SHIFT)))
977
978 /* Extract bits MASK << SHIFT from STRUCT and shift them right
979    SHIFT places.  */
980 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
981   (((STRUCT) >> (SHIFT)) & (MASK))
982
983 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
984    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
985
986    include/opcode/mips.h specifies operand fields using the macros
987    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
988    with "MIPS16OP" instead of "OP".  */
989 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
990   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
991 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
992   INSERT_BITS ((INSN).insn_opcode, VALUE, \
993                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
994
995 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
996 #define EXTRACT_OPERAND(FIELD, INSN) \
997   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
998 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
999   EXTRACT_BITS ((INSN).insn_opcode, \
1000                 MIPS16OP_MASK_##FIELD, \
1001                 MIPS16OP_SH_##FIELD)
1002 \f
1003 /* Global variables used when generating relaxable macros.  See the
1004    comment above RELAX_ENCODE for more details about how relaxation
1005    is used.  */
1006 static struct {
1007   /* 0 if we're not emitting a relaxable macro.
1008      1 if we're emitting the first of the two relaxation alternatives.
1009      2 if we're emitting the second alternative.  */
1010   int sequence;
1011
1012   /* The first relaxable fixup in the current frag.  (In other words,
1013      the first fixup that refers to relaxable code.)  */
1014   fixS *first_fixup;
1015
1016   /* sizes[0] says how many bytes of the first alternative are stored in
1017      the current frag.  Likewise sizes[1] for the second alternative.  */
1018   unsigned int sizes[2];
1019
1020   /* The symbol on which the choice of sequence depends.  */
1021   symbolS *symbol;
1022 } mips_relax;
1023 \f
1024 /* Global variables used to decide whether a macro needs a warning.  */
1025 static struct {
1026   /* True if the macro is in a branch delay slot.  */
1027   bfd_boolean delay_slot_p;
1028
1029   /* For relaxable macros, sizes[0] is the length of the first alternative
1030      in bytes and sizes[1] is the length of the second alternative.
1031      For non-relaxable macros, both elements give the length of the
1032      macro in bytes.  */
1033   unsigned int sizes[2];
1034
1035   /* The first variant frag for this macro.  */
1036   fragS *first_frag;
1037 } mips_macro_warning;
1038 \f
1039 /* Prototypes for static functions.  */
1040
1041 #define internalError()                                                 \
1042     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1043
1044 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1045
1046 static void append_insn
1047   (struct mips_cl_insn *ip, expressionS *p, bfd_reloc_code_real_type *r);
1048 static void mips_no_prev_insn (void);
1049 static void mips16_macro_build
1050   (expressionS *, const char *, const char *, va_list);
1051 static void load_register (int, expressionS *, int);
1052 static void macro_start (void);
1053 static void macro_end (void);
1054 static void macro (struct mips_cl_insn * ip);
1055 static void mips16_macro (struct mips_cl_insn * ip);
1056 #ifdef LOSING_COMPILER
1057 static void macro2 (struct mips_cl_insn * ip);
1058 #endif
1059 static void mips_ip (char *str, struct mips_cl_insn * ip);
1060 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1061 static void mips16_immed
1062   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1063    unsigned long *, bfd_boolean *, unsigned short *);
1064 static size_t my_getSmallExpression
1065   (expressionS *, bfd_reloc_code_real_type *, char *);
1066 static void my_getExpression (expressionS *, char *);
1067 static void s_align (int);
1068 static void s_change_sec (int);
1069 static void s_change_section (int);
1070 static void s_cons (int);
1071 static void s_float_cons (int);
1072 static void s_mips_globl (int);
1073 static void s_option (int);
1074 static void s_mipsset (int);
1075 static void s_abicalls (int);
1076 static void s_cpload (int);
1077 static void s_cpsetup (int);
1078 static void s_cplocal (int);
1079 static void s_cprestore (int);
1080 static void s_cpreturn (int);
1081 static void s_dtprelword (int);
1082 static void s_dtpreldword (int);
1083 static void s_gpvalue (int);
1084 static void s_gpword (int);
1085 static void s_gpdword (int);
1086 static void s_cpadd (int);
1087 static void s_insn (int);
1088 static void md_obj_begin (void);
1089 static void md_obj_end (void);
1090 static void s_mips_ent (int);
1091 static void s_mips_end (int);
1092 static void s_mips_frame (int);
1093 static void s_mips_mask (int reg_type);
1094 static void s_mips_stab (int);
1095 static void s_mips_weakext (int);
1096 static void s_mips_file (int);
1097 static void s_mips_loc (int);
1098 static bfd_boolean pic_need_relax (symbolS *, asection *);
1099 static int relaxed_branch_length (fragS *, asection *, int);
1100 static int validate_mips_insn (const struct mips_opcode *);
1101
1102 /* Table and functions used to map between CPU/ISA names, and
1103    ISA levels, and CPU numbers.  */
1104
1105 struct mips_cpu_info
1106 {
1107   const char *name;           /* CPU or ISA name.  */
1108   int flags;                  /* ASEs available, or ISA flag.  */
1109   int isa;                    /* ISA level.  */
1110   int cpu;                    /* CPU number (default CPU if ISA).  */
1111 };
1112
1113 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1114 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1115 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1116 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1117 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1118 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1119 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1120
1121 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1122 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1123 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1124 \f
1125 /* Pseudo-op table.
1126
1127    The following pseudo-ops from the Kane and Heinrich MIPS book
1128    should be defined here, but are currently unsupported: .alias,
1129    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1130
1131    The following pseudo-ops from the Kane and Heinrich MIPS book are
1132    specific to the type of debugging information being generated, and
1133    should be defined by the object format: .aent, .begin, .bend,
1134    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1135    .vreg.
1136
1137    The following pseudo-ops from the Kane and Heinrich MIPS book are
1138    not MIPS CPU specific, but are also not specific to the object file
1139    format.  This file is probably the best place to define them, but
1140    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1141
1142 static const pseudo_typeS mips_pseudo_table[] =
1143 {
1144   /* MIPS specific pseudo-ops.  */
1145   {"option", s_option, 0},
1146   {"set", s_mipsset, 0},
1147   {"rdata", s_change_sec, 'r'},
1148   {"sdata", s_change_sec, 's'},
1149   {"livereg", s_ignore, 0},
1150   {"abicalls", s_abicalls, 0},
1151   {"cpload", s_cpload, 0},
1152   {"cpsetup", s_cpsetup, 0},
1153   {"cplocal", s_cplocal, 0},
1154   {"cprestore", s_cprestore, 0},
1155   {"cpreturn", s_cpreturn, 0},
1156   {"dtprelword", s_dtprelword, 0},
1157   {"dtpreldword", s_dtpreldword, 0},
1158   {"gpvalue", s_gpvalue, 0},
1159   {"gpword", s_gpword, 0},
1160   {"gpdword", s_gpdword, 0},
1161   {"cpadd", s_cpadd, 0},
1162   {"insn", s_insn, 0},
1163
1164   /* Relatively generic pseudo-ops that happen to be used on MIPS
1165      chips.  */
1166   {"asciiz", stringer, 8 + 1},
1167   {"bss", s_change_sec, 'b'},
1168   {"err", s_err, 0},
1169   {"half", s_cons, 1},
1170   {"dword", s_cons, 3},
1171   {"weakext", s_mips_weakext, 0},
1172   {"origin", s_org, 0},
1173   {"repeat", s_rept, 0},
1174
1175   /* These pseudo-ops are defined in read.c, but must be overridden
1176      here for one reason or another.  */
1177   {"align", s_align, 0},
1178   {"byte", s_cons, 0},
1179   {"data", s_change_sec, 'd'},
1180   {"double", s_float_cons, 'd'},
1181   {"float", s_float_cons, 'f'},
1182   {"globl", s_mips_globl, 0},
1183   {"global", s_mips_globl, 0},
1184   {"hword", s_cons, 1},
1185   {"int", s_cons, 2},
1186   {"long", s_cons, 2},
1187   {"octa", s_cons, 4},
1188   {"quad", s_cons, 3},
1189   {"section", s_change_section, 0},
1190   {"short", s_cons, 1},
1191   {"single", s_float_cons, 'f'},
1192   {"stabn", s_mips_stab, 'n'},
1193   {"text", s_change_sec, 't'},
1194   {"word", s_cons, 2},
1195
1196   { "extern", ecoff_directive_extern, 0},
1197
1198   { NULL, NULL, 0 },
1199 };
1200
1201 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1202 {
1203   /* These pseudo-ops should be defined by the object file format.
1204      However, a.out doesn't support them, so we have versions here.  */
1205   {"aent", s_mips_ent, 1},
1206   {"bgnb", s_ignore, 0},
1207   {"end", s_mips_end, 0},
1208   {"endb", s_ignore, 0},
1209   {"ent", s_mips_ent, 0},
1210   {"file", s_mips_file, 0},
1211   {"fmask", s_mips_mask, 'F'},
1212   {"frame", s_mips_frame, 0},
1213   {"loc", s_mips_loc, 0},
1214   {"mask", s_mips_mask, 'R'},
1215   {"verstamp", s_ignore, 0},
1216   { NULL, NULL, 0 },
1217 };
1218
1219 extern void pop_insert (const pseudo_typeS *);
1220
1221 void
1222 mips_pop_insert (void)
1223 {
1224   pop_insert (mips_pseudo_table);
1225   if (! ECOFF_DEBUGGING)
1226     pop_insert (mips_nonecoff_pseudo_table);
1227 }
1228 \f
1229 /* Symbols labelling the current insn.  */
1230
1231 struct insn_label_list
1232 {
1233   struct insn_label_list *next;
1234   symbolS *label;
1235 };
1236
1237 static struct insn_label_list *free_insn_labels;
1238 #define label_list tc_segment_info_data.labels
1239
1240 static void mips_clear_insn_labels (void);
1241
1242 static inline void
1243 mips_clear_insn_labels (void)
1244 {
1245   register struct insn_label_list **pl;
1246   segment_info_type *si;
1247
1248   if (now_seg)
1249     {
1250       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1251         ;
1252       
1253       si = seg_info (now_seg);
1254       *pl = si->label_list;
1255       si->label_list = NULL;
1256     }
1257 }
1258
1259 \f
1260 static char *expr_end;
1261
1262 /* Expressions which appear in instructions.  These are set by
1263    mips_ip.  */
1264
1265 static expressionS imm_expr;
1266 static expressionS imm2_expr;
1267 static expressionS offset_expr;
1268
1269 /* Relocs associated with imm_expr and offset_expr.  */
1270
1271 static bfd_reloc_code_real_type imm_reloc[3]
1272   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1273 static bfd_reloc_code_real_type offset_reloc[3]
1274   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1275
1276 /* These are set by mips16_ip if an explicit extension is used.  */
1277
1278 static bfd_boolean mips16_small, mips16_ext;
1279
1280 #ifdef OBJ_ELF
1281 /* The pdr segment for per procedure frame/regmask info.  Not used for
1282    ECOFF debugging.  */
1283
1284 static segT pdr_seg;
1285 #endif
1286
1287 /* The default target format to use.  */
1288
1289 const char *
1290 mips_target_format (void)
1291 {
1292   switch (OUTPUT_FLAVOR)
1293     {
1294     case bfd_target_ecoff_flavour:
1295       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1296     case bfd_target_coff_flavour:
1297       return "pe-mips";
1298     case bfd_target_elf_flavour:
1299 #ifdef TE_VXWORKS
1300       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1301         return (target_big_endian
1302                 ? "elf32-bigmips-vxworks"
1303                 : "elf32-littlemips-vxworks");
1304 #endif
1305 #ifdef TE_TMIPS
1306       /* This is traditional mips.  */
1307       return (target_big_endian
1308               ? (HAVE_64BIT_OBJECTS
1309                  ? "elf64-tradbigmips"
1310                  : (HAVE_NEWABI
1311                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1312               : (HAVE_64BIT_OBJECTS
1313                  ? "elf64-tradlittlemips"
1314                  : (HAVE_NEWABI
1315                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1316 #else
1317       return (target_big_endian
1318               ? (HAVE_64BIT_OBJECTS
1319                  ? "elf64-bigmips"
1320                  : (HAVE_NEWABI
1321                     ? "elf32-nbigmips" : "elf32-bigmips"))
1322               : (HAVE_64BIT_OBJECTS
1323                  ? "elf64-littlemips"
1324                  : (HAVE_NEWABI
1325                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1326 #endif
1327     default:
1328       abort ();
1329       return NULL;
1330     }
1331 }
1332
1333 /* Return the length of instruction INSN.  */
1334
1335 static inline unsigned int
1336 insn_length (const struct mips_cl_insn *insn)
1337 {
1338   if (!mips_opts.mips16)
1339     return 4;
1340   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1341 }
1342
1343 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1344
1345 static void
1346 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1347 {
1348   size_t i;
1349
1350   insn->insn_mo = mo;
1351   insn->use_extend = FALSE;
1352   insn->extend = 0;
1353   insn->insn_opcode = mo->match;
1354   insn->frag = NULL;
1355   insn->where = 0;
1356   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1357     insn->fixp[i] = NULL;
1358   insn->fixed_p = (mips_opts.noreorder > 0);
1359   insn->noreorder_p = (mips_opts.noreorder > 0);
1360   insn->mips16_absolute_jump_p = 0;
1361 }
1362
1363 /* Record the current MIPS16 mode in now_seg.  */
1364
1365 static void
1366 mips_record_mips16_mode (void)
1367 {
1368   segment_info_type *si;
1369
1370   si = seg_info (now_seg);
1371   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1372     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1373 }
1374
1375 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1376
1377 static void
1378 install_insn (const struct mips_cl_insn *insn)
1379 {
1380   char *f = insn->frag->fr_literal + insn->where;
1381   if (!mips_opts.mips16)
1382     md_number_to_chars (f, insn->insn_opcode, 4);
1383   else if (insn->mips16_absolute_jump_p)
1384     {
1385       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1386       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1387     }
1388   else
1389     {
1390       if (insn->use_extend)
1391         {
1392           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1393           f += 2;
1394         }
1395       md_number_to_chars (f, insn->insn_opcode, 2);
1396     }
1397   mips_record_mips16_mode ();
1398 }
1399
1400 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1401    and install the opcode in the new location.  */
1402
1403 static void
1404 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1405 {
1406   size_t i;
1407
1408   insn->frag = frag;
1409   insn->where = where;
1410   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1411     if (insn->fixp[i] != NULL)
1412       {
1413         insn->fixp[i]->fx_frag = frag;
1414         insn->fixp[i]->fx_where = where;
1415       }
1416   install_insn (insn);
1417 }
1418
1419 /* Add INSN to the end of the output.  */
1420
1421 static void
1422 add_fixed_insn (struct mips_cl_insn *insn)
1423 {
1424   char *f = frag_more (insn_length (insn));
1425   move_insn (insn, frag_now, f - frag_now->fr_literal);
1426 }
1427
1428 /* Start a variant frag and move INSN to the start of the variant part,
1429    marking it as fixed.  The other arguments are as for frag_var.  */
1430
1431 static void
1432 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1433                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1434 {
1435   frag_grow (max_chars);
1436   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1437   insn->fixed_p = 1;
1438   frag_var (rs_machine_dependent, max_chars, var,
1439             subtype, symbol, offset, NULL);
1440 }
1441
1442 /* Insert N copies of INSN into the history buffer, starting at
1443    position FIRST.  Neither FIRST nor N need to be clipped.  */
1444
1445 static void
1446 insert_into_history (unsigned int first, unsigned int n,
1447                      const struct mips_cl_insn *insn)
1448 {
1449   if (mips_relax.sequence != 2)
1450     {
1451       unsigned int i;
1452
1453       for (i = ARRAY_SIZE (history); i-- > first;)
1454         if (i >= first + n)
1455           history[i] = history[i - n];
1456         else
1457           history[i] = *insn;
1458     }
1459 }
1460
1461 /* Emit a nop instruction, recording it in the history buffer.  */
1462
1463 static void
1464 emit_nop (void)
1465 {
1466   add_fixed_insn (NOP_INSN);
1467   insert_into_history (0, 1, NOP_INSN);
1468 }
1469
1470 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1471    the idea is to make it obvious at a glance that each errata is
1472    included.  */
1473
1474 static void
1475 init_vr4120_conflicts (void)
1476 {
1477 #define CONFLICT(FIRST, SECOND) \
1478     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1479
1480   /* Errata 21 - [D]DIV[U] after [D]MACC */
1481   CONFLICT (MACC, DIV);
1482   CONFLICT (DMACC, DIV);
1483
1484   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1485   CONFLICT (DMULT, DMULT);
1486   CONFLICT (DMULT, DMACC);
1487   CONFLICT (DMACC, DMULT);
1488   CONFLICT (DMACC, DMACC);
1489
1490   /* Errata 24 - MT{LO,HI} after [D]MACC */
1491   CONFLICT (MACC, MTHILO);
1492   CONFLICT (DMACC, MTHILO);
1493
1494   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1495      instruction is executed immediately after a MACC or DMACC
1496      instruction, the result of [either instruction] is incorrect."  */
1497   CONFLICT (MACC, MULT);
1498   CONFLICT (MACC, DMULT);
1499   CONFLICT (DMACC, MULT);
1500   CONFLICT (DMACC, DMULT);
1501
1502   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1503      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1504      DDIV or DDIVU instruction, the result of the MACC or
1505      DMACC instruction is incorrect.".  */
1506   CONFLICT (DMULT, MACC);
1507   CONFLICT (DMULT, DMACC);
1508   CONFLICT (DIV, MACC);
1509   CONFLICT (DIV, DMACC);
1510
1511 #undef CONFLICT
1512 }
1513
1514 struct regname {
1515   const char *name;
1516   unsigned int num;
1517 };
1518
1519 #define RTYPE_MASK      0x1ff00
1520 #define RTYPE_NUM       0x00100
1521 #define RTYPE_FPU       0x00200
1522 #define RTYPE_FCC       0x00400
1523 #define RTYPE_VEC       0x00800
1524 #define RTYPE_GP        0x01000
1525 #define RTYPE_CP0       0x02000
1526 #define RTYPE_PC        0x04000
1527 #define RTYPE_ACC       0x08000
1528 #define RTYPE_CCC       0x10000
1529 #define RNUM_MASK       0x000ff
1530 #define RWARN           0x80000
1531
1532 #define GENERIC_REGISTER_NUMBERS \
1533     {"$0",      RTYPE_NUM | 0},  \
1534     {"$1",      RTYPE_NUM | 1},  \
1535     {"$2",      RTYPE_NUM | 2},  \
1536     {"$3",      RTYPE_NUM | 3},  \
1537     {"$4",      RTYPE_NUM | 4},  \
1538     {"$5",      RTYPE_NUM | 5},  \
1539     {"$6",      RTYPE_NUM | 6},  \
1540     {"$7",      RTYPE_NUM | 7},  \
1541     {"$8",      RTYPE_NUM | 8},  \
1542     {"$9",      RTYPE_NUM | 9},  \
1543     {"$10",     RTYPE_NUM | 10}, \
1544     {"$11",     RTYPE_NUM | 11}, \
1545     {"$12",     RTYPE_NUM | 12}, \
1546     {"$13",     RTYPE_NUM | 13}, \
1547     {"$14",     RTYPE_NUM | 14}, \
1548     {"$15",     RTYPE_NUM | 15}, \
1549     {"$16",     RTYPE_NUM | 16}, \
1550     {"$17",     RTYPE_NUM | 17}, \
1551     {"$18",     RTYPE_NUM | 18}, \
1552     {"$19",     RTYPE_NUM | 19}, \
1553     {"$20",     RTYPE_NUM | 20}, \
1554     {"$21",     RTYPE_NUM | 21}, \
1555     {"$22",     RTYPE_NUM | 22}, \
1556     {"$23",     RTYPE_NUM | 23}, \
1557     {"$24",     RTYPE_NUM | 24}, \
1558     {"$25",     RTYPE_NUM | 25}, \
1559     {"$26",     RTYPE_NUM | 26}, \
1560     {"$27",     RTYPE_NUM | 27}, \
1561     {"$28",     RTYPE_NUM | 28}, \
1562     {"$29",     RTYPE_NUM | 29}, \
1563     {"$30",     RTYPE_NUM | 30}, \
1564     {"$31",     RTYPE_NUM | 31} 
1565
1566 #define FPU_REGISTER_NAMES       \
1567     {"$f0",     RTYPE_FPU | 0},  \
1568     {"$f1",     RTYPE_FPU | 1},  \
1569     {"$f2",     RTYPE_FPU | 2},  \
1570     {"$f3",     RTYPE_FPU | 3},  \
1571     {"$f4",     RTYPE_FPU | 4},  \
1572     {"$f5",     RTYPE_FPU | 5},  \
1573     {"$f6",     RTYPE_FPU | 6},  \
1574     {"$f7",     RTYPE_FPU | 7},  \
1575     {"$f8",     RTYPE_FPU | 8},  \
1576     {"$f9",     RTYPE_FPU | 9},  \
1577     {"$f10",    RTYPE_FPU | 10}, \
1578     {"$f11",    RTYPE_FPU | 11}, \
1579     {"$f12",    RTYPE_FPU | 12}, \
1580     {"$f13",    RTYPE_FPU | 13}, \
1581     {"$f14",    RTYPE_FPU | 14}, \
1582     {"$f15",    RTYPE_FPU | 15}, \
1583     {"$f16",    RTYPE_FPU | 16}, \
1584     {"$f17",    RTYPE_FPU | 17}, \
1585     {"$f18",    RTYPE_FPU | 18}, \
1586     {"$f19",    RTYPE_FPU | 19}, \
1587     {"$f20",    RTYPE_FPU | 20}, \
1588     {"$f21",    RTYPE_FPU | 21}, \
1589     {"$f22",    RTYPE_FPU | 22}, \
1590     {"$f23",    RTYPE_FPU | 23}, \
1591     {"$f24",    RTYPE_FPU | 24}, \
1592     {"$f25",    RTYPE_FPU | 25}, \
1593     {"$f26",    RTYPE_FPU | 26}, \
1594     {"$f27",    RTYPE_FPU | 27}, \
1595     {"$f28",    RTYPE_FPU | 28}, \
1596     {"$f29",    RTYPE_FPU | 29}, \
1597     {"$f30",    RTYPE_FPU | 30}, \
1598     {"$f31",    RTYPE_FPU | 31}
1599
1600 #define FPU_CONDITION_CODE_NAMES \
1601     {"$fcc0",   RTYPE_FCC | 0},  \
1602     {"$fcc1",   RTYPE_FCC | 1},  \
1603     {"$fcc2",   RTYPE_FCC | 2},  \
1604     {"$fcc3",   RTYPE_FCC | 3},  \
1605     {"$fcc4",   RTYPE_FCC | 4},  \
1606     {"$fcc5",   RTYPE_FCC | 5},  \
1607     {"$fcc6",   RTYPE_FCC | 6},  \
1608     {"$fcc7",   RTYPE_FCC | 7}
1609
1610 #define COPROC_CONDITION_CODE_NAMES         \
1611     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1612     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1613     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1614     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1615     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1616     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1617     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1618     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1619
1620 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1621     {"$a4",     RTYPE_GP | 8},  \
1622     {"$a5",     RTYPE_GP | 9},  \
1623     {"$a6",     RTYPE_GP | 10}, \
1624     {"$a7",     RTYPE_GP | 11}, \
1625     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1626     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1627     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1628     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1629     {"$t0",     RTYPE_GP | 12}, \
1630     {"$t1",     RTYPE_GP | 13}, \
1631     {"$t2",     RTYPE_GP | 14}, \
1632     {"$t3",     RTYPE_GP | 15}
1633
1634 #define O32_SYMBOLIC_REGISTER_NAMES \
1635     {"$t0",     RTYPE_GP | 8},  \
1636     {"$t1",     RTYPE_GP | 9},  \
1637     {"$t2",     RTYPE_GP | 10}, \
1638     {"$t3",     RTYPE_GP | 11}, \
1639     {"$t4",     RTYPE_GP | 12}, \
1640     {"$t5",     RTYPE_GP | 13}, \
1641     {"$t6",     RTYPE_GP | 14}, \
1642     {"$t7",     RTYPE_GP | 15}, \
1643     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1644     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1645     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1646     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1647
1648 /* Remaining symbolic register names */
1649 #define SYMBOLIC_REGISTER_NAMES \
1650     {"$zero",   RTYPE_GP | 0},  \
1651     {"$at",     RTYPE_GP | 1},  \
1652     {"$AT",     RTYPE_GP | 1},  \
1653     {"$v0",     RTYPE_GP | 2},  \
1654     {"$v1",     RTYPE_GP | 3},  \
1655     {"$a0",     RTYPE_GP | 4},  \
1656     {"$a1",     RTYPE_GP | 5},  \
1657     {"$a2",     RTYPE_GP | 6},  \
1658     {"$a3",     RTYPE_GP | 7},  \
1659     {"$s0",     RTYPE_GP | 16}, \
1660     {"$s1",     RTYPE_GP | 17}, \
1661     {"$s2",     RTYPE_GP | 18}, \
1662     {"$s3",     RTYPE_GP | 19}, \
1663     {"$s4",     RTYPE_GP | 20}, \
1664     {"$s5",     RTYPE_GP | 21}, \
1665     {"$s6",     RTYPE_GP | 22}, \
1666     {"$s7",     RTYPE_GP | 23}, \
1667     {"$t8",     RTYPE_GP | 24}, \
1668     {"$t9",     RTYPE_GP | 25}, \
1669     {"$k0",     RTYPE_GP | 26}, \
1670     {"$kt0",    RTYPE_GP | 26}, \
1671     {"$k1",     RTYPE_GP | 27}, \
1672     {"$kt1",    RTYPE_GP | 27}, \
1673     {"$gp",     RTYPE_GP | 28}, \
1674     {"$sp",     RTYPE_GP | 29}, \
1675     {"$s8",     RTYPE_GP | 30}, \
1676     {"$fp",     RTYPE_GP | 30}, \
1677     {"$ra",     RTYPE_GP | 31}
1678
1679 #define MIPS16_SPECIAL_REGISTER_NAMES \
1680     {"$pc",     RTYPE_PC | 0}
1681
1682 #define MDMX_VECTOR_REGISTER_NAMES \
1683     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1684     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1685     {"$v2",     RTYPE_VEC | 2},  \
1686     {"$v3",     RTYPE_VEC | 3},  \
1687     {"$v4",     RTYPE_VEC | 4},  \
1688     {"$v5",     RTYPE_VEC | 5},  \
1689     {"$v6",     RTYPE_VEC | 6},  \
1690     {"$v7",     RTYPE_VEC | 7},  \
1691     {"$v8",     RTYPE_VEC | 8},  \
1692     {"$v9",     RTYPE_VEC | 9},  \
1693     {"$v10",    RTYPE_VEC | 10}, \
1694     {"$v11",    RTYPE_VEC | 11}, \
1695     {"$v12",    RTYPE_VEC | 12}, \
1696     {"$v13",    RTYPE_VEC | 13}, \
1697     {"$v14",    RTYPE_VEC | 14}, \
1698     {"$v15",    RTYPE_VEC | 15}, \
1699     {"$v16",    RTYPE_VEC | 16}, \
1700     {"$v17",    RTYPE_VEC | 17}, \
1701     {"$v18",    RTYPE_VEC | 18}, \
1702     {"$v19",    RTYPE_VEC | 19}, \
1703     {"$v20",    RTYPE_VEC | 20}, \
1704     {"$v21",    RTYPE_VEC | 21}, \
1705     {"$v22",    RTYPE_VEC | 22}, \
1706     {"$v23",    RTYPE_VEC | 23}, \
1707     {"$v24",    RTYPE_VEC | 24}, \
1708     {"$v25",    RTYPE_VEC | 25}, \
1709     {"$v26",    RTYPE_VEC | 26}, \
1710     {"$v27",    RTYPE_VEC | 27}, \
1711     {"$v28",    RTYPE_VEC | 28}, \
1712     {"$v29",    RTYPE_VEC | 29}, \
1713     {"$v30",    RTYPE_VEC | 30}, \
1714     {"$v31",    RTYPE_VEC | 31}
1715
1716 #define MIPS_DSP_ACCUMULATOR_NAMES \
1717     {"$ac0",    RTYPE_ACC | 0}, \
1718     {"$ac1",    RTYPE_ACC | 1}, \
1719     {"$ac2",    RTYPE_ACC | 2}, \
1720     {"$ac3",    RTYPE_ACC | 3}
1721
1722 static const struct regname reg_names[] = {
1723   GENERIC_REGISTER_NUMBERS,
1724   FPU_REGISTER_NAMES,
1725   FPU_CONDITION_CODE_NAMES,
1726   COPROC_CONDITION_CODE_NAMES,
1727
1728   /* The $txx registers depends on the abi,
1729      these will be added later into the symbol table from
1730      one of the tables below once mips_abi is set after 
1731      parsing of arguments from the command line. */
1732   SYMBOLIC_REGISTER_NAMES,
1733
1734   MIPS16_SPECIAL_REGISTER_NAMES,
1735   MDMX_VECTOR_REGISTER_NAMES,
1736   MIPS_DSP_ACCUMULATOR_NAMES,
1737   {0, 0}
1738 };
1739
1740 static const struct regname reg_names_o32[] = {
1741   O32_SYMBOLIC_REGISTER_NAMES,
1742   {0, 0}
1743 };
1744
1745 static const struct regname reg_names_n32n64[] = {
1746   N32N64_SYMBOLIC_REGISTER_NAMES,
1747   {0, 0}
1748 };
1749
1750 static int
1751 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1752 {
1753   symbolS *symbolP;
1754   char *e;
1755   char save_c;
1756   int reg = -1;
1757
1758   /* Find end of name.  */
1759   e = *s;
1760   if (is_name_beginner (*e))
1761     ++e;
1762   while (is_part_of_name (*e))
1763     ++e;
1764
1765   /* Terminate name.  */
1766   save_c = *e;
1767   *e = '\0';
1768
1769   /* Look for a register symbol.  */
1770   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1771     {
1772       int r = S_GET_VALUE (symbolP);
1773       if (r & types)
1774         reg = r & RNUM_MASK;
1775       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1776         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1777         reg = (r & RNUM_MASK) - 2;
1778     }
1779   /* Else see if this is a register defined in an itbl entry.  */
1780   else if ((types & RTYPE_GP) && itbl_have_entries)
1781     {
1782       char *n = *s;
1783       unsigned long r;
1784
1785       if (*n == '$')
1786         ++n;
1787       if (itbl_get_reg_val (n, &r))
1788         reg = r & RNUM_MASK;
1789     }
1790
1791   /* Advance to next token if a register was recognised.  */
1792   if (reg >= 0)
1793     *s = e;
1794   else if (types & RWARN)
1795     as_warn (_("Unrecognized register name `%s'"), *s);
1796
1797   *e = save_c;
1798   if (regnop)
1799     *regnop = reg;
1800   return reg >= 0;
1801 }
1802
1803 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1804    architecture.  If EXPANSIONP is TRUE then this check is done while
1805    expanding a macro.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1806
1807 static bfd_boolean
1808 is_opcode_valid (const struct mips_opcode *mo, bfd_boolean expansionp)
1809 {
1810   int isa = mips_opts.isa;
1811   int fp_s, fp_d;
1812
1813   if (mips_opts.ase_mdmx)
1814     isa |= INSN_MDMX;
1815   if (mips_opts.ase_dsp)
1816     isa |= INSN_DSP;
1817   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1818     isa |= INSN_DSP64;
1819   if (mips_opts.ase_dspr2)
1820     isa |= INSN_DSPR2;
1821   if (mips_opts.ase_mt)
1822     isa |= INSN_MT;
1823   if (mips_opts.ase_mips3d)
1824     isa |= INSN_MIPS3D;
1825   if (mips_opts.ase_smartmips)
1826     isa |= INSN_SMARTMIPS;
1827
1828   /* For user code we don't check for mips_opts.mips16 since we want
1829      to allow jalx if -mips16 was specified on the command line.  */
1830   if (expansionp ? mips_opts.mips16 : file_ase_mips16)
1831     isa |= INSN_MIPS16;
1832
1833   /* Don't accept instructions based on the ISA if the CPU does not implement
1834      all the coprocessor insns. */
1835   if (NO_ISA_COP (mips_opts.arch)
1836       && COP_INSN (mo->pinfo))
1837     isa = 0;
1838
1839   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1840     return FALSE;
1841
1842   /* Check whether the instruction or macro requires single-precision or
1843      double-precision floating-point support.  Note that this information is
1844      stored differently in the opcode table for insns and macros.  */
1845   if (mo->pinfo == INSN_MACRO)
1846     {
1847       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1848       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1849     }
1850   else
1851     {
1852       fp_s = mo->pinfo & FP_S;
1853       fp_d = mo->pinfo & FP_D;
1854     }
1855
1856   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1857     return FALSE;
1858
1859   if (fp_s && mips_opts.soft_float)
1860     return FALSE;
1861
1862   return TRUE;
1863 }
1864
1865 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1866    selected ISA and architecture.  */
1867
1868 static bfd_boolean
1869 is_opcode_valid_16 (const struct mips_opcode *mo)
1870 {
1871   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1872 }
1873
1874 /* This function is called once, at assembler startup time.  It should set up
1875    all the tables, etc. that the MD part of the assembler will need.  */
1876
1877 void
1878 md_begin (void)
1879 {
1880   const char *retval = NULL;
1881   int i = 0;
1882   int broken = 0;
1883
1884   if (mips_pic != NO_PIC)
1885     {
1886       if (g_switch_seen && g_switch_value != 0)
1887         as_bad (_("-G may not be used in position-independent code"));
1888       g_switch_value = 0;
1889     }
1890
1891   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1892     as_warn (_("Could not set architecture and machine"));
1893
1894   op_hash = hash_new ();
1895
1896   for (i = 0; i < NUMOPCODES;)
1897     {
1898       const char *name = mips_opcodes[i].name;
1899
1900       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1901       if (retval != NULL)
1902         {
1903           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1904                    mips_opcodes[i].name, retval);
1905           /* Probably a memory allocation problem?  Give up now.  */
1906           as_fatal (_("Broken assembler.  No assembly attempted."));
1907         }
1908       do
1909         {
1910           if (mips_opcodes[i].pinfo != INSN_MACRO)
1911             {
1912               if (!validate_mips_insn (&mips_opcodes[i]))
1913                 broken = 1;
1914               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1915                 {
1916                   create_insn (&nop_insn, mips_opcodes + i);
1917                   nop_insn.fixed_p = 1;
1918                 }
1919             }
1920           ++i;
1921         }
1922       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1923     }
1924
1925   mips16_op_hash = hash_new ();
1926
1927   i = 0;
1928   while (i < bfd_mips16_num_opcodes)
1929     {
1930       const char *name = mips16_opcodes[i].name;
1931
1932       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1933       if (retval != NULL)
1934         as_fatal (_("internal: can't hash `%s': %s"),
1935                   mips16_opcodes[i].name, retval);
1936       do
1937         {
1938           if (mips16_opcodes[i].pinfo != INSN_MACRO
1939               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1940                   != mips16_opcodes[i].match))
1941             {
1942               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1943                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1944               broken = 1;
1945             }
1946           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1947             {
1948               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1949               mips16_nop_insn.fixed_p = 1;
1950             }
1951           ++i;
1952         }
1953       while (i < bfd_mips16_num_opcodes
1954              && strcmp (mips16_opcodes[i].name, name) == 0);
1955     }
1956
1957   if (broken)
1958     as_fatal (_("Broken assembler.  No assembly attempted."));
1959
1960   /* We add all the general register names to the symbol table.  This
1961      helps us detect invalid uses of them.  */
1962   for (i = 0; reg_names[i].name; i++) 
1963     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1964                                      reg_names[i].num, /* & RNUM_MASK, */
1965                                      &zero_address_frag));
1966   if (HAVE_NEWABI)
1967     for (i = 0; reg_names_n32n64[i].name; i++) 
1968       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1969                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
1970                                        &zero_address_frag));
1971   else
1972     for (i = 0; reg_names_o32[i].name; i++) 
1973       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1974                                        reg_names_o32[i].num, /* & RNUM_MASK, */
1975                                        &zero_address_frag));
1976
1977   mips_no_prev_insn ();
1978
1979   mips_gprmask = 0;
1980   mips_cprmask[0] = 0;
1981   mips_cprmask[1] = 0;
1982   mips_cprmask[2] = 0;
1983   mips_cprmask[3] = 0;
1984
1985   /* set the default alignment for the text section (2**2) */
1986   record_alignment (text_section, 2);
1987
1988   bfd_set_gp_size (stdoutput, g_switch_value);
1989
1990 #ifdef OBJ_ELF
1991   if (IS_ELF)
1992     {
1993       /* On a native system other than VxWorks, sections must be aligned
1994          to 16 byte boundaries.  When configured for an embedded ELF
1995          target, we don't bother.  */
1996       if (strncmp (TARGET_OS, "elf", 3) != 0
1997           && strncmp (TARGET_OS, "vxworks", 7) != 0)
1998         {
1999           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2000           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2001           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2002         }
2003
2004       /* Create a .reginfo section for register masks and a .mdebug
2005          section for debugging information.  */
2006       {
2007         segT seg;
2008         subsegT subseg;
2009         flagword flags;
2010         segT sec;
2011
2012         seg = now_seg;
2013         subseg = now_subseg;
2014
2015         /* The ABI says this section should be loaded so that the
2016            running program can access it.  However, we don't load it
2017            if we are configured for an embedded target */
2018         flags = SEC_READONLY | SEC_DATA;
2019         if (strncmp (TARGET_OS, "elf", 3) != 0)
2020           flags |= SEC_ALLOC | SEC_LOAD;
2021
2022         if (mips_abi != N64_ABI)
2023           {
2024             sec = subseg_new (".reginfo", (subsegT) 0);
2025
2026             bfd_set_section_flags (stdoutput, sec, flags);
2027             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2028
2029             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2030           }
2031         else
2032           {
2033             /* The 64-bit ABI uses a .MIPS.options section rather than
2034                .reginfo section.  */
2035             sec = subseg_new (".MIPS.options", (subsegT) 0);
2036             bfd_set_section_flags (stdoutput, sec, flags);
2037             bfd_set_section_alignment (stdoutput, sec, 3);
2038
2039             /* Set up the option header.  */
2040             {
2041               Elf_Internal_Options opthdr;
2042               char *f;
2043
2044               opthdr.kind = ODK_REGINFO;
2045               opthdr.size = (sizeof (Elf_External_Options)
2046                              + sizeof (Elf64_External_RegInfo));
2047               opthdr.section = 0;
2048               opthdr.info = 0;
2049               f = frag_more (sizeof (Elf_External_Options));
2050               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2051                                              (Elf_External_Options *) f);
2052
2053               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2054             }
2055           }
2056
2057         if (ECOFF_DEBUGGING)
2058           {
2059             sec = subseg_new (".mdebug", (subsegT) 0);
2060             (void) bfd_set_section_flags (stdoutput, sec,
2061                                           SEC_HAS_CONTENTS | SEC_READONLY);
2062             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2063           }
2064         else if (mips_flag_pdr)
2065           {
2066             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2067             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2068                                           SEC_READONLY | SEC_RELOC
2069                                           | SEC_DEBUGGING);
2070             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2071           }
2072
2073         subseg_set (seg, subseg);
2074       }
2075     }
2076 #endif /* OBJ_ELF */
2077
2078   if (! ECOFF_DEBUGGING)
2079     md_obj_begin ();
2080
2081   if (mips_fix_vr4120)
2082     init_vr4120_conflicts ();
2083 }
2084
2085 void
2086 md_mips_end (void)
2087 {
2088   if (! ECOFF_DEBUGGING)
2089     md_obj_end ();
2090 }
2091
2092 void
2093 md_assemble (char *str)
2094 {
2095   struct mips_cl_insn insn;
2096   bfd_reloc_code_real_type unused_reloc[3]
2097     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2098
2099   imm_expr.X_op = O_absent;
2100   imm2_expr.X_op = O_absent;
2101   offset_expr.X_op = O_absent;
2102   imm_reloc[0] = BFD_RELOC_UNUSED;
2103   imm_reloc[1] = BFD_RELOC_UNUSED;
2104   imm_reloc[2] = BFD_RELOC_UNUSED;
2105   offset_reloc[0] = BFD_RELOC_UNUSED;
2106   offset_reloc[1] = BFD_RELOC_UNUSED;
2107   offset_reloc[2] = BFD_RELOC_UNUSED;
2108
2109   if (mips_opts.mips16)
2110     mips16_ip (str, &insn);
2111   else
2112     {
2113       mips_ip (str, &insn);
2114       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2115             str, insn.insn_opcode));
2116     }
2117
2118   if (insn_error)
2119     {
2120       as_bad ("%s `%s'", insn_error, str);
2121       return;
2122     }
2123
2124   if (insn.insn_mo->pinfo == INSN_MACRO)
2125     {
2126       macro_start ();
2127       if (mips_opts.mips16)
2128         mips16_macro (&insn);
2129       else
2130         macro (&insn);
2131       macro_end ();
2132     }
2133   else
2134     {
2135       if (imm_expr.X_op != O_absent)
2136         append_insn (&insn, &imm_expr, imm_reloc);
2137       else if (offset_expr.X_op != O_absent)
2138         append_insn (&insn, &offset_expr, offset_reloc);
2139       else
2140         append_insn (&insn, NULL, unused_reloc);
2141     }
2142 }
2143
2144 /* Convenience functions for abstracting away the differences between
2145    MIPS16 and non-MIPS16 relocations.  */
2146
2147 static inline bfd_boolean
2148 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2149 {
2150   switch (reloc)
2151     {
2152     case BFD_RELOC_MIPS16_JMP:
2153     case BFD_RELOC_MIPS16_GPREL:
2154     case BFD_RELOC_MIPS16_GOT16:
2155     case BFD_RELOC_MIPS16_CALL16:
2156     case BFD_RELOC_MIPS16_HI16_S:
2157     case BFD_RELOC_MIPS16_HI16:
2158     case BFD_RELOC_MIPS16_LO16:
2159       return TRUE;
2160
2161     default:
2162       return FALSE;
2163     }
2164 }
2165
2166 static inline bfd_boolean
2167 got16_reloc_p (bfd_reloc_code_real_type reloc)
2168 {
2169   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2170 }
2171
2172 static inline bfd_boolean
2173 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2174 {
2175   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2176 }
2177
2178 static inline bfd_boolean
2179 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2180 {
2181   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2182 }
2183
2184 /* Return true if the given relocation might need a matching %lo().
2185    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2186    need a matching %lo() when applied to local symbols.  */
2187
2188 static inline bfd_boolean
2189 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2190 {
2191   return (HAVE_IN_PLACE_ADDENDS
2192           && (hi16_reloc_p (reloc)
2193               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2194                  all GOT16 relocations evaluate to "G".  */
2195               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2196 }
2197
2198 /* Return the type of %lo() reloc needed by RELOC, given that
2199    reloc_needs_lo_p.  */
2200
2201 static inline bfd_reloc_code_real_type
2202 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2203 {
2204   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2205 }
2206
2207 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2208    relocation.  */
2209
2210 static inline bfd_boolean
2211 fixup_has_matching_lo_p (fixS *fixp)
2212 {
2213   return (fixp->fx_next != NULL
2214           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2215           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2216           && fixp->fx_offset == fixp->fx_next->fx_offset);
2217 }
2218
2219 /* See whether instruction IP reads register REG.  CLASS is the type
2220    of register.  */
2221
2222 static int
2223 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2224                enum mips_regclass class)
2225 {
2226   if (class == MIPS16_REG)
2227     {
2228       gas_assert (mips_opts.mips16);
2229       reg = mips16_to_32_reg_map[reg];
2230       class = MIPS_GR_REG;
2231     }
2232
2233   /* Don't report on general register ZERO, since it never changes.  */
2234   if (class == MIPS_GR_REG && reg == ZERO)
2235     return 0;
2236
2237   if (class == MIPS_FP_REG)
2238     {
2239       gas_assert (! mips_opts.mips16);
2240       /* If we are called with either $f0 or $f1, we must check $f0.
2241          This is not optimal, because it will introduce an unnecessary
2242          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2243          need to distinguish reading both $f0 and $f1 or just one of
2244          them.  Note that we don't have to check the other way,
2245          because there is no instruction that sets both $f0 and $f1
2246          and requires a delay.  */
2247       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2248           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2249               == (reg &~ (unsigned) 1)))
2250         return 1;
2251       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2252           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2253               == (reg &~ (unsigned) 1)))
2254         return 1;
2255     }
2256   else if (! mips_opts.mips16)
2257     {
2258       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2259           && EXTRACT_OPERAND (RS, *ip) == reg)
2260         return 1;
2261       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2262           && EXTRACT_OPERAND (RT, *ip) == reg)
2263         return 1;
2264     }
2265   else
2266     {
2267       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2268           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2269         return 1;
2270       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2271           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2272         return 1;
2273       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2274           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2275               == reg))
2276         return 1;
2277       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2278         return 1;
2279       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2280         return 1;
2281       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2282         return 1;
2283       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2284           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2285         return 1;
2286     }
2287
2288   return 0;
2289 }
2290
2291 /* This function returns true if modifying a register requires a
2292    delay.  */
2293
2294 static int
2295 reg_needs_delay (unsigned int reg)
2296 {
2297   unsigned long prev_pinfo;
2298
2299   prev_pinfo = history[0].insn_mo->pinfo;
2300   if (! mips_opts.noreorder
2301       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2302            && ! gpr_interlocks)
2303           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2304               && ! cop_interlocks)))
2305     {
2306       /* A load from a coprocessor or from memory.  All load delays
2307          delay the use of general register rt for one instruction.  */
2308       /* Itbl support may require additional care here.  */
2309       know (prev_pinfo & INSN_WRITE_GPR_T);
2310       if (reg == EXTRACT_OPERAND (RT, history[0]))
2311         return 1;
2312     }
2313
2314   return 0;
2315 }
2316
2317 /* Move all labels in insn_labels to the current insertion point.  */
2318
2319 static void
2320 mips_move_labels (void)
2321 {
2322   segment_info_type *si = seg_info (now_seg);
2323   struct insn_label_list *l;
2324   valueT val;
2325
2326   for (l = si->label_list; l != NULL; l = l->next)
2327     {
2328       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2329       symbol_set_frag (l->label, frag_now);
2330       val = (valueT) frag_now_fix ();
2331       /* mips16 text labels are stored as odd.  */
2332       if (mips_opts.mips16)
2333         ++val;
2334       S_SET_VALUE (l->label, val);
2335     }
2336 }
2337
2338 static bfd_boolean
2339 s_is_linkonce (symbolS *sym, segT from_seg)
2340 {
2341   bfd_boolean linkonce = FALSE;
2342   segT symseg = S_GET_SEGMENT (sym);
2343
2344   if (symseg != from_seg && !S_IS_LOCAL (sym))
2345     {
2346       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2347         linkonce = TRUE;
2348 #ifdef OBJ_ELF
2349       /* The GNU toolchain uses an extension for ELF: a section
2350          beginning with the magic string .gnu.linkonce is a
2351          linkonce section.  */
2352       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2353                    sizeof ".gnu.linkonce" - 1) == 0)
2354         linkonce = TRUE;
2355 #endif
2356     }
2357   return linkonce;
2358 }
2359
2360 /* Mark instruction labels in mips16 mode.  This permits the linker to
2361    handle them specially, such as generating jalx instructions when
2362    needed.  We also make them odd for the duration of the assembly, in
2363    order to generate the right sort of code.  We will make them even
2364    in the adjust_symtab routine, while leaving them marked.  This is
2365    convenient for the debugger and the disassembler.  The linker knows
2366    to make them odd again.  */
2367
2368 static void
2369 mips16_mark_labels (void)
2370 {
2371   segment_info_type *si = seg_info (now_seg);
2372   struct insn_label_list *l;
2373
2374   if (!mips_opts.mips16)
2375     return;
2376
2377   for (l = si->label_list; l != NULL; l = l->next)
2378    {
2379       symbolS *label = l->label;
2380
2381 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2382       if (IS_ELF)
2383         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2384 #endif
2385       if ((S_GET_VALUE (label) & 1) == 0
2386         /* Don't adjust the address if the label is global or weak, or
2387            in a link-once section, since we'll be emitting symbol reloc
2388            references to it which will be patched up by the linker, and
2389            the final value of the symbol may or may not be MIPS16.  */
2390           && ! S_IS_WEAK (label)
2391           && ! S_IS_EXTERNAL (label)
2392           && ! s_is_linkonce (label, now_seg))
2393         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2394     }
2395 }
2396
2397 /* End the current frag.  Make it a variant frag and record the
2398    relaxation info.  */
2399
2400 static void
2401 relax_close_frag (void)
2402 {
2403   mips_macro_warning.first_frag = frag_now;
2404   frag_var (rs_machine_dependent, 0, 0,
2405             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2406             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2407
2408   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2409   mips_relax.first_fixup = 0;
2410 }
2411
2412 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2413    See the comment above RELAX_ENCODE for more details.  */
2414
2415 static void
2416 relax_start (symbolS *symbol)
2417 {
2418   gas_assert (mips_relax.sequence == 0);
2419   mips_relax.sequence = 1;
2420   mips_relax.symbol = symbol;
2421 }
2422
2423 /* Start generating the second version of a relaxable sequence.
2424    See the comment above RELAX_ENCODE for more details.  */
2425
2426 static void
2427 relax_switch (void)
2428 {
2429   gas_assert (mips_relax.sequence == 1);
2430   mips_relax.sequence = 2;
2431 }
2432
2433 /* End the current relaxable sequence.  */
2434
2435 static void
2436 relax_end (void)
2437 {
2438   gas_assert (mips_relax.sequence == 2);
2439   relax_close_frag ();
2440   mips_relax.sequence = 0;
2441 }
2442
2443 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2444    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2445    by VR4120 errata.  */
2446
2447 static unsigned int
2448 classify_vr4120_insn (const char *name)
2449 {
2450   if (strncmp (name, "macc", 4) == 0)
2451     return FIX_VR4120_MACC;
2452   if (strncmp (name, "dmacc", 5) == 0)
2453     return FIX_VR4120_DMACC;
2454   if (strncmp (name, "mult", 4) == 0)
2455     return FIX_VR4120_MULT;
2456   if (strncmp (name, "dmult", 5) == 0)
2457     return FIX_VR4120_DMULT;
2458   if (strstr (name, "div"))
2459     return FIX_VR4120_DIV;
2460   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2461     return FIX_VR4120_MTHILO;
2462   return NUM_FIX_VR4120_CLASSES;
2463 }
2464
2465 #define INSN_ERET  0x42000018
2466 #define INSN_DERET 0x4200001f
2467
2468 /* Return the number of instructions that must separate INSN1 and INSN2,
2469    where INSN1 is the earlier instruction.  Return the worst-case value
2470    for any INSN2 if INSN2 is null.  */
2471
2472 static unsigned int
2473 insns_between (const struct mips_cl_insn *insn1,
2474                const struct mips_cl_insn *insn2)
2475 {
2476   unsigned long pinfo1, pinfo2;
2477
2478   /* This function needs to know which pinfo flags are set for INSN2
2479      and which registers INSN2 uses.  The former is stored in PINFO2 and
2480      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2481      will have every flag set and INSN2_USES_REG will always return true.  */
2482   pinfo1 = insn1->insn_mo->pinfo;
2483   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2484
2485 #define INSN2_USES_REG(REG, CLASS) \
2486    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2487
2488   /* For most targets, write-after-read dependencies on the HI and LO
2489      registers must be separated by at least two instructions.  */
2490   if (!hilo_interlocks)
2491     {
2492       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2493         return 2;
2494       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2495         return 2;
2496     }
2497
2498   /* If we're working around r7000 errata, there must be two instructions
2499      between an mfhi or mflo and any instruction that uses the result.  */
2500   if (mips_7000_hilo_fix
2501       && MF_HILO_INSN (pinfo1)
2502       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2503     return 2;
2504
2505   /* If we're working around 24K errata, one instruction is required
2506      if an ERET or DERET is followed by a branch instruction.  */
2507   if (mips_fix_24k)
2508     {
2509       if (insn1->insn_opcode == INSN_ERET
2510           || insn1->insn_opcode == INSN_DERET)
2511         {
2512           if (insn2 == NULL
2513               || insn2->insn_opcode == INSN_ERET
2514               || insn2->insn_opcode == INSN_DERET
2515               || (insn2->insn_mo->pinfo
2516                   & (INSN_UNCOND_BRANCH_DELAY
2517                      | INSN_COND_BRANCH_DELAY
2518                      | INSN_COND_BRANCH_LIKELY)) != 0)
2519             return 1;
2520         }
2521     }
2522
2523   /* If working around VR4120 errata, check for combinations that need
2524      a single intervening instruction.  */
2525   if (mips_fix_vr4120)
2526     {
2527       unsigned int class1, class2;
2528
2529       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2530       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2531         {
2532           if (insn2 == NULL)
2533             return 1;
2534           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2535           if (vr4120_conflicts[class1] & (1 << class2))
2536             return 1;
2537         }
2538     }
2539
2540   if (!mips_opts.mips16)
2541     {
2542       /* Check for GPR or coprocessor load delays.  All such delays
2543          are on the RT register.  */
2544       /* Itbl support may require additional care here.  */
2545       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2546           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2547         {
2548           know (pinfo1 & INSN_WRITE_GPR_T);
2549           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2550             return 1;
2551         }
2552
2553       /* Check for generic coprocessor hazards.
2554
2555          This case is not handled very well.  There is no special
2556          knowledge of CP0 handling, and the coprocessors other than
2557          the floating point unit are not distinguished at all.  */
2558       /* Itbl support may require additional care here. FIXME!
2559          Need to modify this to include knowledge about
2560          user specified delays!  */
2561       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2562                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2563         {
2564           /* Handle cases where INSN1 writes to a known general coprocessor
2565              register.  There must be a one instruction delay before INSN2
2566              if INSN2 reads that register, otherwise no delay is needed.  */
2567           if (pinfo1 & INSN_WRITE_FPR_T)
2568             {
2569               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2570                 return 1;
2571             }
2572           else if (pinfo1 & INSN_WRITE_FPR_S)
2573             {
2574               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2575                 return 1;
2576             }
2577           else
2578             {
2579               /* Read-after-write dependencies on the control registers
2580                  require a two-instruction gap.  */
2581               if ((pinfo1 & INSN_WRITE_COND_CODE)
2582                   && (pinfo2 & INSN_READ_COND_CODE))
2583                 return 2;
2584
2585               /* We don't know exactly what INSN1 does.  If INSN2 is
2586                  also a coprocessor instruction, assume there must be
2587                  a one instruction gap.  */
2588               if (pinfo2 & INSN_COP)
2589                 return 1;
2590             }
2591         }
2592
2593       /* Check for read-after-write dependencies on the coprocessor
2594          control registers in cases where INSN1 does not need a general
2595          coprocessor delay.  This means that INSN1 is a floating point
2596          comparison instruction.  */
2597       /* Itbl support may require additional care here.  */
2598       else if (!cop_interlocks
2599                && (pinfo1 & INSN_WRITE_COND_CODE)
2600                && (pinfo2 & INSN_READ_COND_CODE))
2601         return 1;
2602     }
2603
2604 #undef INSN2_USES_REG
2605
2606   return 0;
2607 }
2608
2609 /* Return the number of nops that would be needed to work around the
2610    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2611    the MAX_VR4130_NOPS instructions described by HISTORY.  */
2612
2613 static int
2614 nops_for_vr4130 (const struct mips_cl_insn *history,
2615                  const struct mips_cl_insn *insn)
2616 {
2617   int i, j, reg;
2618
2619   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2620      are not affected by the errata.  */
2621   if (insn != 0
2622       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2623           || strcmp (insn->insn_mo->name, "mtlo") == 0
2624           || strcmp (insn->insn_mo->name, "mthi") == 0))
2625     return 0;
2626
2627   /* Search for the first MFLO or MFHI.  */
2628   for (i = 0; i < MAX_VR4130_NOPS; i++)
2629     if (MF_HILO_INSN (history[i].insn_mo->pinfo))
2630       {
2631         /* Extract the destination register.  */
2632         if (mips_opts.mips16)
2633           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, history[i])];
2634         else
2635           reg = EXTRACT_OPERAND (RD, history[i]);
2636
2637         /* No nops are needed if INSN reads that register.  */
2638         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2639           return 0;
2640
2641         /* ...or if any of the intervening instructions do.  */
2642         for (j = 0; j < i; j++)
2643           if (insn_uses_reg (&history[j], reg, MIPS_GR_REG))
2644             return 0;
2645
2646         return MAX_VR4130_NOPS - i;
2647       }
2648   return 0;
2649 }
2650
2651 /* Return the number of nops that would be needed if instruction INSN
2652    immediately followed the MAX_NOPS instructions given by HISTORY,
2653    where HISTORY[0] is the most recent instruction.  If INSN is null,
2654    return the worse-case number of nops for any instruction.  */
2655
2656 static int
2657 nops_for_insn (const struct mips_cl_insn *history,
2658                const struct mips_cl_insn *insn)
2659 {
2660   int i, nops, tmp_nops;
2661
2662   nops = 0;
2663   for (i = 0; i < MAX_DELAY_NOPS; i++)
2664     {
2665       tmp_nops = insns_between (history + i, insn) - i;
2666       if (tmp_nops > nops)
2667         nops = tmp_nops;
2668     }
2669
2670   if (mips_fix_vr4130)
2671     {
2672       tmp_nops = nops_for_vr4130 (history, insn);
2673       if (tmp_nops > nops)
2674         nops = tmp_nops;
2675     }
2676
2677   return nops;
2678 }
2679
2680 /* The variable arguments provide NUM_INSNS extra instructions that
2681    might be added to HISTORY.  Return the largest number of nops that
2682    would be needed after the extended sequence.  */
2683
2684 static int
2685 nops_for_sequence (int num_insns, const struct mips_cl_insn *history, ...)
2686 {
2687   va_list args;
2688   struct mips_cl_insn buffer[MAX_NOPS];
2689   struct mips_cl_insn *cursor;
2690   int nops;
2691
2692   va_start (args, history);
2693   cursor = buffer + num_insns;
2694   memcpy (cursor, history, (MAX_NOPS - num_insns) * sizeof (*cursor));
2695   while (cursor > buffer)
2696     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2697
2698   nops = nops_for_insn (buffer, NULL);
2699   va_end (args);
2700   return nops;
2701 }
2702
2703 /* Like nops_for_insn, but if INSN is a branch, take into account the
2704    worst-case delay for the branch target.  */
2705
2706 static int
2707 nops_for_insn_or_target (const struct mips_cl_insn *history,
2708                          const struct mips_cl_insn *insn)
2709 {
2710   int nops, tmp_nops;
2711
2712   nops = nops_for_insn (history, insn);
2713   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2714                               | INSN_COND_BRANCH_DELAY
2715                               | INSN_COND_BRANCH_LIKELY))
2716     {
2717       tmp_nops = nops_for_sequence (2, history, insn, NOP_INSN);
2718       if (tmp_nops > nops)
2719         nops = tmp_nops;
2720     }
2721   else if (mips_opts.mips16 && (insn->insn_mo->pinfo & MIPS16_INSN_BRANCH))
2722     {
2723       tmp_nops = nops_for_sequence (1, history, insn);
2724       if (tmp_nops > nops)
2725         nops = tmp_nops;
2726     }
2727   return nops;
2728 }
2729
2730 /* Output an instruction.  IP is the instruction information.
2731    ADDRESS_EXPR is an operand of the instruction to be used with
2732    RELOC_TYPE.  */
2733
2734 static void
2735 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2736              bfd_reloc_code_real_type *reloc_type)
2737 {
2738   unsigned long prev_pinfo, pinfo;
2739   relax_stateT prev_insn_frag_type = 0;
2740   bfd_boolean relaxed_branch = FALSE;
2741   segment_info_type *si = seg_info (now_seg);
2742
2743   /* Mark instruction labels in mips16 mode.  */
2744   mips16_mark_labels ();
2745
2746   prev_pinfo = history[0].insn_mo->pinfo;
2747   pinfo = ip->insn_mo->pinfo;
2748
2749   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2750     {
2751       /* There are a lot of optimizations we could do that we don't.
2752          In particular, we do not, in general, reorder instructions.
2753          If you use gcc with optimization, it will reorder
2754          instructions and generally do much more optimization then we
2755          do here; repeating all that work in the assembler would only
2756          benefit hand written assembly code, and does not seem worth
2757          it.  */
2758       int nops = (mips_optimize == 0
2759                   ? nops_for_insn (history, NULL)
2760                   : nops_for_insn_or_target (history, ip));
2761       if (nops > 0)
2762         {
2763           fragS *old_frag;
2764           unsigned long old_frag_offset;
2765           int i;
2766
2767           old_frag = frag_now;
2768           old_frag_offset = frag_now_fix ();
2769
2770           for (i = 0; i < nops; i++)
2771             emit_nop ();
2772
2773           if (listing)
2774             {
2775               listing_prev_line ();
2776               /* We may be at the start of a variant frag.  In case we
2777                  are, make sure there is enough space for the frag
2778                  after the frags created by listing_prev_line.  The
2779                  argument to frag_grow here must be at least as large
2780                  as the argument to all other calls to frag_grow in
2781                  this file.  We don't have to worry about being in the
2782                  middle of a variant frag, because the variants insert
2783                  all needed nop instructions themselves.  */
2784               frag_grow (40);
2785             }
2786
2787           mips_move_labels ();
2788
2789 #ifndef NO_ECOFF_DEBUGGING
2790           if (ECOFF_DEBUGGING)
2791             ecoff_fix_loc (old_frag, old_frag_offset);
2792 #endif
2793         }
2794     }
2795   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2796     {
2797       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2798       int nops = nops_for_insn_or_target (history, ip);
2799       gas_assert (nops <= prev_nop_frag_holds);
2800
2801       /* Enforce NOPS as a minimum.  */
2802       if (nops > prev_nop_frag_required)
2803         prev_nop_frag_required = nops;
2804
2805       if (prev_nop_frag_holds == prev_nop_frag_required)
2806         {
2807           /* Settle for the current number of nops.  Update the history
2808              accordingly (for the benefit of any future .set reorder code).  */
2809           prev_nop_frag = NULL;
2810           insert_into_history (prev_nop_frag_since,
2811                                prev_nop_frag_holds, NOP_INSN);
2812         }
2813       else
2814         {
2815           /* Allow this instruction to replace one of the nops that was
2816              tentatively added to prev_nop_frag.  */
2817           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2818           prev_nop_frag_holds--;
2819           prev_nop_frag_since++;
2820         }
2821     }
2822
2823 #ifdef OBJ_ELF
2824   /* The value passed to dwarf2_emit_insn is the distance between
2825      the beginning of the current instruction and the address that
2826      should be recorded in the debug tables.  For MIPS16 debug info
2827      we want to use ISA-encoded addresses, so we pass -1 for an
2828      address higher by one than the current.  */
2829   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2830 #endif
2831
2832   /* Record the frag type before frag_var.  */
2833   if (history[0].frag)
2834     prev_insn_frag_type = history[0].frag->fr_type;
2835
2836   if (address_expr
2837       && *reloc_type == BFD_RELOC_16_PCREL_S2
2838       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2839           || pinfo & INSN_COND_BRANCH_LIKELY)
2840       && mips_relax_branch
2841       /* Don't try branch relaxation within .set nomacro, or within
2842          .set noat if we use $at for PIC computations.  If it turns
2843          out that the branch was out-of-range, we'll get an error.  */
2844       && !mips_opts.warn_about_macros
2845       && (mips_opts.at || mips_pic == NO_PIC)
2846       && !mips_opts.mips16)
2847     {
2848       relaxed_branch = TRUE;
2849       add_relaxed_insn (ip, (relaxed_branch_length
2850                              (NULL, NULL,
2851                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2852                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2853                               : 0)), 4,
2854                         RELAX_BRANCH_ENCODE
2855                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2856                          pinfo & INSN_COND_BRANCH_LIKELY,
2857                          pinfo & INSN_WRITE_GPR_31,
2858                          0),
2859                         address_expr->X_add_symbol,
2860                         address_expr->X_add_number);
2861       *reloc_type = BFD_RELOC_UNUSED;
2862     }
2863   else if (*reloc_type > BFD_RELOC_UNUSED)
2864     {
2865       /* We need to set up a variant frag.  */
2866       gas_assert (mips_opts.mips16 && address_expr != NULL);
2867       add_relaxed_insn (ip, 4, 0,
2868                         RELAX_MIPS16_ENCODE
2869                         (*reloc_type - BFD_RELOC_UNUSED,
2870                          mips16_small, mips16_ext,
2871                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2872                          history[0].mips16_absolute_jump_p),
2873                         make_expr_symbol (address_expr), 0);
2874     }
2875   else if (mips_opts.mips16
2876            && ! ip->use_extend
2877            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2878     {
2879       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2880         /* Make sure there is enough room to swap this instruction with
2881            a following jump instruction.  */
2882         frag_grow (6);
2883       add_fixed_insn (ip);
2884     }
2885   else
2886     {
2887       if (mips_opts.mips16
2888           && mips_opts.noreorder
2889           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2890         as_warn (_("extended instruction in delay slot"));
2891
2892       if (mips_relax.sequence)
2893         {
2894           /* If we've reached the end of this frag, turn it into a variant
2895              frag and record the information for the instructions we've
2896              written so far.  */
2897           if (frag_room () < 4)
2898             relax_close_frag ();
2899           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2900         }
2901
2902       if (mips_relax.sequence != 2)
2903         mips_macro_warning.sizes[0] += 4;
2904       if (mips_relax.sequence != 1)
2905         mips_macro_warning.sizes[1] += 4;
2906
2907       if (mips_opts.mips16)
2908         {
2909           ip->fixed_p = 1;
2910           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2911         }
2912       add_fixed_insn (ip);
2913     }
2914
2915   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2916     {
2917       if (address_expr->X_op == O_constant)
2918         {
2919           unsigned int tmp;
2920
2921           switch (*reloc_type)
2922             {
2923             case BFD_RELOC_32:
2924               ip->insn_opcode |= address_expr->X_add_number;
2925               break;
2926
2927             case BFD_RELOC_MIPS_HIGHEST:
2928               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
2929               ip->insn_opcode |= tmp & 0xffff;
2930               break;
2931
2932             case BFD_RELOC_MIPS_HIGHER:
2933               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
2934               ip->insn_opcode |= tmp & 0xffff;
2935               break;
2936
2937             case BFD_RELOC_HI16_S:
2938               tmp = (address_expr->X_add_number + 0x8000) >> 16;
2939               ip->insn_opcode |= tmp & 0xffff;
2940               break;
2941
2942             case BFD_RELOC_HI16:
2943               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
2944               break;
2945
2946             case BFD_RELOC_UNUSED:
2947             case BFD_RELOC_LO16:
2948             case BFD_RELOC_MIPS_GOT_DISP:
2949               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
2950               break;
2951
2952             case BFD_RELOC_MIPS_JMP:
2953               if ((address_expr->X_add_number & 3) != 0)
2954                 as_bad (_("jump to misaligned address (0x%lx)"),
2955                         (unsigned long) address_expr->X_add_number);
2956               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
2957               break;
2958
2959             case BFD_RELOC_MIPS16_JMP:
2960               if ((address_expr->X_add_number & 3) != 0)
2961                 as_bad (_("jump to misaligned address (0x%lx)"),
2962                         (unsigned long) address_expr->X_add_number);
2963               ip->insn_opcode |=
2964                 (((address_expr->X_add_number & 0x7c0000) << 3)
2965                  | ((address_expr->X_add_number & 0xf800000) >> 7)
2966                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
2967               break;
2968
2969             case BFD_RELOC_16_PCREL_S2:
2970               if ((address_expr->X_add_number & 3) != 0)
2971                 as_bad (_("branch to misaligned address (0x%lx)"),
2972                         (unsigned long) address_expr->X_add_number);
2973               if (mips_relax_branch)
2974                 goto need_reloc;
2975               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
2976                 as_bad (_("branch address range overflow (0x%lx)"),
2977                         (unsigned long) address_expr->X_add_number);
2978               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
2979               break;
2980
2981             default:
2982               internalError ();
2983             }
2984         }
2985       else if (*reloc_type < BFD_RELOC_UNUSED)
2986         need_reloc:
2987         {
2988           reloc_howto_type *howto;
2989           int i;
2990
2991           /* In a compound relocation, it is the final (outermost)
2992              operator that determines the relocated field.  */
2993           for (i = 1; i < 3; i++)
2994             if (reloc_type[i] == BFD_RELOC_UNUSED)
2995               break;
2996
2997           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
2998           if (howto == NULL)
2999             {
3000               /* To reproduce this failure try assembling gas/testsuites/
3001                  gas/mips/mips16-intermix.s with a mips-ecoff targeted
3002                  assembler.  */
3003               as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3004               howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3005             }
3006           
3007           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3008                                      bfd_get_reloc_size (howto),
3009                                      address_expr,
3010                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3011                                      reloc_type[0]);
3012
3013           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3014           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3015               && ip->fixp[0]->fx_addsy)
3016             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3017
3018           /* These relocations can have an addend that won't fit in
3019              4 octets for 64bit assembly.  */
3020           if (HAVE_64BIT_GPRS
3021               && ! howto->partial_inplace
3022               && (reloc_type[0] == BFD_RELOC_16
3023                   || reloc_type[0] == BFD_RELOC_32
3024                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
3025                   || reloc_type[0] == BFD_RELOC_GPREL16
3026                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3027                   || reloc_type[0] == BFD_RELOC_GPREL32
3028                   || reloc_type[0] == BFD_RELOC_64
3029                   || reloc_type[0] == BFD_RELOC_CTOR
3030                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
3031                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3032                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3033                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3034                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
3035                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3036                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3037                   || hi16_reloc_p (reloc_type[0])
3038                   || lo16_reloc_p (reloc_type[0])))
3039             ip->fixp[0]->fx_no_overflow = 1;
3040
3041           if (mips_relax.sequence)
3042             {
3043               if (mips_relax.first_fixup == 0)
3044                 mips_relax.first_fixup = ip->fixp[0];
3045             }
3046           else if (reloc_needs_lo_p (*reloc_type))
3047             {
3048               struct mips_hi_fixup *hi_fixup;
3049
3050               /* Reuse the last entry if it already has a matching %lo.  */
3051               hi_fixup = mips_hi_fixup_list;
3052               if (hi_fixup == 0
3053                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
3054                 {
3055                   hi_fixup = ((struct mips_hi_fixup *)
3056                               xmalloc (sizeof (struct mips_hi_fixup)));
3057                   hi_fixup->next = mips_hi_fixup_list;
3058                   mips_hi_fixup_list = hi_fixup;
3059                 }
3060               hi_fixup->fixp = ip->fixp[0];
3061               hi_fixup->seg = now_seg;
3062             }
3063
3064           /* Add fixups for the second and third relocations, if given.
3065              Note that the ABI allows the second relocation to be
3066              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3067              moment we only use RSS_UNDEF, but we could add support
3068              for the others if it ever becomes necessary.  */
3069           for (i = 1; i < 3; i++)
3070             if (reloc_type[i] != BFD_RELOC_UNUSED)
3071               {
3072                 ip->fixp[i] = fix_new (ip->frag, ip->where,
3073                                        ip->fixp[0]->fx_size, NULL, 0,
3074                                        FALSE, reloc_type[i]);
3075
3076                 /* Use fx_tcbit to mark compound relocs.  */
3077                 ip->fixp[0]->fx_tcbit = 1;
3078                 ip->fixp[i]->fx_tcbit = 1;
3079               }
3080         }
3081     }
3082   install_insn (ip);
3083
3084   /* Update the register mask information.  */
3085   if (! mips_opts.mips16)
3086     {
3087       if (pinfo & INSN_WRITE_GPR_D)
3088         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3089       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3090         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3091       if (pinfo & INSN_READ_GPR_S)
3092         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3093       if (pinfo & INSN_WRITE_GPR_31)
3094         mips_gprmask |= 1 << RA;
3095       if (pinfo & INSN_WRITE_FPR_D)
3096         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3097       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3098         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3099       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3100         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3101       if ((pinfo & INSN_READ_FPR_R) != 0)
3102         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3103       if (pinfo & INSN_COP)
3104         {
3105           /* We don't keep enough information to sort these cases out.
3106              The itbl support does keep this information however, although
3107              we currently don't support itbl fprmats as part of the cop
3108              instruction.  May want to add this support in the future.  */
3109         }
3110       /* Never set the bit for $0, which is always zero.  */
3111       mips_gprmask &= ~1 << 0;
3112     }
3113   else
3114     {
3115       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3116         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3117       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3118         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3119       if (pinfo & MIPS16_INSN_WRITE_Z)
3120         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3121       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3122         mips_gprmask |= 1 << TREG;
3123       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3124         mips_gprmask |= 1 << SP;
3125       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3126         mips_gprmask |= 1 << RA;
3127       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3128         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3129       if (pinfo & MIPS16_INSN_READ_Z)
3130         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3131       if (pinfo & MIPS16_INSN_READ_GPR_X)
3132         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3133     }
3134
3135   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3136     {
3137       /* Filling the branch delay slot is more complex.  We try to
3138          switch the branch with the previous instruction, which we can
3139          do if the previous instruction does not set up a condition
3140          that the branch tests and if the branch is not itself the
3141          target of any branch.  */
3142       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3143           || (pinfo & INSN_COND_BRANCH_DELAY))
3144         {
3145           if (mips_optimize < 2
3146               /* If we have seen .set volatile or .set nomove, don't
3147                  optimize.  */
3148               || mips_opts.nomove != 0
3149               /* We can't swap if the previous instruction's position
3150                  is fixed.  */
3151               || history[0].fixed_p
3152               /* If the previous previous insn was in a .set
3153                  noreorder, we can't swap.  Actually, the MIPS
3154                  assembler will swap in this situation.  However, gcc
3155                  configured -with-gnu-as will generate code like
3156                    .set noreorder
3157                    lw   $4,XXX
3158                    .set reorder
3159                    INSN
3160                    bne  $4,$0,foo
3161                  in which we can not swap the bne and INSN.  If gcc is
3162                  not configured -with-gnu-as, it does not output the
3163                  .set pseudo-ops.  */
3164               || history[1].noreorder_p
3165               /* If the branch is itself the target of a branch, we
3166                  can not swap.  We cheat on this; all we check for is
3167                  whether there is a label on this instruction.  If
3168                  there are any branches to anything other than a
3169                  label, users must use .set noreorder.  */
3170               || si->label_list != NULL
3171               /* If the previous instruction is in a variant frag
3172                  other than this branch's one, we cannot do the swap.
3173                  This does not apply to the mips16, which uses variant
3174                  frags for different purposes.  */
3175               || (! mips_opts.mips16
3176                   && prev_insn_frag_type == rs_machine_dependent)
3177               /* Check for conflicts between the branch and the instructions
3178                  before the candidate delay slot.  */
3179               || nops_for_insn (history + 1, ip) > 0
3180               /* Check for conflicts between the swapped sequence and the
3181                  target of the branch.  */
3182               || nops_for_sequence (2, history + 1, ip, history) > 0
3183               /* We do not swap with a trap instruction, since it
3184                  complicates trap handlers to have the trap
3185                  instruction be in a delay slot.  */
3186               || (prev_pinfo & INSN_TRAP)
3187               /* If the branch reads a register that the previous
3188                  instruction sets, we can not swap.  */
3189               || (! mips_opts.mips16
3190                   && (prev_pinfo & INSN_WRITE_GPR_T)
3191                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3192                                     MIPS_GR_REG))
3193               || (! mips_opts.mips16
3194                   && (prev_pinfo & INSN_WRITE_GPR_D)
3195                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3196                                     MIPS_GR_REG))
3197               || (mips_opts.mips16
3198                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3199                        && (insn_uses_reg
3200                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3201                             MIPS16_REG)))
3202                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3203                           && (insn_uses_reg
3204                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3205                                MIPS16_REG)))
3206                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3207                           && (insn_uses_reg
3208                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3209                                MIPS16_REG)))
3210                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3211                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3212                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3213                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3214                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3215                           && insn_uses_reg (ip,
3216                                             MIPS16OP_EXTRACT_REG32R
3217                                               (history[0].insn_opcode),
3218                                             MIPS_GR_REG))))
3219               /* If the branch writes a register that the previous
3220                  instruction sets, we can not swap (we know that
3221                  branches write only to RD or to $31).  */
3222               || (! mips_opts.mips16
3223                   && (prev_pinfo & INSN_WRITE_GPR_T)
3224                   && (((pinfo & INSN_WRITE_GPR_D)
3225                        && (EXTRACT_OPERAND (RT, history[0])
3226                            == EXTRACT_OPERAND (RD, *ip)))
3227                       || ((pinfo & INSN_WRITE_GPR_31)
3228                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3229               || (! mips_opts.mips16
3230                   && (prev_pinfo & INSN_WRITE_GPR_D)
3231                   && (((pinfo & INSN_WRITE_GPR_D)
3232                        && (EXTRACT_OPERAND (RD, history[0])
3233                            == EXTRACT_OPERAND (RD, *ip)))
3234                       || ((pinfo & INSN_WRITE_GPR_31)
3235                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3236               || (mips_opts.mips16
3237                   && (pinfo & MIPS16_INSN_WRITE_31)
3238                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3239                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3240                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3241                               == RA))))
3242               /* If the branch writes a register that the previous
3243                  instruction reads, we can not swap (we know that
3244                  branches only write to RD or to $31).  */
3245               || (! mips_opts.mips16
3246                   && (pinfo & INSN_WRITE_GPR_D)
3247                   && insn_uses_reg (&history[0],
3248                                     EXTRACT_OPERAND (RD, *ip),
3249                                     MIPS_GR_REG))
3250               || (! mips_opts.mips16
3251                   && (pinfo & INSN_WRITE_GPR_31)
3252                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3253               || (mips_opts.mips16
3254                   && (pinfo & MIPS16_INSN_WRITE_31)
3255                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3256               /* If one instruction sets a condition code and the
3257                  other one uses a condition code, we can not swap.  */
3258               || ((pinfo & INSN_READ_COND_CODE)
3259                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3260               || ((pinfo & INSN_WRITE_COND_CODE)
3261                   && (prev_pinfo & INSN_READ_COND_CODE))
3262               /* If the previous instruction uses the PC, we can not
3263                  swap.  */
3264               || (mips_opts.mips16
3265                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3266               /* If the previous instruction had a fixup in mips16
3267                  mode, we can not swap.  This normally means that the
3268                  previous instruction was a 4 byte branch anyhow.  */
3269               || (mips_opts.mips16 && history[0].fixp[0])
3270               /* If the previous instruction is a sync, sync.l, or
3271                  sync.p, we can not swap.  */
3272               || (prev_pinfo & INSN_SYNC)
3273               /* If the previous instruction is an ERET or
3274                  DERET, avoid the swap.  */
3275               || (history[0].insn_opcode == INSN_ERET)
3276               || (history[0].insn_opcode == INSN_DERET))
3277             {
3278               if (mips_opts.mips16
3279                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3280                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3281                   && ISA_SUPPORTS_MIPS16E)
3282                 {
3283                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3284                   ip->insn_opcode |= 0x0080;
3285                   install_insn (ip);
3286                   insert_into_history (0, 1, ip);
3287                 } 
3288               else
3289                 {
3290                   /* We could do even better for unconditional branches to
3291                      portions of this object file; we could pick up the
3292                      instruction at the destination, put it in the delay
3293                      slot, and bump the destination address.  */
3294                   insert_into_history (0, 1, ip);
3295                   emit_nop ();
3296                 }
3297                 
3298               if (mips_relax.sequence)
3299                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3300             }
3301           else
3302             {
3303               /* It looks like we can actually do the swap.  */
3304               struct mips_cl_insn delay = history[0];
3305               if (mips_opts.mips16)
3306                 {
3307                   know (delay.frag == ip->frag);
3308                   move_insn (ip, delay.frag, delay.where);
3309                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3310                 }
3311               else if (relaxed_branch)
3312                 {
3313                   /* Add the delay slot instruction to the end of the
3314                      current frag and shrink the fixed part of the
3315                      original frag.  If the branch occupies the tail of
3316                      the latter, move it backwards to cover the gap.  */
3317                   delay.frag->fr_fix -= 4;
3318                   if (delay.frag == ip->frag)
3319                     move_insn (ip, ip->frag, ip->where - 4);
3320                   add_fixed_insn (&delay);
3321                 }
3322               else
3323                 {
3324                   move_insn (&delay, ip->frag, ip->where);
3325                   move_insn (ip, history[0].frag, history[0].where);
3326                 }
3327               history[0] = *ip;
3328               delay.fixed_p = 1;
3329               insert_into_history (0, 1, &delay);
3330             }
3331
3332           /* If that was an unconditional branch, forget the previous
3333              insn information.  */
3334           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3335             {
3336               mips_no_prev_insn ();
3337             }
3338         }
3339       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3340         {
3341           /* We don't yet optimize a branch likely.  What we should do
3342              is look at the target, copy the instruction found there
3343              into the delay slot, and increment the branch to jump to
3344              the next instruction.  */
3345           insert_into_history (0, 1, ip);
3346           emit_nop ();
3347         }
3348       else
3349         insert_into_history (0, 1, ip);
3350     }
3351   else
3352     insert_into_history (0, 1, ip);
3353
3354   /* We just output an insn, so the next one doesn't have a label.  */
3355   mips_clear_insn_labels ();
3356 }
3357
3358 /* Forget that there was any previous instruction or label.  */
3359
3360 static void
3361 mips_no_prev_insn (void)
3362 {
3363   prev_nop_frag = NULL;
3364   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3365   mips_clear_insn_labels ();
3366 }
3367
3368 /* This function must be called before we emit something other than
3369    instructions.  It is like mips_no_prev_insn except that it inserts
3370    any NOPS that might be needed by previous instructions.  */
3371
3372 void
3373 mips_emit_delays (void)
3374 {
3375   if (! mips_opts.noreorder)
3376     {
3377       int nops = nops_for_insn (history, NULL);
3378       if (nops > 0)
3379         {
3380           while (nops-- > 0)
3381             add_fixed_insn (NOP_INSN);
3382           mips_move_labels ();
3383         }
3384     }
3385   mips_no_prev_insn ();
3386 }
3387
3388 /* Start a (possibly nested) noreorder block.  */
3389
3390 static void
3391 start_noreorder (void)
3392 {
3393   if (mips_opts.noreorder == 0)
3394     {
3395       unsigned int i;
3396       int nops;
3397
3398       /* None of the instructions before the .set noreorder can be moved.  */
3399       for (i = 0; i < ARRAY_SIZE (history); i++)
3400         history[i].fixed_p = 1;
3401
3402       /* Insert any nops that might be needed between the .set noreorder
3403          block and the previous instructions.  We will later remove any
3404          nops that turn out not to be needed.  */
3405       nops = nops_for_insn (history, NULL);
3406       if (nops > 0)
3407         {
3408           if (mips_optimize != 0)
3409             {
3410               /* Record the frag which holds the nop instructions, so
3411                  that we can remove them if we don't need them.  */
3412               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3413               prev_nop_frag = frag_now;
3414               prev_nop_frag_holds = nops;
3415               prev_nop_frag_required = 0;
3416               prev_nop_frag_since = 0;
3417             }
3418
3419           for (; nops > 0; --nops)
3420             add_fixed_insn (NOP_INSN);
3421
3422           /* Move on to a new frag, so that it is safe to simply
3423              decrease the size of prev_nop_frag.  */
3424           frag_wane (frag_now);
3425           frag_new (0);
3426           mips_move_labels ();
3427         }
3428       mips16_mark_labels ();
3429       mips_clear_insn_labels ();
3430     }
3431   mips_opts.noreorder++;
3432   mips_any_noreorder = 1;
3433 }
3434
3435 /* End a nested noreorder block.  */
3436
3437 static void
3438 end_noreorder (void)
3439 {
3440
3441   mips_opts.noreorder--;
3442   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3443     {
3444       /* Commit to inserting prev_nop_frag_required nops and go back to
3445          handling nop insertion the .set reorder way.  */
3446       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3447                                 * (mips_opts.mips16 ? 2 : 4));
3448       insert_into_history (prev_nop_frag_since,
3449                            prev_nop_frag_required, NOP_INSN);
3450       prev_nop_frag = NULL;
3451     }
3452 }
3453
3454 /* Set up global variables for the start of a new macro.  */
3455
3456 static void
3457 macro_start (void)
3458 {
3459   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3460   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3461                                      && (history[0].insn_mo->pinfo
3462                                          & (INSN_UNCOND_BRANCH_DELAY
3463                                             | INSN_COND_BRANCH_DELAY
3464                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3465 }
3466
3467 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3468    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3469    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3470
3471 static const char *
3472 macro_warning (relax_substateT subtype)
3473 {
3474   if (subtype & RELAX_DELAY_SLOT)
3475     return _("Macro instruction expanded into multiple instructions"
3476              " in a branch delay slot");
3477   else if (subtype & RELAX_NOMACRO)
3478     return _("Macro instruction expanded into multiple instructions");
3479   else
3480     return 0;
3481 }
3482
3483 /* Finish up a macro.  Emit warnings as appropriate.  */
3484
3485 static void
3486 macro_end (void)
3487 {
3488   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3489     {
3490       relax_substateT subtype;
3491
3492       /* Set up the relaxation warning flags.  */
3493       subtype = 0;
3494       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3495         subtype |= RELAX_SECOND_LONGER;
3496       if (mips_opts.warn_about_macros)
3497         subtype |= RELAX_NOMACRO;
3498       if (mips_macro_warning.delay_slot_p)
3499         subtype |= RELAX_DELAY_SLOT;
3500
3501       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3502         {
3503           /* Either the macro has a single implementation or both
3504              implementations are longer than 4 bytes.  Emit the
3505              warning now.  */
3506           const char *msg = macro_warning (subtype);
3507           if (msg != 0)
3508             as_warn ("%s", msg);
3509         }
3510       else
3511         {
3512           /* One implementation might need a warning but the other
3513              definitely doesn't.  */
3514           mips_macro_warning.first_frag->fr_subtype |= subtype;
3515         }
3516     }
3517 }
3518
3519 /* Read a macro's relocation codes from *ARGS and store them in *R.
3520    The first argument in *ARGS will be either the code for a single
3521    relocation or -1 followed by the three codes that make up a
3522    composite relocation.  */
3523
3524 static void
3525 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3526 {
3527   int i, next;
3528
3529   next = va_arg (*args, int);
3530   if (next >= 0)
3531     r[0] = (bfd_reloc_code_real_type) next;
3532   else
3533     for (i = 0; i < 3; i++)
3534       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3535 }
3536
3537 /* Build an instruction created by a macro expansion.  This is passed
3538    a pointer to the count of instructions created so far, an
3539    expression, the name of the instruction to build, an operand format
3540    string, and corresponding arguments.  */
3541
3542 static void
3543 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3544 {
3545   const struct mips_opcode *mo;
3546   struct mips_cl_insn insn;
3547   bfd_reloc_code_real_type r[3];
3548   va_list args;
3549
3550   va_start (args, fmt);
3551
3552   if (mips_opts.mips16)
3553     {
3554       mips16_macro_build (ep, name, fmt, args);
3555       va_end (args);
3556       return;
3557     }
3558
3559   r[0] = BFD_RELOC_UNUSED;
3560   r[1] = BFD_RELOC_UNUSED;
3561   r[2] = BFD_RELOC_UNUSED;
3562   mo = (struct mips_opcode *) hash_find (op_hash, name);
3563   gas_assert (mo);
3564   gas_assert (strcmp (name, mo->name) == 0);
3565
3566   while (1)
3567     {
3568       /* Search until we get a match for NAME.  It is assumed here that
3569          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3570       if (strcmp (fmt, mo->args) == 0
3571           && mo->pinfo != INSN_MACRO
3572           && is_opcode_valid (mo, TRUE))
3573         break;
3574
3575       ++mo;
3576       gas_assert (mo->name);
3577       gas_assert (strcmp (name, mo->name) == 0);
3578     }
3579
3580   create_insn (&insn, mo);
3581   for (;;)
3582     {
3583       switch (*fmt++)
3584         {
3585         case '\0':
3586           break;
3587
3588         case ',':
3589         case '(':
3590         case ')':
3591           continue;
3592
3593         case '+':
3594           switch (*fmt++)
3595             {
3596             case 'A':
3597             case 'E':
3598               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3599               continue;
3600
3601             case 'B':
3602             case 'F':
3603               /* Note that in the macro case, these arguments are already
3604                  in MSB form.  (When handling the instruction in the
3605                  non-macro case, these arguments are sizes from which
3606                  MSB values must be calculated.)  */
3607               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3608               continue;
3609
3610             case 'C':
3611             case 'G':
3612             case 'H':
3613               /* Note that in the macro case, these arguments are already
3614                  in MSBD form.  (When handling the instruction in the
3615                  non-macro case, these arguments are sizes from which
3616                  MSBD values must be calculated.)  */
3617               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3618               continue;
3619
3620             case 'Q':
3621               INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3622               continue;
3623
3624             default:
3625               internalError ();
3626             }
3627           continue;
3628
3629         case '2':
3630           INSERT_OPERAND (BP, insn, va_arg (args, int));
3631           continue;
3632
3633         case 't':
3634         case 'w':
3635         case 'E':
3636           INSERT_OPERAND (RT, insn, va_arg (args, int));
3637           continue;
3638
3639         case 'c':
3640           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3641           continue;
3642
3643         case 'T':
3644         case 'W':
3645           INSERT_OPERAND (FT, insn, va_arg (args, int));
3646           continue;
3647
3648         case 'd':
3649         case 'G':
3650         case 'K':
3651           INSERT_OPERAND (RD, insn, va_arg (args, int));
3652           continue;
3653
3654         case 'U':
3655           {
3656             int tmp = va_arg (args, int);
3657
3658             INSERT_OPERAND (RT, insn, tmp);
3659             INSERT_OPERAND (RD, insn, tmp);
3660             continue;
3661           }
3662
3663         case 'V':
3664         case 'S':
3665           INSERT_OPERAND (FS, insn, va_arg (args, int));
3666           continue;
3667
3668         case 'z':
3669           continue;
3670
3671         case '<':
3672           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3673           continue;
3674
3675         case 'D':
3676           INSERT_OPERAND (FD, insn, va_arg (args, int));
3677           continue;
3678
3679         case 'B':
3680           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3681           continue;
3682
3683         case 'J':
3684           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3685           continue;
3686
3687         case 'q':
3688           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3689           continue;
3690
3691         case 'b':
3692         case 's':
3693         case 'r':
3694         case 'v':
3695           INSERT_OPERAND (RS, insn, va_arg (args, int));
3696           continue;
3697
3698         case 'i':
3699         case 'j':
3700         case 'o':
3701           macro_read_relocs (&args, r);
3702           gas_assert (*r == BFD_RELOC_GPREL16
3703                   || *r == BFD_RELOC_MIPS_LITERAL
3704                   || *r == BFD_RELOC_MIPS_HIGHER
3705                   || *r == BFD_RELOC_HI16_S
3706                   || *r == BFD_RELOC_LO16
3707                   || *r == BFD_RELOC_MIPS_GOT16
3708                   || *r == BFD_RELOC_MIPS_CALL16
3709                   || *r == BFD_RELOC_MIPS_GOT_DISP
3710                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3711                   || *r == BFD_RELOC_MIPS_GOT_OFST
3712                   || *r == BFD_RELOC_MIPS_GOT_LO16
3713                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3714           continue;
3715
3716         case 'u':
3717           macro_read_relocs (&args, r);
3718           gas_assert (ep != NULL
3719                   && (ep->X_op == O_constant
3720                       || (ep->X_op == O_symbol
3721                           && (*r == BFD_RELOC_MIPS_HIGHEST
3722                               || *r == BFD_RELOC_HI16_S
3723                               || *r == BFD_RELOC_HI16
3724                               || *r == BFD_RELOC_GPREL16
3725                               || *r == BFD_RELOC_MIPS_GOT_HI16
3726                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3727           continue;
3728
3729         case 'p':
3730           gas_assert (ep != NULL);
3731
3732           /*
3733            * This allows macro() to pass an immediate expression for
3734            * creating short branches without creating a symbol.
3735            *
3736            * We don't allow branch relaxation for these branches, as
3737            * they should only appear in ".set nomacro" anyway.
3738            */
3739           if (ep->X_op == O_constant)
3740             {
3741               if ((ep->X_add_number & 3) != 0)
3742                 as_bad (_("branch to misaligned address (0x%lx)"),
3743                         (unsigned long) ep->X_add_number);
3744               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3745                 as_bad (_("branch address range overflow (0x%lx)"),
3746                         (unsigned long) ep->X_add_number);
3747               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3748               ep = NULL;
3749             }
3750           else
3751             *r = BFD_RELOC_16_PCREL_S2;
3752           continue;
3753
3754         case 'a':
3755           gas_assert (ep != NULL);
3756           *r = BFD_RELOC_MIPS_JMP;
3757           continue;
3758
3759         case 'C':
3760           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3761           continue;
3762
3763         case 'k':
3764           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3765           continue;
3766
3767         default:
3768           internalError ();
3769         }
3770       break;
3771     }
3772   va_end (args);
3773   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3774
3775   append_insn (&insn, ep, r);
3776 }
3777
3778 static void
3779 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3780                     va_list args)
3781 {
3782   struct mips_opcode *mo;
3783   struct mips_cl_insn insn;
3784   bfd_reloc_code_real_type r[3]
3785     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3786
3787   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3788   gas_assert (mo);
3789   gas_assert (strcmp (name, mo->name) == 0);
3790
3791   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3792     {
3793       ++mo;
3794       gas_assert (mo->name);
3795       gas_assert (strcmp (name, mo->name) == 0);
3796     }
3797
3798   create_insn (&insn, mo);
3799   for (;;)
3800     {
3801       int c;
3802
3803       c = *fmt++;
3804       switch (c)
3805         {
3806         case '\0':
3807           break;
3808
3809         case ',':
3810         case '(':
3811         case ')':
3812           continue;
3813
3814         case 'y':
3815         case 'w':
3816           MIPS16_INSERT_OPERAND (RY, insn, va_arg (args, int));
3817           continue;
3818
3819         case 'x':
3820         case 'v':
3821           MIPS16_INSERT_OPERAND (RX, insn, va_arg (args, int));
3822           continue;
3823
3824         case 'z':
3825           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (args, int));
3826           continue;
3827
3828         case 'Z':
3829           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (args, int));
3830           continue;
3831
3832         case '0':
3833         case 'S':
3834         case 'P':
3835         case 'R':
3836           continue;
3837
3838         case 'X':
3839           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (args, int));
3840           continue;
3841
3842         case 'Y':
3843           {
3844             int regno;
3845
3846             regno = va_arg (args, int);
3847             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3848             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3849           }
3850           continue;
3851
3852         case '<':
3853         case '>':
3854         case '4':
3855         case '5':
3856         case 'H':
3857         case 'W':
3858         case 'D':
3859         case 'j':
3860         case '8':
3861         case 'V':
3862         case 'C':
3863         case 'U':
3864         case 'k':
3865         case 'K':
3866         case 'p':
3867         case 'q':
3868           {
3869             gas_assert (ep != NULL);
3870
3871             if (ep->X_op != O_constant)
3872               *r = (int) BFD_RELOC_UNUSED + c;
3873             else
3874               {
3875                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3876                               FALSE, &insn.insn_opcode, &insn.use_extend,
3877                               &insn.extend);
3878                 ep = NULL;
3879                 *r = BFD_RELOC_UNUSED;
3880               }
3881           }
3882           continue;
3883
3884         case '6':
3885           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (args, int));
3886           continue;
3887         }
3888
3889       break;
3890     }
3891
3892   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3893
3894   append_insn (&insn, ep, r);
3895 }
3896
3897 /*
3898  * Sign-extend 32-bit mode constants that have bit 31 set and all
3899  * higher bits unset.
3900  */
3901 static void
3902 normalize_constant_expr (expressionS *ex)
3903 {
3904   if (ex->X_op == O_constant
3905       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3906     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3907                         - 0x80000000);
3908 }
3909
3910 /*
3911  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3912  * all higher bits unset.
3913  */
3914 static void
3915 normalize_address_expr (expressionS *ex)
3916 {
3917   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3918         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3919       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3920     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3921                         - 0x80000000);
3922 }
3923
3924 /*
3925  * Generate a "jalr" instruction with a relocation hint to the called
3926  * function.  This occurs in NewABI PIC code.
3927  */
3928 static void
3929 macro_build_jalr (expressionS *ep)
3930 {
3931   char *f = NULL;
3932
3933   if (MIPS_JALR_HINT_P)
3934     {
3935       frag_grow (8);
3936       f = frag_more (0);
3937     }
3938   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
3939   if (MIPS_JALR_HINT_P)
3940     fix_new_exp (frag_now, f - frag_now->fr_literal,
3941                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
3942 }
3943
3944 /*
3945  * Generate a "lui" instruction.
3946  */
3947 static void
3948 macro_build_lui (expressionS *ep, int regnum)
3949 {
3950   expressionS high_expr;
3951   const struct mips_opcode *mo;
3952   struct mips_cl_insn insn;
3953   bfd_reloc_code_real_type r[3]
3954     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3955   const char *name = "lui";
3956   const char *fmt = "t,u";
3957
3958   gas_assert (! mips_opts.mips16);
3959
3960   high_expr = *ep;
3961
3962   if (high_expr.X_op == O_constant)
3963     {
3964       /* We can compute the instruction now without a relocation entry.  */
3965       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
3966                                 >> 16) & 0xffff;
3967       *r = BFD_RELOC_UNUSED;
3968     }
3969   else
3970     {
3971       gas_assert (ep->X_op == O_symbol);
3972       /* _gp_disp is a special case, used from s_cpload.
3973          __gnu_local_gp is used if mips_no_shared.  */
3974       gas_assert (mips_pic == NO_PIC
3975               || (! HAVE_NEWABI
3976                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
3977               || (! mips_in_shared
3978                   && strcmp (S_GET_NAME (ep->X_add_symbol),
3979                              "__gnu_local_gp") == 0));
3980       *r = BFD_RELOC_HI16_S;
3981     }
3982
3983   mo = hash_find (op_hash, name);
3984   gas_assert (strcmp (name, mo->name) == 0);
3985   gas_assert (strcmp (fmt, mo->args) == 0);
3986   create_insn (&insn, mo);
3987
3988   insn.insn_opcode = insn.insn_mo->match;
3989   INSERT_OPERAND (RT, insn, regnum);
3990   if (*r == BFD_RELOC_UNUSED)
3991     {
3992       insn.insn_opcode |= high_expr.X_add_number;
3993       append_insn (&insn, NULL, r);
3994     }
3995   else
3996     append_insn (&insn, &high_expr, r);
3997 }
3998
3999 /* Generate a sequence of instructions to do a load or store from a constant
4000    offset off of a base register (breg) into/from a target register (treg),
4001    using AT if necessary.  */
4002 static void
4003 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4004                               int treg, int breg, int dbl)
4005 {
4006   gas_assert (ep->X_op == O_constant);
4007
4008   /* Sign-extending 32-bit constants makes their handling easier.  */
4009   if (!dbl)
4010     normalize_constant_expr (ep);
4011
4012   /* Right now, this routine can only handle signed 32-bit constants.  */
4013   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4014     as_warn (_("operand overflow"));
4015
4016   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4017     {
4018       /* Signed 16-bit offset will fit in the op.  Easy!  */
4019       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4020     }
4021   else
4022     {
4023       /* 32-bit offset, need multiple instructions and AT, like:
4024            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4025            addu     $tempreg,$tempreg,$breg
4026            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4027          to handle the complete offset.  */
4028       macro_build_lui (ep, AT);
4029       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4030       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4031
4032       if (!mips_opts.at)
4033         as_bad (_("Macro used $at after \".set noat\""));
4034     }
4035 }
4036
4037 /*                      set_at()
4038  * Generates code to set the $at register to true (one)
4039  * if reg is less than the immediate expression.
4040  */
4041 static void
4042 set_at (int reg, int unsignedp)
4043 {
4044   if (imm_expr.X_op == O_constant
4045       && imm_expr.X_add_number >= -0x8000
4046       && imm_expr.X_add_number < 0x8000)
4047     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4048                  AT, reg, BFD_RELOC_LO16);
4049   else
4050     {
4051       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4052       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4053     }
4054 }
4055
4056 /* Warn if an expression is not a constant.  */
4057
4058 static void
4059 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4060 {
4061   if (ex->X_op == O_big)
4062     as_bad (_("unsupported large constant"));
4063   else if (ex->X_op != O_constant)
4064     as_bad (_("Instruction %s requires absolute expression"),
4065             ip->insn_mo->name);
4066
4067   if (HAVE_32BIT_GPRS)
4068     normalize_constant_expr (ex);
4069 }
4070
4071 /* Count the leading zeroes by performing a binary chop. This is a
4072    bulky bit of source, but performance is a LOT better for the
4073    majority of values than a simple loop to count the bits:
4074        for (lcnt = 0; (lcnt < 32); lcnt++)
4075          if ((v) & (1 << (31 - lcnt)))
4076            break;
4077   However it is not code size friendly, and the gain will drop a bit
4078   on certain cached systems.
4079 */
4080 #define COUNT_TOP_ZEROES(v)             \
4081   (((v) & ~0xffff) == 0                 \
4082    ? ((v) & ~0xff) == 0                 \
4083      ? ((v) & ~0xf) == 0                \
4084        ? ((v) & ~0x3) == 0              \
4085          ? ((v) & ~0x1) == 0            \
4086            ? !(v)                       \
4087              ? 32                       \
4088              : 31                       \
4089            : 30                         \
4090          : ((v) & ~0x7) == 0            \
4091            ? 29                         \
4092            : 28                         \
4093        : ((v) & ~0x3f) == 0             \
4094          ? ((v) & ~0x1f) == 0           \
4095            ? 27                         \
4096            : 26                         \
4097          : ((v) & ~0x7f) == 0           \
4098            ? 25                         \
4099            : 24                         \
4100      : ((v) & ~0xfff) == 0              \
4101        ? ((v) & ~0x3ff) == 0            \
4102          ? ((v) & ~0x1ff) == 0          \
4103            ? 23                         \
4104            : 22                         \
4105          : ((v) & ~0x7ff) == 0          \
4106            ? 21                         \
4107            : 20                         \
4108        : ((v) & ~0x3fff) == 0           \
4109          ? ((v) & ~0x1fff) == 0         \
4110            ? 19                         \
4111            : 18                         \
4112          : ((v) & ~0x7fff) == 0         \
4113            ? 17                         \
4114            : 16                         \
4115    : ((v) & ~0xffffff) == 0             \
4116      ? ((v) & ~0xfffff) == 0            \
4117        ? ((v) & ~0x3ffff) == 0          \
4118          ? ((v) & ~0x1ffff) == 0        \
4119            ? 15                         \
4120            : 14                         \
4121          : ((v) & ~0x7ffff) == 0        \
4122            ? 13                         \
4123            : 12                         \
4124        : ((v) & ~0x3fffff) == 0         \
4125          ? ((v) & ~0x1fffff) == 0       \
4126            ? 11                         \
4127            : 10                         \
4128          : ((v) & ~0x7fffff) == 0       \
4129            ? 9                          \
4130            : 8                          \
4131      : ((v) & ~0xfffffff) == 0          \
4132        ? ((v) & ~0x3ffffff) == 0        \
4133          ? ((v) & ~0x1ffffff) == 0      \
4134            ? 7                          \
4135            : 6                          \
4136          : ((v) & ~0x7ffffff) == 0      \
4137            ? 5                          \
4138            : 4                          \
4139        : ((v) & ~0x3fffffff) == 0       \
4140          ? ((v) & ~0x1fffffff) == 0     \
4141            ? 3                          \
4142            : 2                          \
4143          : ((v) & ~0x7fffffff) == 0     \
4144            ? 1                          \
4145            : 0)
4146
4147 /*                      load_register()
4148  *  This routine generates the least number of instructions necessary to load
4149  *  an absolute expression value into a register.
4150  */
4151 static void
4152 load_register (int reg, expressionS *ep, int dbl)
4153 {
4154   int freg;
4155   expressionS hi32, lo32;
4156
4157   if (ep->X_op != O_big)
4158     {
4159       gas_assert (ep->X_op == O_constant);
4160
4161       /* Sign-extending 32-bit constants makes their handling easier.  */
4162       if (!dbl)
4163         normalize_constant_expr (ep);
4164
4165       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4166         {
4167           /* We can handle 16 bit signed values with an addiu to
4168              $zero.  No need to ever use daddiu here, since $zero and
4169              the result are always correct in 32 bit mode.  */
4170           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4171           return;
4172         }
4173       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4174         {
4175           /* We can handle 16 bit unsigned values with an ori to
4176              $zero.  */
4177           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4178           return;
4179         }
4180       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4181         {
4182           /* 32 bit values require an lui.  */
4183           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4184           if ((ep->X_add_number & 0xffff) != 0)
4185             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4186           return;
4187         }
4188     }
4189
4190   /* The value is larger than 32 bits.  */
4191
4192   if (!dbl || HAVE_32BIT_GPRS)
4193     {
4194       char value[32];
4195
4196       sprintf_vma (value, ep->X_add_number);
4197       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4198       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4199       return;
4200     }
4201
4202   if (ep->X_op != O_big)
4203     {
4204       hi32 = *ep;
4205       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4206       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4207       hi32.X_add_number &= 0xffffffff;
4208       lo32 = *ep;
4209       lo32.X_add_number &= 0xffffffff;
4210     }
4211   else
4212     {
4213       gas_assert (ep->X_add_number > 2);
4214       if (ep->X_add_number == 3)
4215         generic_bignum[3] = 0;
4216       else if (ep->X_add_number > 4)
4217         as_bad (_("Number larger than 64 bits"));
4218       lo32.X_op = O_constant;
4219       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4220       hi32.X_op = O_constant;
4221       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4222     }
4223
4224   if (hi32.X_add_number == 0)
4225     freg = 0;
4226   else
4227     {
4228       int shift, bit;
4229       unsigned long hi, lo;
4230
4231       if (hi32.X_add_number == (offsetT) 0xffffffff)
4232         {
4233           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4234             {
4235               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4236               return;
4237             }
4238           if (lo32.X_add_number & 0x80000000)
4239             {
4240               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4241               if (lo32.X_add_number & 0xffff)
4242                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4243               return;
4244             }
4245         }
4246
4247       /* Check for 16bit shifted constant.  We know that hi32 is
4248          non-zero, so start the mask on the first bit of the hi32
4249          value.  */
4250       shift = 17;
4251       do
4252         {
4253           unsigned long himask, lomask;
4254
4255           if (shift < 32)
4256             {
4257               himask = 0xffff >> (32 - shift);
4258               lomask = (0xffff << shift) & 0xffffffff;
4259             }
4260           else
4261             {
4262               himask = 0xffff << (shift - 32);
4263               lomask = 0;
4264             }
4265           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4266               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4267             {
4268               expressionS tmp;
4269
4270               tmp.X_op = O_constant;
4271               if (shift < 32)
4272                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4273                                     | (lo32.X_add_number >> shift));
4274               else
4275                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4276               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4277               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4278                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4279               return;
4280             }
4281           ++shift;
4282         }
4283       while (shift <= (64 - 16));
4284
4285       /* Find the bit number of the lowest one bit, and store the
4286          shifted value in hi/lo.  */
4287       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4288       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4289       if (lo != 0)
4290         {
4291           bit = 0;
4292           while ((lo & 1) == 0)
4293             {
4294               lo >>= 1;
4295               ++bit;
4296             }
4297           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4298           hi >>= bit;
4299         }
4300       else
4301         {
4302           bit = 32;
4303           while ((hi & 1) == 0)
4304             {
4305               hi >>= 1;
4306               ++bit;
4307             }
4308           lo = hi;
4309           hi = 0;
4310         }
4311
4312       /* Optimize if the shifted value is a (power of 2) - 1.  */
4313       if ((hi == 0 && ((lo + 1) & lo) == 0)
4314           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4315         {
4316           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4317           if (shift != 0)
4318             {
4319               expressionS tmp;
4320
4321               /* This instruction will set the register to be all
4322                  ones.  */
4323               tmp.X_op = O_constant;
4324               tmp.X_add_number = (offsetT) -1;
4325               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4326               if (bit != 0)
4327                 {
4328                   bit += shift;
4329                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4330                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4331                 }
4332               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4333                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4334               return;
4335             }
4336         }
4337
4338       /* Sign extend hi32 before calling load_register, because we can
4339          generally get better code when we load a sign extended value.  */
4340       if ((hi32.X_add_number & 0x80000000) != 0)
4341         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4342       load_register (reg, &hi32, 0);
4343       freg = reg;
4344     }
4345   if ((lo32.X_add_number & 0xffff0000) == 0)
4346     {
4347       if (freg != 0)
4348         {
4349           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4350           freg = reg;
4351         }
4352     }
4353   else
4354     {
4355       expressionS mid16;
4356
4357       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4358         {
4359           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4360           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4361           return;
4362         }
4363
4364       if (freg != 0)
4365         {
4366           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4367           freg = reg;
4368         }
4369       mid16 = lo32;
4370       mid16.X_add_number >>= 16;
4371       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4372       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4373       freg = reg;
4374     }
4375   if ((lo32.X_add_number & 0xffff) != 0)
4376     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4377 }
4378
4379 static inline void
4380 load_delay_nop (void)
4381 {
4382   if (!gpr_interlocks)
4383     macro_build (NULL, "nop", "");
4384 }
4385
4386 /* Load an address into a register.  */
4387
4388 static void
4389 load_address (int reg, expressionS *ep, int *used_at)
4390 {
4391   if (ep->X_op != O_constant
4392       && ep->X_op != O_symbol)
4393     {
4394       as_bad (_("expression too complex"));
4395       ep->X_op = O_constant;
4396     }
4397
4398   if (ep->X_op == O_constant)
4399     {
4400       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4401       return;
4402     }
4403
4404   if (mips_pic == NO_PIC)
4405     {
4406       /* If this is a reference to a GP relative symbol, we want
4407            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4408          Otherwise we want
4409            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4410            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4411          If we have an addend, we always use the latter form.
4412
4413          With 64bit address space and a usable $at we want
4414            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4415            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4416            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4417            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4418            dsll32       $reg,0
4419            daddu        $reg,$reg,$at
4420
4421          If $at is already in use, we use a path which is suboptimal
4422          on superscalar processors.
4423            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4424            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4425            dsll         $reg,16
4426            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4427            dsll         $reg,16
4428            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4429
4430          For GP relative symbols in 64bit address space we can use
4431          the same sequence as in 32bit address space.  */
4432       if (HAVE_64BIT_SYMBOLS)
4433         {
4434           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4435               && !nopic_need_relax (ep->X_add_symbol, 1))
4436             {
4437               relax_start (ep->X_add_symbol);
4438               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4439                            mips_gp_register, BFD_RELOC_GPREL16);
4440               relax_switch ();
4441             }
4442
4443           if (*used_at == 0 && mips_opts.at)
4444             {
4445               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4446               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4447               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4448                            BFD_RELOC_MIPS_HIGHER);
4449               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4450               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4451               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4452               *used_at = 1;
4453             }
4454           else
4455             {
4456               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4457               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4458                            BFD_RELOC_MIPS_HIGHER);
4459               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4460               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4461               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4462               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4463             }
4464
4465           if (mips_relax.sequence)
4466             relax_end ();
4467         }
4468       else
4469         {
4470           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4471               && !nopic_need_relax (ep->X_add_symbol, 1))
4472             {
4473               relax_start (ep->X_add_symbol);
4474               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4475                            mips_gp_register, BFD_RELOC_GPREL16);
4476               relax_switch ();
4477             }
4478           macro_build_lui (ep, reg);
4479           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4480                        reg, reg, BFD_RELOC_LO16);
4481           if (mips_relax.sequence)
4482             relax_end ();
4483         }
4484     }
4485   else if (!mips_big_got)
4486     {
4487       expressionS ex;
4488
4489       /* If this is a reference to an external symbol, we want
4490            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4491          Otherwise we want
4492            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4493            nop
4494            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4495          If there is a constant, it must be added in after.
4496
4497          If we have NewABI, we want
4498            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4499          unless we're referencing a global symbol with a non-zero
4500          offset, in which case cst must be added separately.  */
4501       if (HAVE_NEWABI)
4502         {
4503           if (ep->X_add_number)
4504             {
4505               ex.X_add_number = ep->X_add_number;
4506               ep->X_add_number = 0;
4507               relax_start (ep->X_add_symbol);
4508               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4509                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4510               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4511                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4512               ex.X_op = O_constant;
4513               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4514                            reg, reg, BFD_RELOC_LO16);
4515               ep->X_add_number = ex.X_add_number;
4516               relax_switch ();
4517             }
4518           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4519                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4520           if (mips_relax.sequence)
4521             relax_end ();
4522         }
4523       else
4524         {
4525           ex.X_add_number = ep->X_add_number;
4526           ep->X_add_number = 0;
4527           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4528                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4529           load_delay_nop ();
4530           relax_start (ep->X_add_symbol);
4531           relax_switch ();
4532           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4533                        BFD_RELOC_LO16);
4534           relax_end ();
4535
4536           if (ex.X_add_number != 0)
4537             {
4538               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4539                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4540               ex.X_op = O_constant;
4541               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4542                            reg, reg, BFD_RELOC_LO16);
4543             }
4544         }
4545     }
4546   else if (mips_big_got)
4547     {
4548       expressionS ex;
4549
4550       /* This is the large GOT case.  If this is a reference to an
4551          external symbol, we want
4552            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4553            addu         $reg,$reg,$gp
4554            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4555
4556          Otherwise, for a reference to a local symbol in old ABI, we want
4557            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4558            nop
4559            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4560          If there is a constant, it must be added in after.
4561
4562          In the NewABI, for local symbols, with or without offsets, we want:
4563            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4564            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4565       */
4566       if (HAVE_NEWABI)
4567         {
4568           ex.X_add_number = ep->X_add_number;
4569           ep->X_add_number = 0;
4570           relax_start (ep->X_add_symbol);
4571           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4572           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4573                        reg, reg, mips_gp_register);
4574           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4575                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4576           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4577             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4578           else if (ex.X_add_number)
4579             {
4580               ex.X_op = O_constant;
4581               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4582                            BFD_RELOC_LO16);
4583             }
4584
4585           ep->X_add_number = ex.X_add_number;
4586           relax_switch ();
4587           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4588                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4589           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4590                        BFD_RELOC_MIPS_GOT_OFST);
4591           relax_end ();
4592         }
4593       else
4594         {
4595           ex.X_add_number = ep->X_add_number;
4596           ep->X_add_number = 0;
4597           relax_start (ep->X_add_symbol);
4598           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4599           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4600                        reg, reg, mips_gp_register);
4601           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4602                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4603           relax_switch ();
4604           if (reg_needs_delay (mips_gp_register))
4605             {
4606               /* We need a nop before loading from $gp.  This special
4607                  check is required because the lui which starts the main
4608                  instruction stream does not refer to $gp, and so will not
4609                  insert the nop which may be required.  */
4610               macro_build (NULL, "nop", "");
4611             }
4612           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4613                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4614           load_delay_nop ();
4615           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4616                        BFD_RELOC_LO16);
4617           relax_end ();
4618
4619           if (ex.X_add_number != 0)
4620             {
4621               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4622                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4623               ex.X_op = O_constant;
4624               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4625                            BFD_RELOC_LO16);
4626             }
4627         }
4628     }
4629   else
4630     abort ();
4631
4632   if (!mips_opts.at && *used_at == 1)
4633     as_bad (_("Macro used $at after \".set noat\""));
4634 }
4635
4636 /* Move the contents of register SOURCE into register DEST.  */
4637
4638 static void
4639 move_register (int dest, int source)
4640 {
4641   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4642                dest, source, 0);
4643 }
4644
4645 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4646    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4647    The two alternatives are:
4648
4649    Global symbol                Local sybmol
4650    -------------                ------------
4651    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4652    ...                          ...
4653    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4654
4655    load_got_offset emits the first instruction and add_got_offset
4656    emits the second for a 16-bit offset or add_got_offset_hilo emits
4657    a sequence to add a 32-bit offset using a scratch register.  */
4658
4659 static void
4660 load_got_offset (int dest, expressionS *local)
4661 {
4662   expressionS global;
4663
4664   global = *local;
4665   global.X_add_number = 0;
4666
4667   relax_start (local->X_add_symbol);
4668   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4669                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4670   relax_switch ();
4671   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4672                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4673   relax_end ();
4674 }
4675
4676 static void
4677 add_got_offset (int dest, expressionS *local)
4678 {
4679   expressionS global;
4680
4681   global.X_op = O_constant;
4682   global.X_op_symbol = NULL;
4683   global.X_add_symbol = NULL;
4684   global.X_add_number = local->X_add_number;
4685
4686   relax_start (local->X_add_symbol);
4687   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4688                dest, dest, BFD_RELOC_LO16);
4689   relax_switch ();
4690   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4691   relax_end ();
4692 }
4693
4694 static void
4695 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4696 {
4697   expressionS global;
4698   int hold_mips_optimize;
4699
4700   global.X_op = O_constant;
4701   global.X_op_symbol = NULL;
4702   global.X_add_symbol = NULL;
4703   global.X_add_number = local->X_add_number;
4704
4705   relax_start (local->X_add_symbol);
4706   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4707   relax_switch ();
4708   /* Set mips_optimize around the lui instruction to avoid
4709      inserting an unnecessary nop after the lw.  */
4710   hold_mips_optimize = mips_optimize;
4711   mips_optimize = 2;
4712   macro_build_lui (&global, tmp);
4713   mips_optimize = hold_mips_optimize;
4714   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4715   relax_end ();
4716
4717   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4718 }
4719
4720 /*
4721  *                      Build macros
4722  *   This routine implements the seemingly endless macro or synthesized
4723  * instructions and addressing modes in the mips assembly language. Many
4724  * of these macros are simple and are similar to each other. These could
4725  * probably be handled by some kind of table or grammar approach instead of
4726  * this verbose method. Others are not simple macros but are more like
4727  * optimizing code generation.
4728  *   One interesting optimization is when several store macros appear
4729  * consecutively that would load AT with the upper half of the same address.
4730  * The ensuing load upper instructions are ommited. This implies some kind
4731  * of global optimization. We currently only optimize within a single macro.
4732  *   For many of the load and store macros if the address is specified as a
4733  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4734  * first load register 'at' with zero and use it as the base register. The
4735  * mips assembler simply uses register $zero. Just one tiny optimization
4736  * we're missing.
4737  */
4738 static void
4739 macro (struct mips_cl_insn *ip)
4740 {
4741   unsigned int treg, sreg, dreg, breg;
4742   unsigned int tempreg;
4743   int mask;
4744   int used_at = 0;
4745   expressionS expr1;
4746   const char *s;
4747   const char *s2;
4748   const char *fmt;
4749   int likely = 0;
4750   int dbl = 0;
4751   int coproc = 0;
4752   int lr = 0;
4753   int imm = 0;
4754   int call = 0;
4755   int off;
4756   offsetT maxnum;
4757   bfd_reloc_code_real_type r;
4758   int hold_mips_optimize;
4759
4760   gas_assert (! mips_opts.mips16);
4761
4762   treg = (ip->insn_opcode >> 16) & 0x1f;
4763   dreg = (ip->insn_opcode >> 11) & 0x1f;
4764   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4765   mask = ip->insn_mo->mask;
4766
4767   expr1.X_op = O_constant;
4768   expr1.X_op_symbol = NULL;
4769   expr1.X_add_symbol = NULL;
4770   expr1.X_add_number = 1;
4771
4772   switch (mask)
4773     {
4774     case M_DABS:
4775       dbl = 1;
4776     case M_ABS:
4777       /* bgez $a0,.+12
4778          move v0,$a0
4779          sub v0,$zero,$a0
4780          */
4781
4782       start_noreorder ();
4783
4784       expr1.X_add_number = 8;
4785       macro_build (&expr1, "bgez", "s,p", sreg);
4786       if (dreg == sreg)
4787         macro_build (NULL, "nop", "", 0);
4788       else
4789         move_register (dreg, sreg);
4790       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4791
4792       end_noreorder ();
4793       break;
4794
4795     case M_ADD_I:
4796       s = "addi";
4797       s2 = "add";
4798       goto do_addi;
4799     case M_ADDU_I:
4800       s = "addiu";
4801       s2 = "addu";
4802       goto do_addi;
4803     case M_DADD_I:
4804       dbl = 1;
4805       s = "daddi";
4806       s2 = "dadd";
4807       goto do_addi;
4808     case M_DADDU_I:
4809       dbl = 1;
4810       s = "daddiu";
4811       s2 = "daddu";
4812     do_addi:
4813       if (imm_expr.X_op == O_constant
4814           && imm_expr.X_add_number >= -0x8000
4815           && imm_expr.X_add_number < 0x8000)
4816         {
4817           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4818           break;
4819         }
4820       used_at = 1;
4821       load_register (AT, &imm_expr, dbl);
4822       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4823       break;
4824
4825     case M_AND_I:
4826       s = "andi";
4827       s2 = "and";
4828       goto do_bit;
4829     case M_OR_I:
4830       s = "ori";
4831       s2 = "or";
4832       goto do_bit;
4833     case M_NOR_I:
4834       s = "";
4835       s2 = "nor";
4836       goto do_bit;
4837     case M_XOR_I:
4838       s = "xori";
4839       s2 = "xor";
4840     do_bit:
4841       if (imm_expr.X_op == O_constant
4842           && imm_expr.X_add_number >= 0
4843           && imm_expr.X_add_number < 0x10000)
4844         {
4845           if (mask != M_NOR_I)
4846             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4847           else
4848             {
4849               macro_build (&imm_expr, "ori", "t,r,i",
4850                            treg, sreg, BFD_RELOC_LO16);
4851               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4852             }
4853           break;
4854         }
4855
4856       used_at = 1;
4857       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4858       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4859       break;
4860
4861     case M_BALIGN:
4862       switch (imm_expr.X_add_number)
4863         {
4864         case 0:
4865           macro_build (NULL, "nop", "");
4866           break;
4867         case 2:
4868           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4869           break;
4870         default:
4871           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4872                        (int)imm_expr.X_add_number);
4873           break;
4874         }
4875       break;
4876
4877     case M_BEQ_I:
4878       s = "beq";
4879       goto beq_i;
4880     case M_BEQL_I:
4881       s = "beql";
4882       likely = 1;
4883       goto beq_i;
4884     case M_BNE_I:
4885       s = "bne";
4886       goto beq_i;
4887     case M_BNEL_I:
4888       s = "bnel";
4889       likely = 1;
4890     beq_i:
4891       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4892         {
4893           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4894           break;
4895         }
4896       used_at = 1;
4897       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4898       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4899       break;
4900
4901     case M_BGEL:
4902       likely = 1;
4903     case M_BGE:
4904       if (treg == 0)
4905         {
4906           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4907           break;
4908         }
4909       if (sreg == 0)
4910         {
4911           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4912           break;
4913         }
4914       used_at = 1;
4915       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4916       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4917       break;
4918
4919     case M_BGTL_I:
4920       likely = 1;
4921     case M_BGT_I:
4922       /* check for > max integer */
4923       maxnum = 0x7fffffff;
4924       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4925         {
4926           maxnum <<= 16;
4927           maxnum |= 0xffff;
4928           maxnum <<= 16;
4929           maxnum |= 0xffff;
4930         }
4931       if (imm_expr.X_op == O_constant
4932           && imm_expr.X_add_number >= maxnum
4933           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4934         {
4935         do_false:
4936           /* result is always false */
4937           if (! likely)
4938             macro_build (NULL, "nop", "", 0);
4939           else
4940             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
4941           break;
4942         }
4943       if (imm_expr.X_op != O_constant)
4944         as_bad (_("Unsupported large constant"));
4945       ++imm_expr.X_add_number;
4946       /* FALLTHROUGH */
4947     case M_BGE_I:
4948     case M_BGEL_I:
4949       if (mask == M_BGEL_I)
4950         likely = 1;
4951       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4952         {
4953           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4954           break;
4955         }
4956       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
4957         {
4958           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
4959           break;
4960         }
4961       maxnum = 0x7fffffff;
4962       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4963         {
4964           maxnum <<= 16;
4965           maxnum |= 0xffff;
4966           maxnum <<= 16;
4967           maxnum |= 0xffff;
4968         }
4969       maxnum = - maxnum - 1;
4970       if (imm_expr.X_op == O_constant
4971           && imm_expr.X_add_number <= maxnum
4972           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
4973         {
4974         do_true:
4975           /* result is always true */
4976           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
4977           macro_build (&offset_expr, "b", "p");
4978           break;
4979         }
4980       used_at = 1;
4981       set_at (sreg, 0);
4982       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4983       break;
4984
4985     case M_BGEUL:
4986       likely = 1;
4987     case M_BGEU:
4988       if (treg == 0)
4989         goto do_true;
4990       if (sreg == 0)
4991         {
4992           macro_build (&offset_expr, likely ? "beql" : "beq",
4993                        "s,t,p", 0, treg);
4994           break;
4995         }
4996       used_at = 1;
4997       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
4998       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4999       break;
5000
5001     case M_BGTUL_I:
5002       likely = 1;
5003     case M_BGTU_I:
5004       if (sreg == 0
5005           || (HAVE_32BIT_GPRS
5006               && imm_expr.X_op == O_constant
5007               && imm_expr.X_add_number == (offsetT) 0xffffffff))
5008         goto do_false;
5009       if (imm_expr.X_op != O_constant)
5010         as_bad (_("Unsupported large constant"));
5011       ++imm_expr.X_add_number;
5012       /* FALLTHROUGH */
5013     case M_BGEU_I:
5014     case M_BGEUL_I:
5015       if (mask == M_BGEUL_I)
5016         likely = 1;
5017       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5018         goto do_true;
5019       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5020         {
5021           macro_build (&offset_expr, likely ? "bnel" : "bne",
5022                        "s,t,p", sreg, 0);
5023           break;
5024         }
5025       used_at = 1;
5026       set_at (sreg, 1);
5027       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5028       break;
5029
5030     case M_BGTL:
5031       likely = 1;
5032     case M_BGT:
5033       if (treg == 0)
5034         {
5035           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5036           break;
5037         }
5038       if (sreg == 0)
5039         {
5040           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5041           break;
5042         }
5043       used_at = 1;
5044       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5045       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5046       break;
5047
5048     case M_BGTUL:
5049       likely = 1;
5050     case M_BGTU:
5051       if (treg == 0)
5052         {
5053           macro_build (&offset_expr, likely ? "bnel" : "bne",
5054                        "s,t,p", sreg, 0);
5055           break;
5056         }
5057       if (sreg == 0)
5058         goto do_false;
5059       used_at = 1;
5060       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5061       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5062       break;
5063
5064     case M_BLEL:
5065       likely = 1;
5066     case M_BLE:
5067       if (treg == 0)
5068         {
5069           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5070           break;
5071         }
5072       if (sreg == 0)
5073         {
5074           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5075           break;
5076         }
5077       used_at = 1;
5078       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5079       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5080       break;
5081
5082     case M_BLEL_I:
5083       likely = 1;
5084     case M_BLE_I:
5085       maxnum = 0x7fffffff;
5086       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5087         {
5088           maxnum <<= 16;
5089           maxnum |= 0xffff;
5090           maxnum <<= 16;
5091           maxnum |= 0xffff;
5092         }
5093       if (imm_expr.X_op == O_constant
5094           && imm_expr.X_add_number >= maxnum
5095           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5096         goto do_true;
5097       if (imm_expr.X_op != O_constant)
5098         as_bad (_("Unsupported large constant"));
5099       ++imm_expr.X_add_number;
5100       /* FALLTHROUGH */
5101     case M_BLT_I:
5102     case M_BLTL_I:
5103       if (mask == M_BLTL_I)
5104         likely = 1;
5105       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5106         {
5107           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5108           break;
5109         }
5110       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5111         {
5112           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5113           break;
5114         }
5115       used_at = 1;
5116       set_at (sreg, 0);
5117       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5118       break;
5119
5120     case M_BLEUL:
5121       likely = 1;
5122     case M_BLEU:
5123       if (treg == 0)
5124         {
5125           macro_build (&offset_expr, likely ? "beql" : "beq",
5126                        "s,t,p", sreg, 0);
5127           break;
5128         }
5129       if (sreg == 0)
5130         goto do_true;
5131       used_at = 1;
5132       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5133       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5134       break;
5135
5136     case M_BLEUL_I:
5137       likely = 1;
5138     case M_BLEU_I:
5139       if (sreg == 0
5140           || (HAVE_32BIT_GPRS
5141               && imm_expr.X_op == O_constant
5142               && imm_expr.X_add_number == (offsetT) 0xffffffff))
5143         goto do_true;
5144       if (imm_expr.X_op != O_constant)
5145         as_bad (_("Unsupported large constant"));
5146       ++imm_expr.X_add_number;
5147       /* FALLTHROUGH */
5148     case M_BLTU_I:
5149     case M_BLTUL_I:
5150       if (mask == M_BLTUL_I)
5151         likely = 1;
5152       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5153         goto do_false;
5154       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5155         {
5156           macro_build (&offset_expr, likely ? "beql" : "beq",
5157                        "s,t,p", sreg, 0);
5158           break;
5159         }
5160       used_at = 1;
5161       set_at (sreg, 1);
5162       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5163       break;
5164
5165     case M_BLTL:
5166       likely = 1;
5167     case M_BLT:
5168       if (treg == 0)
5169         {
5170           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5171           break;
5172         }
5173       if (sreg == 0)
5174         {
5175           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5176           break;
5177         }
5178       used_at = 1;
5179       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5180       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5181       break;
5182
5183     case M_BLTUL:
5184       likely = 1;
5185     case M_BLTU:
5186       if (treg == 0)
5187         goto do_false;
5188       if (sreg == 0)
5189         {
5190           macro_build (&offset_expr, likely ? "bnel" : "bne",
5191                        "s,t,p", 0, treg);
5192           break;
5193         }
5194       used_at = 1;
5195       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5196       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5197       break;
5198
5199     case M_DEXT:
5200       {
5201         unsigned long pos;
5202         unsigned long size;
5203
5204         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5205           {
5206             as_bad (_("Unsupported large constant"));
5207             pos = size = 1;
5208           }
5209         else
5210           {
5211             pos = (unsigned long) imm_expr.X_add_number;
5212             size = (unsigned long) imm2_expr.X_add_number;
5213           }
5214
5215         if (pos > 63)
5216           {
5217             as_bad (_("Improper position (%lu)"), pos);
5218             pos = 1;
5219           }
5220         if (size == 0 || size > 64
5221             || (pos + size - 1) > 63)
5222           {
5223             as_bad (_("Improper extract size (%lu, position %lu)"),
5224                     size, pos);
5225             size = 1;
5226           }
5227
5228         if (size <= 32 && pos < 32)
5229           {
5230             s = "dext";
5231             fmt = "t,r,+A,+C";
5232           }
5233         else if (size <= 32)
5234           {
5235             s = "dextu";
5236             fmt = "t,r,+E,+H";
5237           }
5238         else
5239           {
5240             s = "dextm";
5241             fmt = "t,r,+A,+G";
5242           }
5243         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5244       }
5245       break;
5246
5247     case M_DINS:
5248       {
5249         unsigned long pos;
5250         unsigned long size;
5251
5252         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5253           {
5254             as_bad (_("Unsupported large constant"));
5255             pos = size = 1;
5256           }
5257         else
5258           {
5259             pos = (unsigned long) imm_expr.X_add_number;
5260             size = (unsigned long) imm2_expr.X_add_number;
5261           }
5262
5263         if (pos > 63)
5264           {
5265             as_bad (_("Improper position (%lu)"), pos);
5266             pos = 1;
5267           }
5268         if (size == 0 || size > 64
5269             || (pos + size - 1) > 63)
5270           {
5271             as_bad (_("Improper insert size (%lu, position %lu)"),
5272                     size, pos);
5273             size = 1;
5274           }
5275
5276         if (pos < 32 && (pos + size - 1) < 32)
5277           {
5278             s = "dins";
5279             fmt = "t,r,+A,+B";
5280           }
5281         else if (pos >= 32)
5282           {
5283             s = "dinsu";
5284             fmt = "t,r,+E,+F";
5285           }
5286         else
5287           {
5288             s = "dinsm";
5289             fmt = "t,r,+A,+F";
5290           }
5291         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5292                      (int) (pos + size - 1));
5293       }
5294       break;
5295
5296     case M_DDIV_3:
5297       dbl = 1;
5298     case M_DIV_3:
5299       s = "mflo";
5300       goto do_div3;
5301     case M_DREM_3:
5302       dbl = 1;
5303     case M_REM_3:
5304       s = "mfhi";
5305     do_div3:
5306       if (treg == 0)
5307         {
5308           as_warn (_("Divide by zero."));
5309           if (mips_trap)
5310             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5311           else
5312             macro_build (NULL, "break", "c", 7);
5313           break;
5314         }
5315
5316       start_noreorder ();
5317       if (mips_trap)
5318         {
5319           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5320           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5321         }
5322       else
5323         {
5324           expr1.X_add_number = 8;
5325           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5326           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5327           macro_build (NULL, "break", "c", 7);
5328         }
5329       expr1.X_add_number = -1;
5330       used_at = 1;
5331       load_register (AT, &expr1, dbl);
5332       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5333       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5334       if (dbl)
5335         {
5336           expr1.X_add_number = 1;
5337           load_register (AT, &expr1, dbl);
5338           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5339         }
5340       else
5341         {
5342           expr1.X_add_number = 0x80000000;
5343           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5344         }
5345       if (mips_trap)
5346         {
5347           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5348           /* We want to close the noreorder block as soon as possible, so
5349              that later insns are available for delay slot filling.  */
5350           end_noreorder ();
5351         }
5352       else
5353         {
5354           expr1.X_add_number = 8;
5355           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5356           macro_build (NULL, "nop", "", 0);
5357
5358           /* We want to close the noreorder block as soon as possible, so
5359              that later insns are available for delay slot filling.  */
5360           end_noreorder ();
5361
5362           macro_build (NULL, "break", "c", 6);
5363         }
5364       macro_build (NULL, s, "d", dreg);
5365       break;
5366
5367     case M_DIV_3I:
5368       s = "div";
5369       s2 = "mflo";
5370       goto do_divi;
5371     case M_DIVU_3I:
5372       s = "divu";
5373       s2 = "mflo";
5374       goto do_divi;
5375     case M_REM_3I:
5376       s = "div";
5377       s2 = "mfhi";
5378       goto do_divi;
5379     case M_REMU_3I:
5380       s = "divu";
5381       s2 = "mfhi";
5382       goto do_divi;
5383     case M_DDIV_3I:
5384       dbl = 1;
5385       s = "ddiv";
5386       s2 = "mflo";
5387       goto do_divi;
5388     case M_DDIVU_3I:
5389       dbl = 1;
5390       s = "ddivu";
5391       s2 = "mflo";
5392       goto do_divi;
5393     case M_DREM_3I:
5394       dbl = 1;
5395       s = "ddiv";
5396       s2 = "mfhi";
5397       goto do_divi;
5398     case M_DREMU_3I:
5399       dbl = 1;
5400       s = "ddivu";
5401       s2 = "mfhi";
5402     do_divi:
5403       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5404         {
5405           as_warn (_("Divide by zero."));
5406           if (mips_trap)
5407             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5408           else
5409             macro_build (NULL, "break", "c", 7);
5410           break;
5411         }
5412       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5413         {
5414           if (strcmp (s2, "mflo") == 0)
5415             move_register (dreg, sreg);
5416           else
5417             move_register (dreg, 0);
5418           break;
5419         }
5420       if (imm_expr.X_op == O_constant
5421           && imm_expr.X_add_number == -1
5422           && s[strlen (s) - 1] != 'u')
5423         {
5424           if (strcmp (s2, "mflo") == 0)
5425             {
5426               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5427             }
5428           else
5429             move_register (dreg, 0);
5430           break;
5431         }
5432
5433       used_at = 1;
5434       load_register (AT, &imm_expr, dbl);
5435       macro_build (NULL, s, "z,s,t", sreg, AT);
5436       macro_build (NULL, s2, "d", dreg);
5437       break;
5438
5439     case M_DIVU_3:
5440       s = "divu";
5441       s2 = "mflo";
5442       goto do_divu3;
5443     case M_REMU_3:
5444       s = "divu";
5445       s2 = "mfhi";
5446       goto do_divu3;
5447     case M_DDIVU_3:
5448       s = "ddivu";
5449       s2 = "mflo";
5450       goto do_divu3;
5451     case M_DREMU_3:
5452       s = "ddivu";
5453       s2 = "mfhi";
5454     do_divu3:
5455       start_noreorder ();
5456       if (mips_trap)
5457         {
5458           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5459           macro_build (NULL, s, "z,s,t", sreg, treg);
5460           /* We want to close the noreorder block as soon as possible, so
5461              that later insns are available for delay slot filling.  */
5462           end_noreorder ();
5463         }
5464       else
5465         {
5466           expr1.X_add_number = 8;
5467           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5468           macro_build (NULL, s, "z,s,t", sreg, treg);
5469
5470           /* We want to close the noreorder block as soon as possible, so
5471              that later insns are available for delay slot filling.  */
5472           end_noreorder ();
5473           macro_build (NULL, "break", "c", 7);
5474         }
5475       macro_build (NULL, s2, "d", dreg);
5476       break;
5477
5478     case M_DLCA_AB:
5479       dbl = 1;
5480     case M_LCA_AB:
5481       call = 1;
5482       goto do_la;
5483     case M_DLA_AB:
5484       dbl = 1;
5485     case M_LA_AB:
5486     do_la:
5487       /* Load the address of a symbol into a register.  If breg is not
5488          zero, we then add a base register to it.  */
5489
5490       if (dbl && HAVE_32BIT_GPRS)
5491         as_warn (_("dla used to load 32-bit register"));
5492
5493       if (! dbl && HAVE_64BIT_OBJECTS)
5494         as_warn (_("la used to load 64-bit address"));
5495
5496       if (offset_expr.X_op == O_constant
5497           && offset_expr.X_add_number >= -0x8000
5498           && offset_expr.X_add_number < 0x8000)
5499         {
5500           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5501                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5502           break;
5503         }
5504
5505       if (mips_opts.at && (treg == breg))
5506         {
5507           tempreg = AT;
5508           used_at = 1;
5509         }
5510       else
5511         {
5512           tempreg = treg;
5513         }
5514
5515       if (offset_expr.X_op != O_symbol
5516           && offset_expr.X_op != O_constant)
5517         {
5518           as_bad (_("expression too complex"));
5519           offset_expr.X_op = O_constant;
5520         }
5521
5522       if (offset_expr.X_op == O_constant)
5523         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5524       else if (mips_pic == NO_PIC)
5525         {
5526           /* If this is a reference to a GP relative symbol, we want
5527                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5528              Otherwise we want
5529                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5530                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5531              If we have a constant, we need two instructions anyhow,
5532              so we may as well always use the latter form.
5533
5534              With 64bit address space and a usable $at we want
5535                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5536                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5537                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5538                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5539                dsll32   $tempreg,0
5540                daddu    $tempreg,$tempreg,$at
5541
5542              If $at is already in use, we use a path which is suboptimal
5543              on superscalar processors.
5544                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5545                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5546                dsll     $tempreg,16
5547                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5548                dsll     $tempreg,16
5549                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5550
5551              For GP relative symbols in 64bit address space we can use
5552              the same sequence as in 32bit address space.  */
5553           if (HAVE_64BIT_SYMBOLS)
5554             {
5555               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5556                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5557                 {
5558                   relax_start (offset_expr.X_add_symbol);
5559                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5560                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5561                   relax_switch ();
5562                 }
5563
5564               if (used_at == 0 && mips_opts.at)
5565                 {
5566                   macro_build (&offset_expr, "lui", "t,u",
5567                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5568                   macro_build (&offset_expr, "lui", "t,u",
5569                                AT, BFD_RELOC_HI16_S);
5570                   macro_build (&offset_expr, "daddiu", "t,r,j",
5571                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5572                   macro_build (&offset_expr, "daddiu", "t,r,j",
5573                                AT, AT, BFD_RELOC_LO16);
5574                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5575                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5576                   used_at = 1;
5577                 }
5578               else
5579                 {
5580                   macro_build (&offset_expr, "lui", "t,u",
5581                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5582                   macro_build (&offset_expr, "daddiu", "t,r,j",
5583                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5584                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5585                   macro_build (&offset_expr, "daddiu", "t,r,j",
5586                                tempreg, tempreg, BFD_RELOC_HI16_S);
5587                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5588                   macro_build (&offset_expr, "daddiu", "t,r,j",
5589                                tempreg, tempreg, BFD_RELOC_LO16);
5590                 }
5591
5592               if (mips_relax.sequence)
5593                 relax_end ();
5594             }
5595           else
5596             {
5597               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5598                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5599                 {
5600                   relax_start (offset_expr.X_add_symbol);
5601                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5602                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5603                   relax_switch ();
5604                 }
5605               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5606                 as_bad (_("offset too large"));
5607               macro_build_lui (&offset_expr, tempreg);
5608               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5609                            tempreg, tempreg, BFD_RELOC_LO16);
5610               if (mips_relax.sequence)
5611                 relax_end ();
5612             }
5613         }
5614       else if (!mips_big_got && !HAVE_NEWABI)
5615         {
5616           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5617
5618           /* If this is a reference to an external symbol, and there
5619              is no constant, we want
5620                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5621              or for lca or if tempreg is PIC_CALL_REG
5622                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5623              For a local symbol, we want
5624                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5625                nop
5626                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5627
5628              If we have a small constant, and this is a reference to
5629              an external symbol, we want
5630                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5631                nop
5632                addiu    $tempreg,$tempreg,<constant>
5633              For a local symbol, we want the same instruction
5634              sequence, but we output a BFD_RELOC_LO16 reloc on the
5635              addiu instruction.
5636
5637              If we have a large constant, and this is a reference to
5638              an external symbol, we want
5639                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5640                lui      $at,<hiconstant>
5641                addiu    $at,$at,<loconstant>
5642                addu     $tempreg,$tempreg,$at
5643              For a local symbol, we want the same instruction
5644              sequence, but we output a BFD_RELOC_LO16 reloc on the
5645              addiu instruction.
5646            */
5647
5648           if (offset_expr.X_add_number == 0)
5649             {
5650               if (mips_pic == SVR4_PIC
5651                   && breg == 0
5652                   && (call || tempreg == PIC_CALL_REG))
5653                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5654
5655               relax_start (offset_expr.X_add_symbol);
5656               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5657                            lw_reloc_type, mips_gp_register);
5658               if (breg != 0)
5659                 {
5660                   /* We're going to put in an addu instruction using
5661                      tempreg, so we may as well insert the nop right
5662                      now.  */
5663                   load_delay_nop ();
5664                 }
5665               relax_switch ();
5666               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5667                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5668               load_delay_nop ();
5669               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5670                            tempreg, tempreg, BFD_RELOC_LO16);
5671               relax_end ();
5672               /* FIXME: If breg == 0, and the next instruction uses
5673                  $tempreg, then if this variant case is used an extra
5674                  nop will be generated.  */
5675             }
5676           else if (offset_expr.X_add_number >= -0x8000
5677                    && offset_expr.X_add_number < 0x8000)
5678             {
5679               load_got_offset (tempreg, &offset_expr);
5680               load_delay_nop ();
5681               add_got_offset (tempreg, &offset_expr);
5682             }
5683           else
5684             {
5685               expr1.X_add_number = offset_expr.X_add_number;
5686               offset_expr.X_add_number =
5687                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5688               load_got_offset (tempreg, &offset_expr);
5689               offset_expr.X_add_number = expr1.X_add_number;
5690               /* If we are going to add in a base register, and the
5691                  target register and the base register are the same,
5692                  then we are using AT as a temporary register.  Since
5693                  we want to load the constant into AT, we add our
5694                  current AT (from the global offset table) and the
5695                  register into the register now, and pretend we were
5696                  not using a base register.  */
5697               if (breg == treg)
5698                 {
5699                   load_delay_nop ();
5700                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5701                                treg, AT, breg);
5702                   breg = 0;
5703                   tempreg = treg;
5704                 }
5705               add_got_offset_hilo (tempreg, &offset_expr, AT);
5706               used_at = 1;
5707             }
5708         }
5709       else if (!mips_big_got && HAVE_NEWABI)
5710         {
5711           int add_breg_early = 0;
5712
5713           /* If this is a reference to an external, and there is no
5714              constant, or local symbol (*), with or without a
5715              constant, we want
5716                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5717              or for lca or if tempreg is PIC_CALL_REG
5718                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5719
5720              If we have a small constant, and this is a reference to
5721              an external symbol, we want
5722                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5723                addiu    $tempreg,$tempreg,<constant>
5724
5725              If we have a large constant, and this is a reference to
5726              an external symbol, we want
5727                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5728                lui      $at,<hiconstant>
5729                addiu    $at,$at,<loconstant>
5730                addu     $tempreg,$tempreg,$at
5731
5732              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5733              local symbols, even though it introduces an additional
5734              instruction.  */
5735
5736           if (offset_expr.X_add_number)
5737             {
5738               expr1.X_add_number = offset_expr.X_add_number;
5739               offset_expr.X_add_number = 0;
5740
5741               relax_start (offset_expr.X_add_symbol);
5742               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5743                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5744
5745               if (expr1.X_add_number >= -0x8000
5746                   && expr1.X_add_number < 0x8000)
5747                 {
5748                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5749                                tempreg, tempreg, BFD_RELOC_LO16);
5750                 }
5751               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5752                 {
5753                   int dreg;
5754
5755                   /* If we are going to add in a base register, and the
5756                      target register and the base register are the same,
5757                      then we are using AT as a temporary register.  Since
5758                      we want to load the constant into AT, we add our
5759                      current AT (from the global offset table) and the
5760                      register into the register now, and pretend we were
5761                      not using a base register.  */
5762                   if (breg != treg)
5763                     dreg = tempreg;
5764                   else
5765                     {
5766                       gas_assert (tempreg == AT);
5767                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5768                                    treg, AT, breg);
5769                       dreg = treg;
5770                       add_breg_early = 1;
5771                     }
5772
5773                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5774                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5775                                dreg, dreg, AT);
5776
5777                   used_at = 1;
5778                 }
5779               else
5780                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5781
5782               relax_switch ();
5783               offset_expr.X_add_number = expr1.X_add_number;
5784
5785               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5786                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5787               if (add_breg_early)
5788                 {
5789                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5790                                treg, tempreg, breg);
5791                   breg = 0;
5792                   tempreg = treg;
5793                 }
5794               relax_end ();
5795             }
5796           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5797             {
5798               relax_start (offset_expr.X_add_symbol);
5799               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5800                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5801               relax_switch ();
5802               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5803                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5804               relax_end ();
5805             }
5806           else
5807             {
5808               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5809                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5810             }
5811         }
5812       else if (mips_big_got && !HAVE_NEWABI)
5813         {
5814           int gpdelay;
5815           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5816           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5817           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5818
5819           /* This is the large GOT case.  If this is a reference to an
5820              external symbol, and there is no constant, we want
5821                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5822                addu     $tempreg,$tempreg,$gp
5823                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5824              or for lca or if tempreg is PIC_CALL_REG
5825                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5826                addu     $tempreg,$tempreg,$gp
5827                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5828              For a local symbol, we want
5829                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5830                nop
5831                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5832
5833              If we have a small constant, and this is a reference to
5834              an external symbol, we want
5835                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5836                addu     $tempreg,$tempreg,$gp
5837                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5838                nop
5839                addiu    $tempreg,$tempreg,<constant>
5840              For a local symbol, we want
5841                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5842                nop
5843                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5844
5845              If we have a large constant, and this is a reference to
5846              an external symbol, we want
5847                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5848                addu     $tempreg,$tempreg,$gp
5849                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5850                lui      $at,<hiconstant>
5851                addiu    $at,$at,<loconstant>
5852                addu     $tempreg,$tempreg,$at
5853              For a local symbol, we want
5854                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5855                lui      $at,<hiconstant>
5856                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5857                addu     $tempreg,$tempreg,$at
5858           */
5859
5860           expr1.X_add_number = offset_expr.X_add_number;
5861           offset_expr.X_add_number = 0;
5862           relax_start (offset_expr.X_add_symbol);
5863           gpdelay = reg_needs_delay (mips_gp_register);
5864           if (expr1.X_add_number == 0 && breg == 0
5865               && (call || tempreg == PIC_CALL_REG))
5866             {
5867               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5868               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5869             }
5870           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5871           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5872                        tempreg, tempreg, mips_gp_register);
5873           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5874                        tempreg, lw_reloc_type, tempreg);
5875           if (expr1.X_add_number == 0)
5876             {
5877               if (breg != 0)
5878                 {
5879                   /* We're going to put in an addu instruction using
5880                      tempreg, so we may as well insert the nop right
5881                      now.  */
5882                   load_delay_nop ();
5883                 }
5884             }
5885           else if (expr1.X_add_number >= -0x8000
5886                    && expr1.X_add_number < 0x8000)
5887             {
5888               load_delay_nop ();
5889               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5890                            tempreg, tempreg, BFD_RELOC_LO16);
5891             }
5892           else
5893             {
5894               int dreg;
5895
5896               /* If we are going to add in a base register, and the
5897                  target register and the base register are the same,
5898                  then we are using AT as a temporary register.  Since
5899                  we want to load the constant into AT, we add our
5900                  current AT (from the global offset table) and the
5901                  register into the register now, and pretend we were
5902                  not using a base register.  */
5903               if (breg != treg)
5904                 dreg = tempreg;
5905               else
5906                 {
5907                   gas_assert (tempreg == AT);
5908                   load_delay_nop ();
5909                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5910                                treg, AT, breg);
5911                   dreg = treg;
5912                 }
5913
5914               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5915               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5916
5917               used_at = 1;
5918             }
5919           offset_expr.X_add_number =
5920             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5921           relax_switch ();
5922
5923           if (gpdelay)
5924             {
5925               /* This is needed because this instruction uses $gp, but
5926                  the first instruction on the main stream does not.  */
5927               macro_build (NULL, "nop", "");
5928             }
5929
5930           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5931                        local_reloc_type, mips_gp_register);
5932           if (expr1.X_add_number >= -0x8000
5933               && expr1.X_add_number < 0x8000)
5934             {
5935               load_delay_nop ();
5936               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5937                            tempreg, tempreg, BFD_RELOC_LO16);
5938               /* FIXME: If add_number is 0, and there was no base
5939                  register, the external symbol case ended with a load,
5940                  so if the symbol turns out to not be external, and
5941                  the next instruction uses tempreg, an unnecessary nop
5942                  will be inserted.  */
5943             }
5944           else
5945             {
5946               if (breg == treg)
5947                 {
5948                   /* We must add in the base register now, as in the
5949                      external symbol case.  */
5950                   gas_assert (tempreg == AT);
5951                   load_delay_nop ();
5952                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5953                                treg, AT, breg);
5954                   tempreg = treg;
5955                   /* We set breg to 0 because we have arranged to add
5956                      it in in both cases.  */
5957                   breg = 0;
5958                 }
5959
5960               macro_build_lui (&expr1, AT);
5961               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5962                            AT, AT, BFD_RELOC_LO16);
5963               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5964                            tempreg, tempreg, AT);
5965               used_at = 1;
5966             }
5967           relax_end ();
5968         }
5969       else if (mips_big_got && HAVE_NEWABI)
5970         {
5971           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5972           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5973           int add_breg_early = 0;
5974
5975           /* This is the large GOT case.  If this is a reference to an
5976              external symbol, and there is no constant, we want
5977                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5978                add      $tempreg,$tempreg,$gp
5979                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5980              or for lca or if tempreg is PIC_CALL_REG
5981                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5982                add      $tempreg,$tempreg,$gp
5983                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5984
5985              If we have a small constant, and this is a reference to
5986              an external symbol, we want
5987                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5988                add      $tempreg,$tempreg,$gp
5989                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5990                addi     $tempreg,$tempreg,<constant>
5991
5992              If we have a large constant, and this is a reference to
5993              an external symbol, we want
5994                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5995                addu     $tempreg,$tempreg,$gp
5996                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5997                lui      $at,<hiconstant>
5998                addi     $at,$at,<loconstant>
5999                add      $tempreg,$tempreg,$at
6000
6001              If we have NewABI, and we know it's a local symbol, we want
6002                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6003                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6004              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6005
6006           relax_start (offset_expr.X_add_symbol);
6007
6008           expr1.X_add_number = offset_expr.X_add_number;
6009           offset_expr.X_add_number = 0;
6010
6011           if (expr1.X_add_number == 0 && breg == 0
6012               && (call || tempreg == PIC_CALL_REG))
6013             {
6014               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6015               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6016             }
6017           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6018           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6019                        tempreg, tempreg, mips_gp_register);
6020           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6021                        tempreg, lw_reloc_type, tempreg);
6022
6023           if (expr1.X_add_number == 0)
6024             ;
6025           else if (expr1.X_add_number >= -0x8000
6026                    && expr1.X_add_number < 0x8000)
6027             {
6028               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6029                            tempreg, tempreg, BFD_RELOC_LO16);
6030             }
6031           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6032             {
6033               int dreg;
6034
6035               /* If we are going to add in a base register, and the
6036                  target register and the base register are the same,
6037                  then we are using AT as a temporary register.  Since
6038                  we want to load the constant into AT, we add our
6039                  current AT (from the global offset table) and the
6040                  register into the register now, and pretend we were
6041                  not using a base register.  */
6042               if (breg != treg)
6043                 dreg = tempreg;
6044               else
6045                 {
6046                   gas_assert (tempreg == AT);
6047                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6048                                treg, AT, breg);
6049                   dreg = treg;
6050                   add_breg_early = 1;
6051                 }
6052
6053               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6054               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6055
6056               used_at = 1;
6057             }
6058           else
6059             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6060
6061           relax_switch ();
6062           offset_expr.X_add_number = expr1.X_add_number;
6063           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6064                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6065           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6066                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
6067           if (add_breg_early)
6068             {
6069               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6070                            treg, tempreg, breg);
6071               breg = 0;
6072               tempreg = treg;
6073             }
6074           relax_end ();
6075         }
6076       else
6077         abort ();
6078
6079       if (breg != 0)
6080         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6081       break;
6082
6083     case M_MSGSND:
6084       {
6085         unsigned long temp = (treg << 16) | (0x01);
6086         macro_build (NULL, "c2", "C", temp);
6087       }
6088       /* AT is not used, just return */
6089       return;
6090
6091     case M_MSGLD:
6092       {
6093         unsigned long temp = (0x02);
6094         macro_build (NULL, "c2", "C", temp);
6095       }
6096       /* AT is not used, just return */
6097       return;
6098
6099     case M_MSGLD_T:
6100       {
6101         unsigned long temp = (treg << 16) | (0x02);
6102         macro_build (NULL, "c2", "C", temp);
6103       }
6104       /* AT is not used, just return */
6105       return;
6106
6107     case M_MSGWAIT:
6108       macro_build (NULL, "c2", "C", 3);
6109       /* AT is not used, just return */
6110       return;
6111
6112     case M_MSGWAIT_T:
6113       {
6114         unsigned long temp = (treg << 16) | 0x03;
6115         macro_build (NULL, "c2", "C", temp);
6116       }
6117       /* AT is not used, just return */
6118       return;
6119
6120     case M_J_A:
6121       /* The j instruction may not be used in PIC code, since it
6122          requires an absolute address.  We convert it to a b
6123          instruction.  */
6124       if (mips_pic == NO_PIC)
6125         macro_build (&offset_expr, "j", "a");
6126       else
6127         macro_build (&offset_expr, "b", "p");
6128       break;
6129
6130       /* The jal instructions must be handled as macros because when
6131          generating PIC code they expand to multi-instruction
6132          sequences.  Normally they are simple instructions.  */
6133     case M_JAL_1:
6134       dreg = RA;
6135       /* Fall through.  */
6136     case M_JAL_2:
6137       if (mips_pic == NO_PIC)
6138         macro_build (NULL, "jalr", "d,s", dreg, sreg);
6139       else
6140         {
6141           if (sreg != PIC_CALL_REG)
6142             as_warn (_("MIPS PIC call to register other than $25"));
6143
6144           macro_build (NULL, "jalr", "d,s", dreg, sreg);
6145           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6146             {
6147               if (mips_cprestore_offset < 0)
6148                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6149               else
6150                 {
6151                   if (! mips_frame_reg_valid)
6152                     {
6153                       as_warn (_("No .frame pseudo-op used in PIC code"));
6154                       /* Quiet this warning.  */
6155                       mips_frame_reg_valid = 1;
6156                     }
6157                   if (! mips_cprestore_valid)
6158                     {
6159                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6160                       /* Quiet this warning.  */
6161                       mips_cprestore_valid = 1;
6162                     }
6163                   expr1.X_add_number = mips_cprestore_offset;
6164                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6165                                                 mips_gp_register,
6166                                                 mips_frame_reg,
6167                                                 HAVE_64BIT_ADDRESSES);
6168                 }
6169             }
6170         }
6171
6172       break;
6173
6174     case M_JAL_A:
6175       if (mips_pic == NO_PIC)
6176         macro_build (&offset_expr, "jal", "a");
6177       else if (mips_pic == SVR4_PIC)
6178         {
6179           /* If this is a reference to an external symbol, and we are
6180              using a small GOT, we want
6181                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6182                nop
6183                jalr     $ra,$25
6184                nop
6185                lw       $gp,cprestore($sp)
6186              The cprestore value is set using the .cprestore
6187              pseudo-op.  If we are using a big GOT, we want
6188                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6189                addu     $25,$25,$gp
6190                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6191                nop
6192                jalr     $ra,$25
6193                nop
6194                lw       $gp,cprestore($sp)
6195              If the symbol is not external, we want
6196                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6197                nop
6198                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6199                jalr     $ra,$25
6200                nop
6201                lw $gp,cprestore($sp)
6202
6203              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6204              sequences above, minus nops, unless the symbol is local,
6205              which enables us to use GOT_PAGE/GOT_OFST (big got) or
6206              GOT_DISP.  */
6207           if (HAVE_NEWABI)
6208             {
6209               if (! mips_big_got)
6210                 {
6211                   relax_start (offset_expr.X_add_symbol);
6212                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6213                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6214                                mips_gp_register);
6215                   relax_switch ();
6216                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6217                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6218                                mips_gp_register);
6219                   relax_end ();
6220                 }
6221               else
6222                 {
6223                   relax_start (offset_expr.X_add_symbol);
6224                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6225                                BFD_RELOC_MIPS_CALL_HI16);
6226                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6227                                PIC_CALL_REG, mips_gp_register);
6228                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6229                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6230                                PIC_CALL_REG);
6231                   relax_switch ();
6232                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6233                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6234                                mips_gp_register);
6235                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6236                                PIC_CALL_REG, PIC_CALL_REG,
6237                                BFD_RELOC_MIPS_GOT_OFST);
6238                   relax_end ();
6239                 }
6240
6241               macro_build_jalr (&offset_expr);
6242             }
6243           else
6244             {
6245               relax_start (offset_expr.X_add_symbol);
6246               if (! mips_big_got)
6247                 {
6248                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6249                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6250                                mips_gp_register);
6251                   load_delay_nop ();
6252                   relax_switch ();
6253                 }
6254               else
6255                 {
6256                   int gpdelay;
6257
6258                   gpdelay = reg_needs_delay (mips_gp_register);
6259                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6260                                BFD_RELOC_MIPS_CALL_HI16);
6261                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6262                                PIC_CALL_REG, mips_gp_register);
6263                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6264                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6265                                PIC_CALL_REG);
6266                   load_delay_nop ();
6267                   relax_switch ();
6268                   if (gpdelay)
6269                     macro_build (NULL, "nop", "");
6270                 }
6271               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6272                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6273                            mips_gp_register);
6274               load_delay_nop ();
6275               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6276                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6277               relax_end ();
6278               macro_build_jalr (&offset_expr);
6279
6280               if (mips_cprestore_offset < 0)
6281                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6282               else
6283                 {
6284                   if (! mips_frame_reg_valid)
6285                     {
6286                       as_warn (_("No .frame pseudo-op used in PIC code"));
6287                       /* Quiet this warning.  */
6288                       mips_frame_reg_valid = 1;
6289                     }
6290                   if (! mips_cprestore_valid)
6291                     {
6292                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6293                       /* Quiet this warning.  */
6294                       mips_cprestore_valid = 1;
6295                     }
6296                   if (mips_opts.noreorder)
6297                     macro_build (NULL, "nop", "");
6298                   expr1.X_add_number = mips_cprestore_offset;
6299                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6300                                                 mips_gp_register,
6301                                                 mips_frame_reg,
6302                                                 HAVE_64BIT_ADDRESSES);
6303                 }
6304             }
6305         }
6306       else if (mips_pic == VXWORKS_PIC)
6307         as_bad (_("Non-PIC jump used in PIC library"));
6308       else
6309         abort ();
6310
6311       break;
6312
6313     case M_LB_AB:
6314       s = "lb";
6315       goto ld;
6316     case M_LBU_AB:
6317       s = "lbu";
6318       goto ld;
6319     case M_LH_AB:
6320       s = "lh";
6321       goto ld;
6322     case M_LHU_AB:
6323       s = "lhu";
6324       goto ld;
6325     case M_LW_AB:
6326       s = "lw";
6327       goto ld;
6328     case M_LWC0_AB:
6329       s = "lwc0";
6330       /* Itbl support may require additional care here.  */
6331       coproc = 1;
6332       goto ld;
6333     case M_LWC1_AB:
6334       s = "lwc1";
6335       /* Itbl support may require additional care here.  */
6336       coproc = 1;
6337       goto ld;
6338     case M_LWC2_AB:
6339       s = "lwc2";
6340       /* Itbl support may require additional care here.  */
6341       coproc = 1;
6342       goto ld;
6343     case M_LWC3_AB:
6344       s = "lwc3";
6345       /* Itbl support may require additional care here.  */
6346       coproc = 1;
6347       goto ld;
6348     case M_LWL_AB:
6349       s = "lwl";
6350       lr = 1;
6351       goto ld;
6352     case M_LWR_AB:
6353       s = "lwr";
6354       lr = 1;
6355       goto ld;
6356     case M_LDC1_AB:
6357       s = "ldc1";
6358       /* Itbl support may require additional care here.  */
6359       coproc = 1;
6360       goto ld;
6361     case M_LDC2_AB:
6362       s = "ldc2";
6363       /* Itbl support may require additional care here.  */
6364       coproc = 1;
6365       goto ld;
6366     case M_LDC3_AB:
6367       s = "ldc3";
6368       /* Itbl support may require additional care here.  */
6369       coproc = 1;
6370       goto ld;
6371     case M_LDL_AB:
6372       s = "ldl";
6373       lr = 1;
6374       goto ld;
6375     case M_LDR_AB:
6376       s = "ldr";
6377       lr = 1;
6378       goto ld;
6379     case M_LL_AB:
6380       s = "ll";
6381       goto ld;
6382     case M_LLD_AB:
6383       s = "lld";
6384       goto ld;
6385     case M_LWU_AB:
6386       s = "lwu";
6387     ld:
6388       if (breg == treg || coproc || lr)
6389         {
6390           tempreg = AT;
6391           used_at = 1;
6392         }
6393       else
6394         {
6395           tempreg = treg;
6396         }
6397       goto ld_st;
6398     case M_SB_AB:
6399       s = "sb";
6400       goto st;
6401     case M_SH_AB:
6402       s = "sh";
6403       goto st;
6404     case M_SW_AB:
6405       s = "sw";
6406       goto st;
6407     case M_SWC0_AB:
6408       s = "swc0";
6409       /* Itbl support may require additional care here.  */
6410       coproc = 1;
6411       goto st;
6412     case M_SWC1_AB:
6413       s = "swc1";
6414       /* Itbl support may require additional care here.  */
6415       coproc = 1;
6416       goto st;
6417     case M_SWC2_AB:
6418       s = "swc2";
6419       /* Itbl support may require additional care here.  */
6420       coproc = 1;
6421       goto st;
6422     case M_SWC3_AB:
6423       s = "swc3";
6424       /* Itbl support may require additional care here.  */
6425       coproc = 1;
6426       goto st;
6427     case M_SWL_AB:
6428       s = "swl";
6429       goto st;
6430     case M_SWR_AB:
6431       s = "swr";
6432       goto st;
6433     case M_SC_AB:
6434       s = "sc";
6435       goto st;
6436     case M_SCD_AB:
6437       s = "scd";
6438       goto st;
6439     case M_CACHE_AB:
6440       s = "cache";
6441       goto st;
6442     case M_SDC1_AB:
6443       s = "sdc1";
6444       coproc = 1;
6445       /* Itbl support may require additional care here.  */
6446       goto st;
6447     case M_SDC2_AB:
6448       s = "sdc2";
6449       /* Itbl support may require additional care here.  */
6450       coproc = 1;
6451       goto st;
6452     case M_SDC3_AB:
6453       s = "sdc3";
6454       /* Itbl support may require additional care here.  */
6455       coproc = 1;
6456       goto st;
6457     case M_SDL_AB:
6458       s = "sdl";
6459       goto st;
6460     case M_SDR_AB:
6461       s = "sdr";
6462     st:
6463       tempreg = AT;
6464       used_at = 1;
6465     ld_st:
6466       if (coproc
6467           && NO_ISA_COP (mips_opts.arch)
6468           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6469         {
6470           as_bad (_("opcode not supported on this processor: %s"),
6471                   mips_cpu_info_from_arch (mips_opts.arch)->name);
6472           break;
6473         }
6474
6475       /* Itbl support may require additional care here.  */
6476       if (mask == M_LWC1_AB
6477           || mask == M_SWC1_AB
6478           || mask == M_LDC1_AB
6479           || mask == M_SDC1_AB
6480           || mask == M_L_DAB
6481           || mask == M_S_DAB)
6482         fmt = "T,o(b)";
6483       else if (mask == M_CACHE_AB)
6484         fmt = "k,o(b)";
6485       else if (coproc)
6486         fmt = "E,o(b)";
6487       else
6488         fmt = "t,o(b)";
6489
6490       if (offset_expr.X_op != O_constant
6491           && offset_expr.X_op != O_symbol)
6492         {
6493           as_bad (_("expression too complex"));
6494           offset_expr.X_op = O_constant;
6495         }
6496
6497       if (HAVE_32BIT_ADDRESSES
6498           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6499         {
6500           char value [32];
6501
6502           sprintf_vma (value, offset_expr.X_add_number);
6503           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6504         }
6505
6506       /* A constant expression in PIC code can be handled just as it
6507          is in non PIC code.  */
6508       if (offset_expr.X_op == O_constant)
6509         {
6510           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6511                                 & ~(bfd_vma) 0xffff);
6512           normalize_address_expr (&expr1);
6513           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6514           if (breg != 0)
6515             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6516                          tempreg, tempreg, breg);
6517           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6518         }
6519       else if (mips_pic == NO_PIC)
6520         {
6521           /* If this is a reference to a GP relative symbol, and there
6522              is no base register, we want
6523                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6524              Otherwise, if there is no base register, we want
6525                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6526                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6527              If we have a constant, we need two instructions anyhow,
6528              so we always use the latter form.
6529
6530              If we have a base register, and this is a reference to a
6531              GP relative symbol, we want
6532                addu     $tempreg,$breg,$gp
6533                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6534              Otherwise we want
6535                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6536                addu     $tempreg,$tempreg,$breg
6537                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6538              With a constant we always use the latter case.
6539
6540              With 64bit address space and no base register and $at usable,
6541              we want
6542                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6543                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6544                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6545                dsll32   $tempreg,0
6546                daddu    $tempreg,$at
6547                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6548              If we have a base register, we want
6549                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6550                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6551                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6552                daddu    $at,$breg
6553                dsll32   $tempreg,0
6554                daddu    $tempreg,$at
6555                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6556
6557              Without $at we can't generate the optimal path for superscalar
6558              processors here since this would require two temporary registers.
6559                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6560                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6561                dsll     $tempreg,16
6562                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6563                dsll     $tempreg,16
6564                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6565              If we have a base register, we want
6566                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6567                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6568                dsll     $tempreg,16
6569                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6570                dsll     $tempreg,16
6571                daddu    $tempreg,$tempreg,$breg
6572                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6573
6574              For GP relative symbols in 64bit address space we can use
6575              the same sequence as in 32bit address space.  */
6576           if (HAVE_64BIT_SYMBOLS)
6577             {
6578               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6579                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6580                 {
6581                   relax_start (offset_expr.X_add_symbol);
6582                   if (breg == 0)
6583                     {
6584                       macro_build (&offset_expr, s, fmt, treg,
6585                                    BFD_RELOC_GPREL16, mips_gp_register);
6586                     }
6587                   else
6588                     {
6589                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6590                                    tempreg, breg, mips_gp_register);
6591                       macro_build (&offset_expr, s, fmt, treg,
6592                                    BFD_RELOC_GPREL16, tempreg);
6593                     }
6594                   relax_switch ();
6595                 }
6596
6597               if (used_at == 0 && mips_opts.at)
6598                 {
6599                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6600                                BFD_RELOC_MIPS_HIGHEST);
6601                   macro_build (&offset_expr, "lui", "t,u", AT,
6602                                BFD_RELOC_HI16_S);
6603                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6604                                tempreg, BFD_RELOC_MIPS_HIGHER);
6605                   if (breg != 0)
6606                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6607                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6608                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6609                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6610                                tempreg);
6611                   used_at = 1;
6612                 }
6613               else
6614                 {
6615                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6616                                BFD_RELOC_MIPS_HIGHEST);
6617                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6618                                tempreg, BFD_RELOC_MIPS_HIGHER);
6619                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6620                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6621                                tempreg, BFD_RELOC_HI16_S);
6622                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6623                   if (breg != 0)
6624                     macro_build (NULL, "daddu", "d,v,t",
6625                                  tempreg, tempreg, breg);
6626                   macro_build (&offset_expr, s, fmt, treg,
6627                                BFD_RELOC_LO16, tempreg);
6628                 }
6629
6630               if (mips_relax.sequence)
6631                 relax_end ();
6632               break;
6633             }
6634
6635           if (breg == 0)
6636             {
6637               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6638                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6639                 {
6640                   relax_start (offset_expr.X_add_symbol);
6641                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6642                                mips_gp_register);
6643                   relax_switch ();
6644                 }
6645               macro_build_lui (&offset_expr, tempreg);
6646               macro_build (&offset_expr, s, fmt, treg,
6647                            BFD_RELOC_LO16, tempreg);
6648               if (mips_relax.sequence)
6649                 relax_end ();
6650             }
6651           else
6652             {
6653               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6654                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6655                 {
6656                   relax_start (offset_expr.X_add_symbol);
6657                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6658                                tempreg, breg, mips_gp_register);
6659                   macro_build (&offset_expr, s, fmt, treg,
6660                                BFD_RELOC_GPREL16, tempreg);
6661                   relax_switch ();
6662                 }
6663               macro_build_lui (&offset_expr, tempreg);
6664               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6665                            tempreg, tempreg, breg);
6666               macro_build (&offset_expr, s, fmt, treg,
6667                            BFD_RELOC_LO16, tempreg);
6668               if (mips_relax.sequence)
6669                 relax_end ();
6670             }
6671         }
6672       else if (!mips_big_got)
6673         {
6674           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6675
6676           /* If this is a reference to an external symbol, we want
6677                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6678                nop
6679                <op>     $treg,0($tempreg)
6680              Otherwise we want
6681                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6682                nop
6683                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6684                <op>     $treg,0($tempreg)
6685
6686              For NewABI, we want
6687                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6688                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6689
6690              If there is a base register, we add it to $tempreg before
6691              the <op>.  If there is a constant, we stick it in the
6692              <op> instruction.  We don't handle constants larger than
6693              16 bits, because we have no way to load the upper 16 bits
6694              (actually, we could handle them for the subset of cases
6695              in which we are not using $at).  */
6696           gas_assert (offset_expr.X_op == O_symbol);
6697           if (HAVE_NEWABI)
6698             {
6699               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6700                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6701               if (breg != 0)
6702                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6703                              tempreg, tempreg, breg);
6704               macro_build (&offset_expr, s, fmt, treg,
6705                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6706               break;
6707             }
6708           expr1.X_add_number = offset_expr.X_add_number;
6709           offset_expr.X_add_number = 0;
6710           if (expr1.X_add_number < -0x8000
6711               || expr1.X_add_number >= 0x8000)
6712             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6713           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6714                        lw_reloc_type, mips_gp_register);
6715           load_delay_nop ();
6716           relax_start (offset_expr.X_add_symbol);
6717           relax_switch ();
6718           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6719                        tempreg, BFD_RELOC_LO16);
6720           relax_end ();
6721           if (breg != 0)
6722             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6723                          tempreg, tempreg, breg);
6724           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6725         }
6726       else if (mips_big_got && !HAVE_NEWABI)
6727         {
6728           int gpdelay;
6729
6730           /* If this is a reference to an external symbol, we want
6731                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6732                addu     $tempreg,$tempreg,$gp
6733                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6734                <op>     $treg,0($tempreg)
6735              Otherwise we want
6736                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6737                nop
6738                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6739                <op>     $treg,0($tempreg)
6740              If there is a base register, we add it to $tempreg before
6741              the <op>.  If there is a constant, we stick it in the
6742              <op> instruction.  We don't handle constants larger than
6743              16 bits, because we have no way to load the upper 16 bits
6744              (actually, we could handle them for the subset of cases
6745              in which we are not using $at).  */
6746           gas_assert (offset_expr.X_op == O_symbol);
6747           expr1.X_add_number = offset_expr.X_add_number;
6748           offset_expr.X_add_number = 0;
6749           if (expr1.X_add_number < -0x8000
6750               || expr1.X_add_number >= 0x8000)
6751             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6752           gpdelay = reg_needs_delay (mips_gp_register);
6753           relax_start (offset_expr.X_add_symbol);
6754           macro_build (&offset_expr, "lui", "t,u", tempreg,
6755                        BFD_RELOC_MIPS_GOT_HI16);
6756           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6757                        mips_gp_register);
6758           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6759                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6760           relax_switch ();
6761           if (gpdelay)
6762             macro_build (NULL, "nop", "");
6763           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6764                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6765           load_delay_nop ();
6766           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6767                        tempreg, BFD_RELOC_LO16);
6768           relax_end ();
6769
6770           if (breg != 0)
6771             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6772                          tempreg, tempreg, breg);
6773           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6774         }
6775       else if (mips_big_got && HAVE_NEWABI)
6776         {
6777           /* If this is a reference to an external symbol, we want
6778                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6779                add      $tempreg,$tempreg,$gp
6780                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6781                <op>     $treg,<ofst>($tempreg)
6782              Otherwise, for local symbols, we want:
6783                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6784                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6785           gas_assert (offset_expr.X_op == O_symbol);
6786           expr1.X_add_number = offset_expr.X_add_number;
6787           offset_expr.X_add_number = 0;
6788           if (expr1.X_add_number < -0x8000
6789               || expr1.X_add_number >= 0x8000)
6790             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6791           relax_start (offset_expr.X_add_symbol);
6792           macro_build (&offset_expr, "lui", "t,u", tempreg,
6793                        BFD_RELOC_MIPS_GOT_HI16);
6794           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6795                        mips_gp_register);
6796           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6797                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6798           if (breg != 0)
6799             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6800                          tempreg, tempreg, breg);
6801           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6802
6803           relax_switch ();
6804           offset_expr.X_add_number = expr1.X_add_number;
6805           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6806                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6807           if (breg != 0)
6808             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6809                          tempreg, tempreg, breg);
6810           macro_build (&offset_expr, s, fmt, treg,
6811                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6812           relax_end ();
6813         }
6814       else
6815         abort ();
6816
6817       break;
6818
6819     case M_LI:
6820     case M_LI_S:
6821       load_register (treg, &imm_expr, 0);
6822       break;
6823
6824     case M_DLI:
6825       load_register (treg, &imm_expr, 1);
6826       break;
6827
6828     case M_LI_SS:
6829       if (imm_expr.X_op == O_constant)
6830         {
6831           used_at = 1;
6832           load_register (AT, &imm_expr, 0);
6833           macro_build (NULL, "mtc1", "t,G", AT, treg);
6834           break;
6835         }
6836       else
6837         {
6838           gas_assert (offset_expr.X_op == O_symbol
6839                   && strcmp (segment_name (S_GET_SEGMENT
6840                                            (offset_expr.X_add_symbol)),
6841                              ".lit4") == 0
6842                   && offset_expr.X_add_number == 0);
6843           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6844                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6845           break;
6846         }
6847
6848     case M_LI_D:
6849       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6850          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6851          order 32 bits of the value and the low order 32 bits are either
6852          zero or in OFFSET_EXPR.  */
6853       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6854         {
6855           if (HAVE_64BIT_GPRS)
6856             load_register (treg, &imm_expr, 1);
6857           else
6858             {
6859               int hreg, lreg;
6860
6861               if (target_big_endian)
6862                 {
6863                   hreg = treg;
6864                   lreg = treg + 1;
6865                 }
6866               else
6867                 {
6868                   hreg = treg + 1;
6869                   lreg = treg;
6870                 }
6871
6872               if (hreg <= 31)
6873                 load_register (hreg, &imm_expr, 0);
6874               if (lreg <= 31)
6875                 {
6876                   if (offset_expr.X_op == O_absent)
6877                     move_register (lreg, 0);
6878                   else
6879                     {
6880                       gas_assert (offset_expr.X_op == O_constant);
6881                       load_register (lreg, &offset_expr, 0);
6882                     }
6883                 }
6884             }
6885           break;
6886         }
6887
6888       /* We know that sym is in the .rdata section.  First we get the
6889          upper 16 bits of the address.  */
6890       if (mips_pic == NO_PIC)
6891         {
6892           macro_build_lui (&offset_expr, AT);
6893           used_at = 1;
6894         }
6895       else
6896         {
6897           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6898                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6899           used_at = 1;
6900         }
6901
6902       /* Now we load the register(s).  */
6903       if (HAVE_64BIT_GPRS)
6904         {
6905           used_at = 1;
6906           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6907         }
6908       else
6909         {
6910           used_at = 1;
6911           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6912           if (treg != RA)
6913             {
6914               /* FIXME: How in the world do we deal with the possible
6915                  overflow here?  */
6916               offset_expr.X_add_number += 4;
6917               macro_build (&offset_expr, "lw", "t,o(b)",
6918                            treg + 1, BFD_RELOC_LO16, AT);
6919             }
6920         }
6921       break;
6922
6923     case M_LI_DD:
6924       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6925          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6926          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6927          the value and the low order 32 bits are either zero or in
6928          OFFSET_EXPR.  */
6929       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6930         {
6931           used_at = 1;
6932           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
6933           if (HAVE_64BIT_FPRS)
6934             {
6935               gas_assert (HAVE_64BIT_GPRS);
6936               macro_build (NULL, "dmtc1", "t,S", AT, treg);
6937             }
6938           else
6939             {
6940               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
6941               if (offset_expr.X_op == O_absent)
6942                 macro_build (NULL, "mtc1", "t,G", 0, treg);
6943               else
6944                 {
6945                   gas_assert (offset_expr.X_op == O_constant);
6946                   load_register (AT, &offset_expr, 0);
6947                   macro_build (NULL, "mtc1", "t,G", AT, treg);
6948                 }
6949             }
6950           break;
6951         }
6952
6953       gas_assert (offset_expr.X_op == O_symbol
6954               && offset_expr.X_add_number == 0);
6955       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
6956       if (strcmp (s, ".lit8") == 0)
6957         {
6958           if (mips_opts.isa != ISA_MIPS1)
6959             {
6960               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
6961                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6962               break;
6963             }
6964           breg = mips_gp_register;
6965           r = BFD_RELOC_MIPS_LITERAL;
6966           goto dob;
6967         }
6968       else
6969         {
6970           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
6971           used_at = 1;
6972           if (mips_pic != NO_PIC)
6973             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6974                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
6975           else
6976             {
6977               /* FIXME: This won't work for a 64 bit address.  */
6978               macro_build_lui (&offset_expr, AT);
6979             }
6980
6981           if (mips_opts.isa != ISA_MIPS1)
6982             {
6983               macro_build (&offset_expr, "ldc1", "T,o(b)",
6984                            treg, BFD_RELOC_LO16, AT);
6985               break;
6986             }
6987           breg = AT;
6988           r = BFD_RELOC_LO16;
6989           goto dob;
6990         }
6991
6992     case M_L_DOB:
6993       /* Even on a big endian machine $fn comes before $fn+1.  We have
6994          to adjust when loading from memory.  */
6995       r = BFD_RELOC_LO16;
6996     dob:
6997       gas_assert (mips_opts.isa == ISA_MIPS1);
6998       macro_build (&offset_expr, "lwc1", "T,o(b)",
6999                    target_big_endian ? treg + 1 : treg, r, breg);
7000       /* FIXME: A possible overflow which I don't know how to deal
7001          with.  */
7002       offset_expr.X_add_number += 4;
7003       macro_build (&offset_expr, "lwc1", "T,o(b)",
7004                    target_big_endian ? treg : treg + 1, r, breg);
7005       break;
7006
7007     case M_L_DAB:
7008       /*
7009        * The MIPS assembler seems to check for X_add_number not
7010        * being double aligned and generating:
7011        *        lui     at,%hi(foo+1)
7012        *        addu    at,at,v1
7013        *        addiu   at,at,%lo(foo+1)
7014        *        lwc1    f2,0(at)
7015        *        lwc1    f3,4(at)
7016        * But, the resulting address is the same after relocation so why
7017        * generate the extra instruction?
7018        */
7019       /* Itbl support may require additional care here.  */
7020       coproc = 1;
7021       if (mips_opts.isa != ISA_MIPS1)
7022         {
7023           s = "ldc1";
7024           goto ld;
7025         }
7026
7027       s = "lwc1";
7028       fmt = "T,o(b)";
7029       goto ldd_std;
7030
7031     case M_S_DAB:
7032       if (mips_opts.isa != ISA_MIPS1)
7033         {
7034           s = "sdc1";
7035           goto st;
7036         }
7037
7038       s = "swc1";
7039       fmt = "T,o(b)";
7040       /* Itbl support may require additional care here.  */
7041       coproc = 1;
7042       goto ldd_std;
7043
7044     case M_LD_AB:
7045       if (HAVE_64BIT_GPRS)
7046         {
7047           s = "ld";
7048           goto ld;
7049         }
7050
7051       s = "lw";
7052       fmt = "t,o(b)";
7053       goto ldd_std;
7054
7055     case M_SD_AB:
7056       if (HAVE_64BIT_GPRS)
7057         {
7058           s = "sd";
7059           goto st;
7060         }
7061
7062       s = "sw";
7063       fmt = "t,o(b)";
7064
7065     ldd_std:
7066       if (offset_expr.X_op != O_symbol
7067           && offset_expr.X_op != O_constant)
7068         {
7069           as_bad (_("expression too complex"));
7070           offset_expr.X_op = O_constant;
7071         }
7072
7073       if (HAVE_32BIT_ADDRESSES
7074           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7075         {
7076           char value [32];
7077
7078           sprintf_vma (value, offset_expr.X_add_number);
7079           as_bad (_("Number (0x%s) larger than 32 bits"), value);
7080         }
7081
7082       /* Even on a big endian machine $fn comes before $fn+1.  We have
7083          to adjust when loading from memory.  We set coproc if we must
7084          load $fn+1 first.  */
7085       /* Itbl support may require additional care here.  */
7086       if (! target_big_endian)
7087         coproc = 0;
7088
7089       if (mips_pic == NO_PIC
7090           || offset_expr.X_op == O_constant)
7091         {
7092           /* If this is a reference to a GP relative symbol, we want
7093                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7094                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7095              If we have a base register, we use this
7096                addu     $at,$breg,$gp
7097                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7098                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7099              If this is not a GP relative symbol, we want
7100                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7101                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7102                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7103              If there is a base register, we add it to $at after the
7104              lui instruction.  If there is a constant, we always use
7105              the last case.  */
7106           if (offset_expr.X_op == O_symbol
7107               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7108               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7109             {
7110               relax_start (offset_expr.X_add_symbol);
7111               if (breg == 0)
7112                 {
7113                   tempreg = mips_gp_register;
7114                 }
7115               else
7116                 {
7117                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7118                                AT, breg, mips_gp_register);
7119                   tempreg = AT;
7120                   used_at = 1;
7121                 }
7122
7123               /* Itbl support may require additional care here.  */
7124               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7125                            BFD_RELOC_GPREL16, tempreg);
7126               offset_expr.X_add_number += 4;
7127
7128               /* Set mips_optimize to 2 to avoid inserting an
7129                  undesired nop.  */
7130               hold_mips_optimize = mips_optimize;
7131               mips_optimize = 2;
7132               /* Itbl support may require additional care here.  */
7133               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7134                            BFD_RELOC_GPREL16, tempreg);
7135               mips_optimize = hold_mips_optimize;
7136
7137               relax_switch ();
7138
7139               /* We just generated two relocs.  When tc_gen_reloc
7140                  handles this case, it will skip the first reloc and
7141                  handle the second.  The second reloc already has an
7142                  extra addend of 4, which we added above.  We must
7143                  subtract it out, and then subtract another 4 to make
7144                  the first reloc come out right.  The second reloc
7145                  will come out right because we are going to add 4 to
7146                  offset_expr when we build its instruction below.
7147
7148                  If we have a symbol, then we don't want to include
7149                  the offset, because it will wind up being included
7150                  when we generate the reloc.  */
7151
7152               if (offset_expr.X_op == O_constant)
7153                 offset_expr.X_add_number -= 8;
7154               else
7155                 {
7156                   offset_expr.X_add_number = -4;
7157                   offset_expr.X_op = O_constant;
7158                 }
7159             }
7160           used_at = 1;
7161           macro_build_lui (&offset_expr, AT);
7162           if (breg != 0)
7163             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7164           /* Itbl support may require additional care here.  */
7165           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7166                        BFD_RELOC_LO16, AT);
7167           /* FIXME: How do we handle overflow here?  */
7168           offset_expr.X_add_number += 4;
7169           /* Itbl support may require additional care here.  */
7170           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7171                        BFD_RELOC_LO16, AT);
7172           if (mips_relax.sequence)
7173             relax_end ();
7174         }
7175       else if (!mips_big_got)
7176         {
7177           /* If this is a reference to an external symbol, we want
7178                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7179                nop
7180                <op>     $treg,0($at)
7181                <op>     $treg+1,4($at)
7182              Otherwise we want
7183                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7184                nop
7185                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7186                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7187              If there is a base register we add it to $at before the
7188              lwc1 instructions.  If there is a constant we include it
7189              in the lwc1 instructions.  */
7190           used_at = 1;
7191           expr1.X_add_number = offset_expr.X_add_number;
7192           if (expr1.X_add_number < -0x8000
7193               || expr1.X_add_number >= 0x8000 - 4)
7194             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7195           load_got_offset (AT, &offset_expr);
7196           load_delay_nop ();
7197           if (breg != 0)
7198             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7199
7200           /* Set mips_optimize to 2 to avoid inserting an undesired
7201              nop.  */
7202           hold_mips_optimize = mips_optimize;
7203           mips_optimize = 2;
7204
7205           /* Itbl support may require additional care here.  */
7206           relax_start (offset_expr.X_add_symbol);
7207           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7208                        BFD_RELOC_LO16, AT);
7209           expr1.X_add_number += 4;
7210           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7211                        BFD_RELOC_LO16, AT);
7212           relax_switch ();
7213           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7214                        BFD_RELOC_LO16, AT);
7215           offset_expr.X_add_number += 4;
7216           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7217                        BFD_RELOC_LO16, AT);
7218           relax_end ();
7219
7220           mips_optimize = hold_mips_optimize;
7221         }
7222       else if (mips_big_got)
7223         {
7224           int gpdelay;
7225
7226           /* If this is a reference to an external symbol, we want
7227                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7228                addu     $at,$at,$gp
7229                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7230                nop
7231                <op>     $treg,0($at)
7232                <op>     $treg+1,4($at)
7233              Otherwise we want
7234                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7235                nop
7236                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7237                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7238              If there is a base register we add it to $at before the
7239              lwc1 instructions.  If there is a constant we include it
7240              in the lwc1 instructions.  */
7241           used_at = 1;
7242           expr1.X_add_number = offset_expr.X_add_number;
7243           offset_expr.X_add_number = 0;
7244           if (expr1.X_add_number < -0x8000
7245               || expr1.X_add_number >= 0x8000 - 4)
7246             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7247           gpdelay = reg_needs_delay (mips_gp_register);
7248           relax_start (offset_expr.X_add_symbol);
7249           macro_build (&offset_expr, "lui", "t,u",
7250                        AT, BFD_RELOC_MIPS_GOT_HI16);
7251           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7252                        AT, AT, mips_gp_register);
7253           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7254                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7255           load_delay_nop ();
7256           if (breg != 0)
7257             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7258           /* Itbl support may require additional care here.  */
7259           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7260                        BFD_RELOC_LO16, AT);
7261           expr1.X_add_number += 4;
7262
7263           /* Set mips_optimize to 2 to avoid inserting an undesired
7264              nop.  */
7265           hold_mips_optimize = mips_optimize;
7266           mips_optimize = 2;
7267           /* Itbl support may require additional care here.  */
7268           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7269                        BFD_RELOC_LO16, AT);
7270           mips_optimize = hold_mips_optimize;
7271           expr1.X_add_number -= 4;
7272
7273           relax_switch ();
7274           offset_expr.X_add_number = expr1.X_add_number;
7275           if (gpdelay)
7276             macro_build (NULL, "nop", "");
7277           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7278                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7279           load_delay_nop ();
7280           if (breg != 0)
7281             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7282           /* Itbl support may require additional care here.  */
7283           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7284                        BFD_RELOC_LO16, AT);
7285           offset_expr.X_add_number += 4;
7286
7287           /* Set mips_optimize to 2 to avoid inserting an undesired
7288              nop.  */
7289           hold_mips_optimize = mips_optimize;
7290           mips_optimize = 2;
7291           /* Itbl support may require additional care here.  */
7292           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7293                        BFD_RELOC_LO16, AT);
7294           mips_optimize = hold_mips_optimize;
7295           relax_end ();
7296         }
7297       else
7298         abort ();
7299
7300       break;
7301
7302     case M_LD_OB:
7303       s = "lw";
7304       goto sd_ob;
7305     case M_SD_OB:
7306       s = "sw";
7307     sd_ob:
7308       gas_assert (HAVE_32BIT_ADDRESSES);
7309       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7310       offset_expr.X_add_number += 4;
7311       macro_build (&offset_expr, s, "t,o(b)", treg + 1, BFD_RELOC_LO16, breg);
7312       break;
7313
7314    /* New code added to support COPZ instructions.
7315       This code builds table entries out of the macros in mip_opcodes.
7316       R4000 uses interlocks to handle coproc delays.
7317       Other chips (like the R3000) require nops to be inserted for delays.
7318
7319       FIXME: Currently, we require that the user handle delays.
7320       In order to fill delay slots for non-interlocked chips,
7321       we must have a way to specify delays based on the coprocessor.
7322       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7323       What are the side-effects of the cop instruction?
7324       What cache support might we have and what are its effects?
7325       Both coprocessor & memory require delays. how long???
7326       What registers are read/set/modified?
7327
7328       If an itbl is provided to interpret cop instructions,
7329       this knowledge can be encoded in the itbl spec.  */
7330
7331     case M_COP0:
7332       s = "c0";
7333       goto copz;
7334     case M_COP1:
7335       s = "c1";
7336       goto copz;
7337     case M_COP2:
7338       s = "c2";
7339       goto copz;
7340     case M_COP3:
7341       s = "c3";
7342     copz:
7343       if (NO_ISA_COP (mips_opts.arch)
7344           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7345         {
7346           as_bad (_("opcode not supported on this processor: %s"),
7347                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7348           break;
7349         }
7350
7351       /* For now we just do C (same as Cz).  The parameter will be
7352          stored in insn_opcode by mips_ip.  */
7353       macro_build (NULL, s, "C", ip->insn_opcode);
7354       break;
7355
7356     case M_MOVE:
7357       move_register (dreg, sreg);
7358       break;
7359
7360 #ifdef LOSING_COMPILER
7361     default:
7362       /* Try and see if this is a new itbl instruction.
7363          This code builds table entries out of the macros in mip_opcodes.
7364          FIXME: For now we just assemble the expression and pass it's
7365          value along as a 32-bit immediate.
7366          We may want to have the assembler assemble this value,
7367          so that we gain the assembler's knowledge of delay slots,
7368          symbols, etc.
7369          Would it be more efficient to use mask (id) here? */
7370       if (itbl_have_entries
7371           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7372         {
7373           s = ip->insn_mo->name;
7374           s2 = "cop3";
7375           coproc = ITBL_DECODE_PNUM (immed_expr);;
7376           macro_build (&immed_expr, s, "C");
7377           break;
7378         }
7379       macro2 (ip);
7380       break;
7381     }
7382   if (!mips_opts.at && used_at)
7383     as_bad (_("Macro used $at after \".set noat\""));
7384 }
7385
7386 static void
7387 macro2 (struct mips_cl_insn *ip)
7388 {
7389   unsigned int treg, sreg, dreg, breg;
7390   unsigned int tempreg;
7391   int mask;
7392   int used_at;
7393   expressionS expr1;
7394   const char *s;
7395   const char *s2;
7396   const char *fmt;
7397   int likely = 0;
7398   int dbl = 0;
7399   int coproc = 0;
7400   int lr = 0;
7401   int imm = 0;
7402   int off;
7403   offsetT maxnum;
7404   bfd_reloc_code_real_type r;
7405
7406   treg = (ip->insn_opcode >> 16) & 0x1f;
7407   dreg = (ip->insn_opcode >> 11) & 0x1f;
7408   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7409   mask = ip->insn_mo->mask;
7410
7411   expr1.X_op = O_constant;
7412   expr1.X_op_symbol = NULL;
7413   expr1.X_add_symbol = NULL;
7414   expr1.X_add_number = 1;
7415
7416   switch (mask)
7417     {
7418 #endif /* LOSING_COMPILER */
7419
7420     case M_DMUL:
7421       dbl = 1;
7422     case M_MUL:
7423       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7424       macro_build (NULL, "mflo", "d", dreg);
7425       break;
7426
7427     case M_DMUL_I:
7428       dbl = 1;
7429     case M_MUL_I:
7430       /* The MIPS assembler some times generates shifts and adds.  I'm
7431          not trying to be that fancy. GCC should do this for us
7432          anyway.  */
7433       used_at = 1;
7434       load_register (AT, &imm_expr, dbl);
7435       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7436       macro_build (NULL, "mflo", "d", dreg);
7437       break;
7438
7439     case M_DMULO_I:
7440       dbl = 1;
7441     case M_MULO_I:
7442       imm = 1;
7443       goto do_mulo;
7444
7445     case M_DMULO:
7446       dbl = 1;
7447     case M_MULO:
7448     do_mulo:
7449       start_noreorder ();
7450       used_at = 1;
7451       if (imm)
7452         load_register (AT, &imm_expr, dbl);
7453       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7454       macro_build (NULL, "mflo", "d", dreg);
7455       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7456       macro_build (NULL, "mfhi", "d", AT);
7457       if (mips_trap)
7458         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7459       else
7460         {
7461           expr1.X_add_number = 8;
7462           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7463           macro_build (NULL, "nop", "", 0);
7464           macro_build (NULL, "break", "c", 6);
7465         }
7466       end_noreorder ();
7467       macro_build (NULL, "mflo", "d", dreg);
7468       break;
7469
7470     case M_DMULOU_I:
7471       dbl = 1;
7472     case M_MULOU_I:
7473       imm = 1;
7474       goto do_mulou;
7475
7476     case M_DMULOU:
7477       dbl = 1;
7478     case M_MULOU:
7479     do_mulou:
7480       start_noreorder ();
7481       used_at = 1;
7482       if (imm)
7483         load_register (AT, &imm_expr, dbl);
7484       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7485                    sreg, imm ? AT : treg);
7486       macro_build (NULL, "mfhi", "d", AT);
7487       macro_build (NULL, "mflo", "d", dreg);
7488       if (mips_trap)
7489         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7490       else
7491         {
7492           expr1.X_add_number = 8;
7493           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7494           macro_build (NULL, "nop", "", 0);
7495           macro_build (NULL, "break", "c", 6);
7496         }
7497       end_noreorder ();
7498       break;
7499
7500     case M_DROL:
7501       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7502         {
7503           if (dreg == sreg)
7504             {
7505               tempreg = AT;
7506               used_at = 1;
7507             }
7508           else
7509             {
7510               tempreg = dreg;
7511             }
7512           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7513           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7514           break;
7515         }
7516       used_at = 1;
7517       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7518       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7519       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7520       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7521       break;
7522
7523     case M_ROL:
7524       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7525         {
7526           if (dreg == sreg)
7527             {
7528               tempreg = AT;
7529               used_at = 1;
7530             }
7531           else
7532             {
7533               tempreg = dreg;
7534             }
7535           macro_build (NULL, "negu", "d,w", tempreg, treg);
7536           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7537           break;
7538         }
7539       used_at = 1;
7540       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7541       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7542       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7543       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7544       break;
7545
7546     case M_DROL_I:
7547       {
7548         unsigned int rot;
7549         char *l, *r;
7550
7551         if (imm_expr.X_op != O_constant)
7552           as_bad (_("Improper rotate count"));
7553         rot = imm_expr.X_add_number & 0x3f;
7554         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7555           {
7556             rot = (64 - rot) & 0x3f;
7557             if (rot >= 32)
7558               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7559             else
7560               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7561             break;
7562           }
7563         if (rot == 0)
7564           {
7565             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7566             break;
7567           }
7568         l = (rot < 0x20) ? "dsll" : "dsll32";
7569         r = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7570         rot &= 0x1f;
7571         used_at = 1;
7572         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7573         macro_build (NULL, r, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7574         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7575       }
7576       break;
7577
7578     case M_ROL_I:
7579       {
7580         unsigned int rot;
7581
7582         if (imm_expr.X_op != O_constant)
7583           as_bad (_("Improper rotate count"));
7584         rot = imm_expr.X_add_number & 0x1f;
7585         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7586           {
7587             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7588             break;
7589           }
7590         if (rot == 0)
7591           {
7592             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7593             break;
7594           }
7595         used_at = 1;
7596         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7597         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7598         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7599       }
7600       break;
7601
7602     case M_DROR:
7603       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7604         {
7605           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7606           break;
7607         }
7608       used_at = 1;
7609       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7610       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7611       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7612       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7613       break;
7614
7615     case M_ROR:
7616       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7617         {
7618           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7619           break;
7620         }
7621       used_at = 1;
7622       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7623       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7624       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7625       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7626       break;
7627
7628     case M_DROR_I:
7629       {
7630         unsigned int rot;
7631         char *l, *r;
7632
7633         if (imm_expr.X_op != O_constant)
7634           as_bad (_("Improper rotate count"));
7635         rot = imm_expr.X_add_number & 0x3f;
7636         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7637           {
7638             if (rot >= 32)
7639               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7640             else
7641               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7642             break;
7643           }
7644         if (rot == 0)
7645           {
7646             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7647             break;
7648           }
7649         r = (rot < 0x20) ? "dsrl" : "dsrl32";
7650         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7651         rot &= 0x1f;
7652         used_at = 1;
7653         macro_build (NULL, r, "d,w,<", AT, sreg, rot);
7654         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7655         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7656       }
7657       break;
7658
7659     case M_ROR_I:
7660       {
7661         unsigned int rot;
7662
7663         if (imm_expr.X_op != O_constant)
7664           as_bad (_("Improper rotate count"));
7665         rot = imm_expr.X_add_number & 0x1f;
7666         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7667           {
7668             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7669             break;
7670           }
7671         if (rot == 0)
7672           {
7673             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7674             break;
7675           }
7676         used_at = 1;
7677         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7678         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7679         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7680       }
7681       break;
7682
7683     case M_S_DOB:
7684       gas_assert (mips_opts.isa == ISA_MIPS1);
7685       /* Even on a big endian machine $fn comes before $fn+1.  We have
7686          to adjust when storing to memory.  */
7687       macro_build (&offset_expr, "swc1", "T,o(b)",
7688                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7689       offset_expr.X_add_number += 4;
7690       macro_build (&offset_expr, "swc1", "T,o(b)",
7691                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7692       break;
7693
7694     case M_SEQ:
7695       if (sreg == 0)
7696         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7697       else if (treg == 0)
7698         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7699       else
7700         {
7701           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7702           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7703         }
7704       break;
7705
7706     case M_SEQ_I:
7707       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7708         {
7709           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7710           break;
7711         }
7712       if (sreg == 0)
7713         {
7714           as_warn (_("Instruction %s: result is always false"),
7715                    ip->insn_mo->name);
7716           move_register (dreg, 0);
7717           break;
7718         }
7719       if (CPU_HAS_SEQ (mips_opts.arch)
7720           && -512 <= imm_expr.X_add_number
7721           && imm_expr.X_add_number < 512)
7722         {
7723           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7724                        (int) imm_expr.X_add_number);
7725           break;
7726         }
7727       if (imm_expr.X_op == O_constant
7728           && imm_expr.X_add_number >= 0
7729           && imm_expr.X_add_number < 0x10000)
7730         {
7731           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7732         }
7733       else if (imm_expr.X_op == O_constant
7734                && imm_expr.X_add_number > -0x8000
7735                && imm_expr.X_add_number < 0)
7736         {
7737           imm_expr.X_add_number = -imm_expr.X_add_number;
7738           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7739                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7740         }
7741       else if (CPU_HAS_SEQ (mips_opts.arch))
7742         {
7743           used_at = 1;
7744           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7745           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7746           break;
7747         }
7748       else
7749         {
7750           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7751           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7752           used_at = 1;
7753         }
7754       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7755       break;
7756
7757     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7758       s = "slt";
7759       goto sge;
7760     case M_SGEU:
7761       s = "sltu";
7762     sge:
7763       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7764       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7765       break;
7766
7767     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7768     case M_SGEU_I:
7769       if (imm_expr.X_op == O_constant
7770           && imm_expr.X_add_number >= -0x8000
7771           && imm_expr.X_add_number < 0x8000)
7772         {
7773           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7774                        dreg, sreg, BFD_RELOC_LO16);
7775         }
7776       else
7777         {
7778           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7779           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7780                        dreg, sreg, AT);
7781           used_at = 1;
7782         }
7783       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7784       break;
7785
7786     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7787       s = "slt";
7788       goto sgt;
7789     case M_SGTU:
7790       s = "sltu";
7791     sgt:
7792       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7793       break;
7794
7795     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7796       s = "slt";
7797       goto sgti;
7798     case M_SGTU_I:
7799       s = "sltu";
7800     sgti:
7801       used_at = 1;
7802       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7803       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7804       break;
7805
7806     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7807       s = "slt";
7808       goto sle;
7809     case M_SLEU:
7810       s = "sltu";
7811     sle:
7812       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7813       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7814       break;
7815
7816     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7817       s = "slt";
7818       goto slei;
7819     case M_SLEU_I:
7820       s = "sltu";
7821     slei:
7822       used_at = 1;
7823       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7824       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7825       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7826       break;
7827
7828     case M_SLT_I:
7829       if (imm_expr.X_op == O_constant
7830           && imm_expr.X_add_number >= -0x8000
7831           && imm_expr.X_add_number < 0x8000)
7832         {
7833           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7834           break;
7835         }
7836       used_at = 1;
7837       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7838       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7839       break;
7840
7841     case M_SLTU_I:
7842       if (imm_expr.X_op == O_constant
7843           && imm_expr.X_add_number >= -0x8000
7844           && imm_expr.X_add_number < 0x8000)
7845         {
7846           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7847                        BFD_RELOC_LO16);
7848           break;
7849         }
7850       used_at = 1;
7851       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7852       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7853       break;
7854
7855     case M_SNE:
7856       if (sreg == 0)
7857         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7858       else if (treg == 0)
7859         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7860       else
7861         {
7862           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7863           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7864         }
7865       break;
7866
7867     case M_SNE_I:
7868       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7869         {
7870           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7871           break;
7872         }
7873       if (sreg == 0)
7874         {
7875           as_warn (_("Instruction %s: result is always true"),
7876                    ip->insn_mo->name);
7877           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7878                        dreg, 0, BFD_RELOC_LO16);
7879           break;
7880         }
7881       if (CPU_HAS_SEQ (mips_opts.arch)
7882           && -512 <= imm_expr.X_add_number
7883           && imm_expr.X_add_number < 512)
7884         {
7885           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7886                        (int) imm_expr.X_add_number);
7887           break;
7888         }
7889       if (imm_expr.X_op == O_constant
7890           && imm_expr.X_add_number >= 0
7891           && imm_expr.X_add_number < 0x10000)
7892         {
7893           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7894         }
7895       else if (imm_expr.X_op == O_constant
7896                && imm_expr.X_add_number > -0x8000
7897                && imm_expr.X_add_number < 0)
7898         {
7899           imm_expr.X_add_number = -imm_expr.X_add_number;
7900           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7901                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7902         }
7903       else if (CPU_HAS_SEQ (mips_opts.arch))
7904         {
7905           used_at = 1;
7906           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7907           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7908           break;
7909         }
7910       else
7911         {
7912           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7913           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7914           used_at = 1;
7915         }
7916       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7917       break;
7918
7919     case M_DSUB_I:
7920       dbl = 1;
7921     case M_SUB_I:
7922       if (imm_expr.X_op == O_constant
7923           && imm_expr.X_add_number > -0x8000
7924           && imm_expr.X_add_number <= 0x8000)
7925         {
7926           imm_expr.X_add_number = -imm_expr.X_add_number;
7927           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
7928                        dreg, sreg, BFD_RELOC_LO16);
7929           break;
7930         }
7931       used_at = 1;
7932       load_register (AT, &imm_expr, dbl);
7933       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
7934       break;
7935
7936     case M_DSUBU_I:
7937       dbl = 1;
7938     case M_SUBU_I:
7939       if (imm_expr.X_op == O_constant
7940           && imm_expr.X_add_number > -0x8000
7941           && imm_expr.X_add_number <= 0x8000)
7942         {
7943           imm_expr.X_add_number = -imm_expr.X_add_number;
7944           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
7945                        dreg, sreg, BFD_RELOC_LO16);
7946           break;
7947         }
7948       used_at = 1;
7949       load_register (AT, &imm_expr, dbl);
7950       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
7951       break;
7952
7953     case M_TEQ_I:
7954       s = "teq";
7955       goto trap;
7956     case M_TGE_I:
7957       s = "tge";
7958       goto trap;
7959     case M_TGEU_I:
7960       s = "tgeu";
7961       goto trap;
7962     case M_TLT_I:
7963       s = "tlt";
7964       goto trap;
7965     case M_TLTU_I:
7966       s = "tltu";
7967       goto trap;
7968     case M_TNE_I:
7969       s = "tne";
7970     trap:
7971       used_at = 1;
7972       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7973       macro_build (NULL, s, "s,t", sreg, AT);
7974       break;
7975
7976     case M_TRUNCWS:
7977     case M_TRUNCWD:
7978       gas_assert (mips_opts.isa == ISA_MIPS1);
7979       used_at = 1;
7980       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
7981       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
7982
7983       /*
7984        * Is the double cfc1 instruction a bug in the mips assembler;
7985        * or is there a reason for it?
7986        */
7987       start_noreorder ();
7988       macro_build (NULL, "cfc1", "t,G", treg, RA);
7989       macro_build (NULL, "cfc1", "t,G", treg, RA);
7990       macro_build (NULL, "nop", "");
7991       expr1.X_add_number = 3;
7992       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
7993       expr1.X_add_number = 2;
7994       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
7995       macro_build (NULL, "ctc1", "t,G", AT, RA);
7996       macro_build (NULL, "nop", "");
7997       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
7998                    dreg, sreg);
7999       macro_build (NULL, "ctc1", "t,G", treg, RA);
8000       macro_build (NULL, "nop", "");
8001       end_noreorder ();
8002       break;
8003
8004     case M_ULH:
8005       s = "lb";
8006       goto ulh;
8007     case M_ULHU:
8008       s = "lbu";
8009     ulh:
8010       used_at = 1;
8011       if (offset_expr.X_add_number >= 0x7fff)
8012         as_bad (_("operand overflow"));
8013       if (! target_big_endian)
8014         ++offset_expr.X_add_number;
8015       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8016       if (! target_big_endian)
8017         --offset_expr.X_add_number;
8018       else
8019         ++offset_expr.X_add_number;
8020       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8021       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8022       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8023       break;
8024
8025     case M_ULD:
8026       s = "ldl";
8027       s2 = "ldr";
8028       off = 7;
8029       goto ulw;
8030     case M_ULW:
8031       s = "lwl";
8032       s2 = "lwr";
8033       off = 3;
8034     ulw:
8035       if (offset_expr.X_add_number >= 0x8000 - off)
8036         as_bad (_("operand overflow"));
8037       if (treg != breg)
8038         tempreg = treg;
8039       else
8040         {
8041           used_at = 1;
8042           tempreg = AT;
8043         }
8044       if (! target_big_endian)
8045         offset_expr.X_add_number += off;
8046       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8047       if (! target_big_endian)
8048         offset_expr.X_add_number -= off;
8049       else
8050         offset_expr.X_add_number += off;
8051       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8052
8053       /* If necessary, move the result in tempreg the final destination.  */
8054       if (treg == tempreg)
8055         break;
8056       /* Protect second load's delay slot.  */
8057       load_delay_nop ();
8058       move_register (treg, tempreg);
8059       break;
8060
8061     case M_ULD_A:
8062       s = "ldl";
8063       s2 = "ldr";
8064       off = 7;
8065       goto ulwa;
8066     case M_ULW_A:
8067       s = "lwl";
8068       s2 = "lwr";
8069       off = 3;
8070     ulwa:
8071       used_at = 1;
8072       load_address (AT, &offset_expr, &used_at);
8073       if (breg != 0)
8074         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8075       if (! target_big_endian)
8076         expr1.X_add_number = off;
8077       else
8078         expr1.X_add_number = 0;
8079       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8080       if (! target_big_endian)
8081         expr1.X_add_number = 0;
8082       else
8083         expr1.X_add_number = off;
8084       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8085       break;
8086
8087     case M_ULH_A:
8088     case M_ULHU_A:
8089       used_at = 1;
8090       load_address (AT, &offset_expr, &used_at);
8091       if (breg != 0)
8092         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8093       if (target_big_endian)
8094         expr1.X_add_number = 0;
8095       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8096                    treg, BFD_RELOC_LO16, AT);
8097       if (target_big_endian)
8098         expr1.X_add_number = 1;
8099       else
8100         expr1.X_add_number = 0;
8101       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8102       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8103       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8104       break;
8105
8106     case M_USH:
8107       used_at = 1;
8108       if (offset_expr.X_add_number >= 0x7fff)
8109         as_bad (_("operand overflow"));
8110       if (target_big_endian)
8111         ++offset_expr.X_add_number;
8112       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8113       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8114       if (target_big_endian)
8115         --offset_expr.X_add_number;
8116       else
8117         ++offset_expr.X_add_number;
8118       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8119       break;
8120
8121     case M_USD:
8122       s = "sdl";
8123       s2 = "sdr";
8124       off = 7;
8125       goto usw;
8126     case M_USW:
8127       s = "swl";
8128       s2 = "swr";
8129       off = 3;
8130     usw:
8131       if (offset_expr.X_add_number >= 0x8000 - off)
8132         as_bad (_("operand overflow"));
8133       if (! target_big_endian)
8134         offset_expr.X_add_number += off;
8135       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8136       if (! target_big_endian)
8137         offset_expr.X_add_number -= off;
8138       else
8139         offset_expr.X_add_number += off;
8140       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8141       break;
8142
8143     case M_USD_A:
8144       s = "sdl";
8145       s2 = "sdr";
8146       off = 7;
8147       goto uswa;
8148     case M_USW_A:
8149       s = "swl";
8150       s2 = "swr";
8151       off = 3;
8152     uswa:
8153       used_at = 1;
8154       load_address (AT, &offset_expr, &used_at);
8155       if (breg != 0)
8156         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8157       if (! target_big_endian)
8158         expr1.X_add_number = off;
8159       else
8160         expr1.X_add_number = 0;
8161       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8162       if (! target_big_endian)
8163         expr1.X_add_number = 0;
8164       else
8165         expr1.X_add_number = off;
8166       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8167       break;
8168
8169     case M_USH_A:
8170       used_at = 1;
8171       load_address (AT, &offset_expr, &used_at);
8172       if (breg != 0)
8173         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8174       if (! target_big_endian)
8175         expr1.X_add_number = 0;
8176       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8177       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8178       if (! target_big_endian)
8179         expr1.X_add_number = 1;
8180       else
8181         expr1.X_add_number = 0;
8182       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8183       if (! target_big_endian)
8184         expr1.X_add_number = 0;
8185       else
8186         expr1.X_add_number = 1;
8187       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8188       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8189       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8190       break;
8191
8192     default:
8193       /* FIXME: Check if this is one of the itbl macros, since they
8194          are added dynamically.  */
8195       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8196       break;
8197     }
8198   if (!mips_opts.at && used_at)
8199     as_bad (_("Macro used $at after \".set noat\""));
8200 }
8201
8202 /* Implement macros in mips16 mode.  */
8203
8204 static void
8205 mips16_macro (struct mips_cl_insn *ip)
8206 {
8207   int mask;
8208   int xreg, yreg, zreg, tmp;
8209   expressionS expr1;
8210   int dbl;
8211   const char *s, *s2, *s3;
8212
8213   mask = ip->insn_mo->mask;
8214
8215   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8216   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8217   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8218
8219   expr1.X_op = O_constant;
8220   expr1.X_op_symbol = NULL;
8221   expr1.X_add_symbol = NULL;
8222   expr1.X_add_number = 1;
8223
8224   dbl = 0;
8225
8226   switch (mask)
8227     {
8228     default:
8229       internalError ();
8230
8231     case M_DDIV_3:
8232       dbl = 1;
8233     case M_DIV_3:
8234       s = "mflo";
8235       goto do_div3;
8236     case M_DREM_3:
8237       dbl = 1;
8238     case M_REM_3:
8239       s = "mfhi";
8240     do_div3:
8241       start_noreorder ();
8242       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8243       expr1.X_add_number = 2;
8244       macro_build (&expr1, "bnez", "x,p", yreg);
8245       macro_build (NULL, "break", "6", 7);
8246
8247       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8248          since that causes an overflow.  We should do that as well,
8249          but I don't see how to do the comparisons without a temporary
8250          register.  */
8251       end_noreorder ();
8252       macro_build (NULL, s, "x", zreg);
8253       break;
8254
8255     case M_DIVU_3:
8256       s = "divu";
8257       s2 = "mflo";
8258       goto do_divu3;
8259     case M_REMU_3:
8260       s = "divu";
8261       s2 = "mfhi";
8262       goto do_divu3;
8263     case M_DDIVU_3:
8264       s = "ddivu";
8265       s2 = "mflo";
8266       goto do_divu3;
8267     case M_DREMU_3:
8268       s = "ddivu";
8269       s2 = "mfhi";
8270     do_divu3:
8271       start_noreorder ();
8272       macro_build (NULL, s, "0,x,y", xreg, yreg);
8273       expr1.X_add_number = 2;
8274       macro_build (&expr1, "bnez", "x,p", yreg);
8275       macro_build (NULL, "break", "6", 7);
8276       end_noreorder ();
8277       macro_build (NULL, s2, "x", zreg);
8278       break;
8279
8280     case M_DMUL:
8281       dbl = 1;
8282     case M_MUL:
8283       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8284       macro_build (NULL, "mflo", "x", zreg);
8285       break;
8286
8287     case M_DSUBU_I:
8288       dbl = 1;
8289       goto do_subu;
8290     case M_SUBU_I:
8291     do_subu:
8292       if (imm_expr.X_op != O_constant)
8293         as_bad (_("Unsupported large constant"));
8294       imm_expr.X_add_number = -imm_expr.X_add_number;
8295       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8296       break;
8297
8298     case M_SUBU_I_2:
8299       if (imm_expr.X_op != O_constant)
8300         as_bad (_("Unsupported large constant"));
8301       imm_expr.X_add_number = -imm_expr.X_add_number;
8302       macro_build (&imm_expr, "addiu", "x,k", xreg);
8303       break;
8304
8305     case M_DSUBU_I_2:
8306       if (imm_expr.X_op != O_constant)
8307         as_bad (_("Unsupported large constant"));
8308       imm_expr.X_add_number = -imm_expr.X_add_number;
8309       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8310       break;
8311
8312     case M_BEQ:
8313       s = "cmp";
8314       s2 = "bteqz";
8315       goto do_branch;
8316     case M_BNE:
8317       s = "cmp";
8318       s2 = "btnez";
8319       goto do_branch;
8320     case M_BLT:
8321       s = "slt";
8322       s2 = "btnez";
8323       goto do_branch;
8324     case M_BLTU:
8325       s = "sltu";
8326       s2 = "btnez";
8327       goto do_branch;
8328     case M_BLE:
8329       s = "slt";
8330       s2 = "bteqz";
8331       goto do_reverse_branch;
8332     case M_BLEU:
8333       s = "sltu";
8334       s2 = "bteqz";
8335       goto do_reverse_branch;
8336     case M_BGE:
8337       s = "slt";
8338       s2 = "bteqz";
8339       goto do_branch;
8340     case M_BGEU:
8341       s = "sltu";
8342       s2 = "bteqz";
8343       goto do_branch;
8344     case M_BGT:
8345       s = "slt";
8346       s2 = "btnez";
8347       goto do_reverse_branch;
8348     case M_BGTU:
8349       s = "sltu";
8350       s2 = "btnez";
8351
8352     do_reverse_branch:
8353       tmp = xreg;
8354       xreg = yreg;
8355       yreg = tmp;
8356
8357     do_branch:
8358       macro_build (NULL, s, "x,y", xreg, yreg);
8359       macro_build (&offset_expr, s2, "p");
8360       break;
8361
8362     case M_BEQ_I:
8363       s = "cmpi";
8364       s2 = "bteqz";
8365       s3 = "x,U";
8366       goto do_branch_i;
8367     case M_BNE_I:
8368       s = "cmpi";
8369       s2 = "btnez";
8370       s3 = "x,U";
8371       goto do_branch_i;
8372     case M_BLT_I:
8373       s = "slti";
8374       s2 = "btnez";
8375       s3 = "x,8";
8376       goto do_branch_i;
8377     case M_BLTU_I:
8378       s = "sltiu";
8379       s2 = "btnez";
8380       s3 = "x,8";
8381       goto do_branch_i;
8382     case M_BLE_I:
8383       s = "slti";
8384       s2 = "btnez";
8385       s3 = "x,8";
8386       goto do_addone_branch_i;
8387     case M_BLEU_I:
8388       s = "sltiu";
8389       s2 = "btnez";
8390       s3 = "x,8";
8391       goto do_addone_branch_i;
8392     case M_BGE_I:
8393       s = "slti";
8394       s2 = "bteqz";
8395       s3 = "x,8";
8396       goto do_branch_i;
8397     case M_BGEU_I:
8398       s = "sltiu";
8399       s2 = "bteqz";
8400       s3 = "x,8";
8401       goto do_branch_i;
8402     case M_BGT_I:
8403       s = "slti";
8404       s2 = "bteqz";
8405       s3 = "x,8";
8406       goto do_addone_branch_i;
8407     case M_BGTU_I:
8408       s = "sltiu";
8409       s2 = "bteqz";
8410       s3 = "x,8";
8411
8412     do_addone_branch_i:
8413       if (imm_expr.X_op != O_constant)
8414         as_bad (_("Unsupported large constant"));
8415       ++imm_expr.X_add_number;
8416
8417     do_branch_i:
8418       macro_build (&imm_expr, s, s3, xreg);
8419       macro_build (&offset_expr, s2, "p");
8420       break;
8421
8422     case M_ABS:
8423       expr1.X_add_number = 0;
8424       macro_build (&expr1, "slti", "x,8", yreg);
8425       if (xreg != yreg)
8426         move_register (xreg, yreg);
8427       expr1.X_add_number = 2;
8428       macro_build (&expr1, "bteqz", "p");
8429       macro_build (NULL, "neg", "x,w", xreg, xreg);
8430     }
8431 }
8432
8433 /* For consistency checking, verify that all bits are specified either
8434    by the match/mask part of the instruction definition, or by the
8435    operand list.  */
8436 static int
8437 validate_mips_insn (const struct mips_opcode *opc)
8438 {
8439   const char *p = opc->args;
8440   char c;
8441   unsigned long used_bits = opc->mask;
8442
8443   if ((used_bits & opc->match) != opc->match)
8444     {
8445       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8446               opc->name, opc->args);
8447       return 0;
8448     }
8449 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8450   while (*p)
8451     switch (c = *p++)
8452       {
8453       case ',': break;
8454       case '(': break;
8455       case ')': break;
8456       case '+':
8457         switch (c = *p++)
8458           {
8459           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8460           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8461           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8462           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8463           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8464           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8465           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8466           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8467                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8468           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8469           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8470           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8471           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8472           case 'I': break;
8473           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8474           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8475                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8476           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8477           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8478           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8479           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8480           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8481           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8482           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8483
8484           default:
8485             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8486                     c, opc->name, opc->args);
8487             return 0;
8488           }
8489         break;
8490       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8491       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8492       case 'A': break;
8493       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8494       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8495       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8496       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8497       case 'F': break;
8498       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8499       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8500       case 'I': break;
8501       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8502       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8503       case 'L': break;
8504       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8505       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8506       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8507       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8508                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8509       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8510       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8511       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8512       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8513       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8514       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8515       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8516       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8517       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8518       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8519       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8520       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8521       case 'f': break;
8522       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8523       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8524       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8525       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8526       case 'l': break;
8527       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8528       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8529       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8530       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8531       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8532       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8533       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8534       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8535       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8536       case 'x': break;
8537       case 'z': break;
8538       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8539       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8540                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8541       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8542       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8543       case '[': break;
8544       case ']': break;
8545       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8546       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8547       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8548       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8549       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8550       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8551       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8552       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8553       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8554       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8555       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8556       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8557       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8558       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8559       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8560       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8561       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8562       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8563       default:
8564         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8565                 c, opc->name, opc->args);
8566         return 0;
8567       }
8568 #undef USE_BITS
8569   if (used_bits != 0xffffffff)
8570     {
8571       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8572               ~used_bits & 0xffffffff, opc->name, opc->args);
8573       return 0;
8574     }
8575   return 1;
8576 }
8577
8578 /* UDI immediates.  */
8579 struct mips_immed {
8580   char          type;
8581   unsigned int  shift;
8582   unsigned long mask;
8583   const char *  desc;
8584 };
8585
8586 static const struct mips_immed mips_immed[] = {
8587   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8588   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8589   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8590   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8591   { 0,0,0,0 }
8592 };
8593
8594 /* Check whether an odd floating-point register is allowed.  */
8595 static int
8596 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8597 {
8598   const char *s = insn->name;
8599
8600   if (insn->pinfo == INSN_MACRO)
8601     /* Let a macro pass, we'll catch it later when it is expanded.  */
8602     return 1;
8603
8604   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8605     {
8606       /* Allow odd registers for single-precision ops.  */
8607       switch (insn->pinfo & (FP_S | FP_D))
8608         {
8609         case FP_S:
8610         case 0:
8611           return 1;     /* both single precision - ok */
8612         case FP_D:
8613           return 0;     /* both double precision - fail */
8614         default:
8615           break;
8616         }
8617
8618       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8619       s = strchr (insn->name, '.');
8620       if (argnum == 2)
8621         s = s != NULL ? strchr (s + 1, '.') : NULL;
8622       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8623     } 
8624
8625   /* Single-precision coprocessor loads and moves are OK too.  */
8626   if ((insn->pinfo & FP_S)
8627       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8628                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8629     return 1;
8630
8631   return 0;
8632 }
8633
8634 /* This routine assembles an instruction into its binary format.  As a
8635    side effect, it sets one of the global variables imm_reloc or
8636    offset_reloc to the type of relocation to do if one of the operands
8637    is an address expression.  */
8638
8639 static void
8640 mips_ip (char *str, struct mips_cl_insn *ip)
8641 {
8642   char *s;
8643   const char *args;
8644   char c = 0;
8645   struct mips_opcode *insn;
8646   char *argsStart;
8647   unsigned int regno;
8648   unsigned int lastregno = 0;
8649   unsigned int lastpos = 0;
8650   unsigned int limlo, limhi;
8651   char *s_reset;
8652   char save_c = 0;
8653   offsetT min_range, max_range;
8654   int argnum;
8655   unsigned int rtype;
8656
8657   insn_error = NULL;
8658
8659   /* If the instruction contains a '.', we first try to match an instruction
8660      including the '.'.  Then we try again without the '.'.  */
8661   insn = NULL;
8662   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8663     continue;
8664
8665   /* If we stopped on whitespace, then replace the whitespace with null for
8666      the call to hash_find.  Save the character we replaced just in case we
8667      have to re-parse the instruction.  */
8668   if (ISSPACE (*s))
8669     {
8670       save_c = *s;
8671       *s++ = '\0';
8672     }
8673
8674   insn = (struct mips_opcode *) hash_find (op_hash, str);
8675
8676   /* If we didn't find the instruction in the opcode table, try again, but
8677      this time with just the instruction up to, but not including the
8678      first '.'.  */
8679   if (insn == NULL)
8680     {
8681       /* Restore the character we overwrite above (if any).  */
8682       if (save_c)
8683         *(--s) = save_c;
8684
8685       /* Scan up to the first '.' or whitespace.  */
8686       for (s = str;
8687            *s != '\0' && *s != '.' && !ISSPACE (*s);
8688            ++s)
8689         continue;
8690
8691       /* If we did not find a '.', then we can quit now.  */
8692       if (*s != '.')
8693         {
8694           insn_error = _("unrecognized opcode");
8695           return;
8696         }
8697
8698       /* Lookup the instruction in the hash table.  */
8699       *s++ = '\0';
8700       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8701         {
8702           insn_error = _("unrecognized opcode");
8703           return;
8704         }
8705     }
8706
8707   argsStart = s;
8708   for (;;)
8709     {
8710       bfd_boolean ok;
8711
8712       gas_assert (strcmp (insn->name, str) == 0);
8713
8714       ok = is_opcode_valid (insn, FALSE);
8715       if (! ok)
8716         {
8717           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8718               && strcmp (insn->name, insn[1].name) == 0)
8719             {
8720               ++insn;
8721               continue;
8722             }
8723           else
8724             {
8725               if (!insn_error)
8726                 {
8727                   static char buf[100];
8728                   sprintf (buf,
8729                            _("opcode not supported on this processor: %s (%s)"),
8730                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8731                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8732                   insn_error = buf;
8733                 }
8734               if (save_c)
8735                 *(--s) = save_c;
8736               return;
8737             }
8738         }
8739
8740       create_insn (ip, insn);
8741       insn_error = NULL;
8742       argnum = 1;
8743       lastregno = 0xffffffff;
8744       for (args = insn->args;; ++args)
8745         {
8746           int is_mdmx;
8747
8748           s += strspn (s, " \t");
8749           is_mdmx = 0;
8750           switch (*args)
8751             {
8752             case '\0':          /* end of args */
8753               if (*s == '\0')
8754                 return;
8755               break;
8756
8757             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8758               my_getExpression (&imm_expr, s);
8759               check_absolute_expr (ip, &imm_expr);
8760               if ((unsigned long) imm_expr.X_add_number != 1
8761                   && (unsigned long) imm_expr.X_add_number != 3)
8762                 {
8763                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8764                           (unsigned long) imm_expr.X_add_number);
8765                 }
8766               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8767               imm_expr.X_op = O_absent;
8768               s = expr_end;
8769               continue;
8770
8771             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8772               my_getExpression (&imm_expr, s);
8773               check_absolute_expr (ip, &imm_expr);
8774               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8775                 {
8776                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8777                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8778                 }
8779               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8780               imm_expr.X_op = O_absent;
8781               s = expr_end;
8782               continue;
8783
8784             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8785               my_getExpression (&imm_expr, s);
8786               check_absolute_expr (ip, &imm_expr);
8787               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8788                 {
8789                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8790                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8791                 }
8792               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8793               imm_expr.X_op = O_absent;
8794               s = expr_end;
8795               continue;
8796
8797             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8798               my_getExpression (&imm_expr, s);
8799               check_absolute_expr (ip, &imm_expr);
8800               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8801                 {
8802                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8803                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8804                 }
8805               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8806               imm_expr.X_op = O_absent;
8807               s = expr_end;
8808               continue;
8809
8810             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8811               my_getExpression (&imm_expr, s);
8812               check_absolute_expr (ip, &imm_expr);
8813               if (imm_expr.X_add_number & ~OP_MASK_RS)
8814                 {
8815                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8816                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8817                 }
8818               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8819               imm_expr.X_op = O_absent;
8820               s = expr_end;
8821               continue;
8822
8823             case '7': /* four dsp accumulators in bits 11,12 */ 
8824               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8825                   s[3] >= '0' && s[3] <= '3')
8826                 {
8827                   regno = s[3] - '0';
8828                   s += 4;
8829                   INSERT_OPERAND (DSPACC, *ip, regno);
8830                   continue;
8831                 }
8832               else
8833                 as_bad (_("Invalid dsp acc register"));
8834               break;
8835
8836             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8837               my_getExpression (&imm_expr, s);
8838               check_absolute_expr (ip, &imm_expr);
8839               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8840                 {
8841                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8842                           OP_MASK_WRDSP,
8843                           (unsigned long) imm_expr.X_add_number);
8844                 }
8845               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8846               imm_expr.X_op = O_absent;
8847               s = expr_end;
8848               continue;
8849
8850             case '9': /* four dsp accumulators in bits 21,22 */
8851               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8852                   s[3] >= '0' && s[3] <= '3')
8853                 {
8854                   regno = s[3] - '0';
8855                   s += 4;
8856                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8857                   continue;
8858                 }
8859               else
8860                 as_bad (_("Invalid dsp acc register"));
8861               break;
8862
8863             case '0': /* dsp 6-bit signed immediate in bit 20 */
8864               my_getExpression (&imm_expr, s);
8865               check_absolute_expr (ip, &imm_expr);
8866               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8867               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8868               if (imm_expr.X_add_number < min_range ||
8869                   imm_expr.X_add_number > max_range)
8870                 {
8871                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8872                           (long) min_range, (long) max_range,
8873                           (long) imm_expr.X_add_number);
8874                 }
8875               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8876               imm_expr.X_op = O_absent;
8877               s = expr_end;
8878               continue;
8879
8880             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8881               my_getExpression (&imm_expr, s);
8882               check_absolute_expr (ip, &imm_expr);
8883               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8884                 {
8885                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8886                           OP_MASK_RDDSP,
8887                           (unsigned long) imm_expr.X_add_number);
8888                 }
8889               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8890               imm_expr.X_op = O_absent;
8891               s = expr_end;
8892               continue;
8893
8894             case ':': /* dsp 7-bit signed immediate in bit 19 */
8895               my_getExpression (&imm_expr, s);
8896               check_absolute_expr (ip, &imm_expr);
8897               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8898               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8899               if (imm_expr.X_add_number < min_range ||
8900                   imm_expr.X_add_number > max_range)
8901                 {
8902                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8903                           (long) min_range, (long) max_range,
8904                           (long) imm_expr.X_add_number);
8905                 }
8906               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8907               imm_expr.X_op = O_absent;
8908               s = expr_end;
8909               continue;
8910
8911             case '@': /* dsp 10-bit signed immediate in bit 16 */
8912               my_getExpression (&imm_expr, s);
8913               check_absolute_expr (ip, &imm_expr);
8914               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8915               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8916               if (imm_expr.X_add_number < min_range ||
8917                   imm_expr.X_add_number > max_range)
8918                 {
8919                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8920                           (long) min_range, (long) max_range,
8921                           (long) imm_expr.X_add_number);
8922                 }
8923               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8924               imm_expr.X_op = O_absent;
8925               s = expr_end;
8926               continue;
8927
8928             case '!': /* MT usermode flag bit.  */
8929               my_getExpression (&imm_expr, s);
8930               check_absolute_expr (ip, &imm_expr);
8931               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
8932                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
8933                         (unsigned long) imm_expr.X_add_number);
8934               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
8935               imm_expr.X_op = O_absent;
8936               s = expr_end;
8937               continue;
8938
8939             case '$': /* MT load high flag bit.  */
8940               my_getExpression (&imm_expr, s);
8941               check_absolute_expr (ip, &imm_expr);
8942               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
8943                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
8944                         (unsigned long) imm_expr.X_add_number);
8945               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
8946               imm_expr.X_op = O_absent;
8947               s = expr_end;
8948               continue;
8949
8950             case '*': /* four dsp accumulators in bits 18,19 */ 
8951               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8952                   s[3] >= '0' && s[3] <= '3')
8953                 {
8954                   regno = s[3] - '0';
8955                   s += 4;
8956                   INSERT_OPERAND (MTACC_T, *ip, regno);
8957                   continue;
8958                 }
8959               else
8960                 as_bad (_("Invalid dsp/smartmips acc register"));
8961               break;
8962
8963             case '&': /* four dsp accumulators in bits 13,14 */ 
8964               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8965                   s[3] >= '0' && s[3] <= '3')
8966                 {
8967                   regno = s[3] - '0';
8968                   s += 4;
8969                   INSERT_OPERAND (MTACC_D, *ip, regno);
8970                   continue;
8971                 }
8972               else
8973                 as_bad (_("Invalid dsp/smartmips acc register"));
8974               break;
8975
8976             case ',':
8977               ++argnum;
8978               if (*s++ == *args)
8979                 continue;
8980               s--;
8981               switch (*++args)
8982                 {
8983                 case 'r':
8984                 case 'v':
8985                   INSERT_OPERAND (RS, *ip, lastregno);
8986                   continue;
8987
8988                 case 'w':
8989                   INSERT_OPERAND (RT, *ip, lastregno);
8990                   continue;
8991
8992                 case 'W':
8993                   INSERT_OPERAND (FT, *ip, lastregno);
8994                   continue;
8995
8996                 case 'V':
8997                   INSERT_OPERAND (FS, *ip, lastregno);
8998                   continue;
8999                 }
9000               break;
9001
9002             case '(':
9003               /* Handle optional base register.
9004                  Either the base register is omitted or
9005                  we must have a left paren.  */
9006               /* This is dependent on the next operand specifier
9007                  is a base register specification.  */
9008               gas_assert (args[1] == 'b' || args[1] == '5'
9009                       || args[1] == '-' || args[1] == '4');
9010               if (*s == '\0')
9011                 return;
9012
9013             case ')':           /* these must match exactly */
9014             case '[':
9015             case ']':
9016               if (*s++ == *args)
9017                 continue;
9018               break;
9019
9020             case '+':           /* Opcode extension character.  */
9021               switch (*++args)
9022                 {
9023                 case '1':       /* UDI immediates.  */
9024                 case '2':
9025                 case '3':
9026                 case '4':
9027                   {
9028                     const struct mips_immed *imm = mips_immed;
9029
9030                     while (imm->type && imm->type != *args)
9031                       ++imm;
9032                     if (! imm->type)
9033                       internalError ();
9034                     my_getExpression (&imm_expr, s);
9035                     check_absolute_expr (ip, &imm_expr);
9036                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9037                       {
9038                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9039                                  imm->desc ? imm->desc : ip->insn_mo->name,
9040                                  (unsigned long) imm_expr.X_add_number,
9041                                  (unsigned long) imm_expr.X_add_number);
9042                               imm_expr.X_add_number &= imm->mask;
9043                       }
9044                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9045                                         << imm->shift);
9046                     imm_expr.X_op = O_absent;
9047                     s = expr_end;
9048                   }
9049                   continue;
9050                   
9051                 case 'A':               /* ins/ext position, becomes LSB.  */
9052                   limlo = 0;
9053                   limhi = 31;
9054                   goto do_lsb;
9055                 case 'E':
9056                   limlo = 32;
9057                   limhi = 63;
9058                   goto do_lsb;
9059 do_lsb:
9060                   my_getExpression (&imm_expr, s);
9061                   check_absolute_expr (ip, &imm_expr);
9062                   if ((unsigned long) imm_expr.X_add_number < limlo
9063                       || (unsigned long) imm_expr.X_add_number > limhi)
9064                     {
9065                       as_bad (_("Improper position (%lu)"),
9066                               (unsigned long) imm_expr.X_add_number);
9067                       imm_expr.X_add_number = limlo;
9068                     }
9069                   lastpos = imm_expr.X_add_number;
9070                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9071                   imm_expr.X_op = O_absent;
9072                   s = expr_end;
9073                   continue;
9074
9075                 case 'B':               /* ins size, becomes MSB.  */
9076                   limlo = 1;
9077                   limhi = 32;
9078                   goto do_msb;
9079                 case 'F':
9080                   limlo = 33;
9081                   limhi = 64;
9082                   goto do_msb;
9083 do_msb:
9084                   my_getExpression (&imm_expr, s);
9085                   check_absolute_expr (ip, &imm_expr);
9086                   /* Check for negative input so that small negative numbers
9087                      will not succeed incorrectly.  The checks against
9088                      (pos+size) transitively check "size" itself,
9089                      assuming that "pos" is reasonable.  */
9090                   if ((long) imm_expr.X_add_number < 0
9091                       || ((unsigned long) imm_expr.X_add_number
9092                           + lastpos) < limlo
9093                       || ((unsigned long) imm_expr.X_add_number
9094                           + lastpos) > limhi)
9095                     {
9096                       as_bad (_("Improper insert size (%lu, position %lu)"),
9097                               (unsigned long) imm_expr.X_add_number,
9098                               (unsigned long) lastpos);
9099                       imm_expr.X_add_number = limlo - lastpos;
9100                     }
9101                   INSERT_OPERAND (INSMSB, *ip,
9102                                  lastpos + imm_expr.X_add_number - 1);
9103                   imm_expr.X_op = O_absent;
9104                   s = expr_end;
9105                   continue;
9106
9107                 case 'C':               /* ext size, becomes MSBD.  */
9108                   limlo = 1;
9109                   limhi = 32;
9110                   goto do_msbd;
9111                 case 'G':
9112                   limlo = 33;
9113                   limhi = 64;
9114                   goto do_msbd;
9115                 case 'H':
9116                   limlo = 33;
9117                   limhi = 64;
9118                   goto do_msbd;
9119 do_msbd:
9120                   my_getExpression (&imm_expr, s);
9121                   check_absolute_expr (ip, &imm_expr);
9122                   /* Check for negative input so that small negative numbers
9123                      will not succeed incorrectly.  The checks against
9124                      (pos+size) transitively check "size" itself,
9125                      assuming that "pos" is reasonable.  */
9126                   if ((long) imm_expr.X_add_number < 0
9127                       || ((unsigned long) imm_expr.X_add_number
9128                           + lastpos) < limlo
9129                       || ((unsigned long) imm_expr.X_add_number
9130                           + lastpos) > limhi)
9131                     {
9132                       as_bad (_("Improper extract size (%lu, position %lu)"),
9133                               (unsigned long) imm_expr.X_add_number,
9134                               (unsigned long) lastpos);
9135                       imm_expr.X_add_number = limlo - lastpos;
9136                     }
9137                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9138                   imm_expr.X_op = O_absent;
9139                   s = expr_end;
9140                   continue;
9141
9142                 case 'D':
9143                   /* +D is for disassembly only; never match.  */
9144                   break;
9145
9146                 case 'I':
9147                   /* "+I" is like "I", except that imm2_expr is used.  */
9148                   my_getExpression (&imm2_expr, s);
9149                   if (imm2_expr.X_op != O_big
9150                       && imm2_expr.X_op != O_constant)
9151                   insn_error = _("absolute expression required");
9152                   if (HAVE_32BIT_GPRS)
9153                     normalize_constant_expr (&imm2_expr);
9154                   s = expr_end;
9155                   continue;
9156
9157                 case 'T': /* Coprocessor register.  */
9158                   /* +T is for disassembly only; never match.  */
9159                   break;
9160
9161                 case 't': /* Coprocessor register number.  */
9162                   if (s[0] == '$' && ISDIGIT (s[1]))
9163                     {
9164                       ++s;
9165                       regno = 0;
9166                       do
9167                         {
9168                           regno *= 10;
9169                           regno += *s - '0';
9170                           ++s;
9171                         }
9172                       while (ISDIGIT (*s));
9173                       if (regno > 31)
9174                         as_bad (_("Invalid register number (%d)"), regno);
9175                       else
9176                         {
9177                           INSERT_OPERAND (RT, *ip, regno);
9178                           continue;
9179                         }
9180                     }
9181                   else
9182                     as_bad (_("Invalid coprocessor 0 register number"));
9183                   break;
9184
9185                 case 'x':
9186                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9187                      is not in the valid range.  */
9188                   my_getExpression (&imm_expr, s);
9189                   check_absolute_expr (ip, &imm_expr);
9190                   if ((unsigned) imm_expr.X_add_number > 31)
9191                     {
9192                       as_bad (_("Improper bit index (%lu)"),
9193                               (unsigned long) imm_expr.X_add_number);
9194                       imm_expr.X_add_number = 0;
9195                     }
9196                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9197                   imm_expr.X_op = O_absent;
9198                   s = expr_end;
9199                   continue;
9200
9201                 case 'X':
9202                   /* bbit[01] bit index when bbit is used but we generate
9203                      bbit[01]32 because the index is over 32.  Move to the
9204                      next candidate if index is not in the valid range.  */
9205                   my_getExpression (&imm_expr, s);
9206                   check_absolute_expr (ip, &imm_expr);
9207                   if ((unsigned) imm_expr.X_add_number < 32
9208                       || (unsigned) imm_expr.X_add_number > 63)
9209                     break;
9210                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9211                   imm_expr.X_op = O_absent;
9212                   s = expr_end;
9213                   continue;
9214
9215                 case 'p':
9216                   /* cins, cins32, exts and exts32 position field.  Give error
9217                      if it's not in the valid range.  */
9218                   my_getExpression (&imm_expr, s);
9219                   check_absolute_expr (ip, &imm_expr);
9220                   if ((unsigned) imm_expr.X_add_number > 31)
9221                     {
9222                       as_bad (_("Improper position (%lu)"),
9223                               (unsigned long) imm_expr.X_add_number);
9224                       imm_expr.X_add_number = 0;
9225                     }
9226                   /* Make the pos explicit to simplify +S.  */
9227                   lastpos = imm_expr.X_add_number + 32;
9228                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9229                   imm_expr.X_op = O_absent;
9230                   s = expr_end;
9231                   continue;
9232
9233                 case 'P':
9234                   /* cins, cins32, exts and exts32 position field.  Move to
9235                      the next candidate if it's not in the valid range.  */
9236                   my_getExpression (&imm_expr, s);
9237                   check_absolute_expr (ip, &imm_expr);
9238                   if ((unsigned) imm_expr.X_add_number < 32
9239                       || (unsigned) imm_expr.X_add_number > 63)
9240                     break;
9241                   lastpos = imm_expr.X_add_number;
9242                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9243                   imm_expr.X_op = O_absent;
9244                   s = expr_end;
9245                   continue;
9246
9247                 case 's':
9248                   /* cins and exts length-minus-one field.  */
9249                   my_getExpression (&imm_expr, s);
9250                   check_absolute_expr (ip, &imm_expr);
9251                   if ((unsigned long) imm_expr.X_add_number > 31)
9252                     {
9253                       as_bad (_("Improper size (%lu)"),
9254                               (unsigned long) imm_expr.X_add_number);
9255                       imm_expr.X_add_number = 0;
9256                     }
9257                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9258                   imm_expr.X_op = O_absent;
9259                   s = expr_end;
9260                   continue;
9261
9262                 case 'S':
9263                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9264                      length-minus-one field.  */
9265                   my_getExpression (&imm_expr, s);
9266                   check_absolute_expr (ip, &imm_expr);
9267                   if ((long) imm_expr.X_add_number < 0
9268                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9269                     {
9270                       as_bad (_("Improper size (%lu)"),
9271                               (unsigned long) imm_expr.X_add_number);
9272                       imm_expr.X_add_number = 0;
9273                     }
9274                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9275                   imm_expr.X_op = O_absent;
9276                   s = expr_end;
9277                   continue;
9278
9279                 case 'Q':
9280                   /* seqi/snei immediate field.  */
9281                   my_getExpression (&imm_expr, s);
9282                   check_absolute_expr (ip, &imm_expr);
9283                   if ((long) imm_expr.X_add_number < -512
9284                       || (long) imm_expr.X_add_number >= 512)
9285                     {
9286                       as_bad (_("Improper immediate (%ld)"),
9287                                (long) imm_expr.X_add_number);
9288                       imm_expr.X_add_number = 0;
9289                     }
9290                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9291                   imm_expr.X_op = O_absent;
9292                   s = expr_end;
9293                   continue;
9294
9295                 default:
9296                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9297                     *args, insn->name, insn->args);
9298                   /* Further processing is fruitless.  */
9299                   return;
9300                 }
9301               break;
9302
9303             case '<':           /* must be at least one digit */
9304               /*
9305                * According to the manual, if the shift amount is greater
9306                * than 31 or less than 0, then the shift amount should be
9307                * mod 32.  In reality the mips assembler issues an error.
9308                * We issue a warning and mask out all but the low 5 bits.
9309                */
9310               my_getExpression (&imm_expr, s);
9311               check_absolute_expr (ip, &imm_expr);
9312               if ((unsigned long) imm_expr.X_add_number > 31)
9313                 as_warn (_("Improper shift amount (%lu)"),
9314                          (unsigned long) imm_expr.X_add_number);
9315               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9316               imm_expr.X_op = O_absent;
9317               s = expr_end;
9318               continue;
9319
9320             case '>':           /* shift amount minus 32 */
9321               my_getExpression (&imm_expr, s);
9322               check_absolute_expr (ip, &imm_expr);
9323               if ((unsigned long) imm_expr.X_add_number < 32
9324                   || (unsigned long) imm_expr.X_add_number > 63)
9325                 break;
9326               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9327               imm_expr.X_op = O_absent;
9328               s = expr_end;
9329               continue;
9330
9331             case 'k':           /* cache code */
9332             case 'h':           /* prefx code */
9333             case '1':           /* sync type */
9334               my_getExpression (&imm_expr, s);
9335               check_absolute_expr (ip, &imm_expr);
9336               if ((unsigned long) imm_expr.X_add_number > 31)
9337                 as_warn (_("Invalid value for `%s' (%lu)"),
9338                          ip->insn_mo->name,
9339                          (unsigned long) imm_expr.X_add_number);
9340               if (*args == 'k')
9341                 INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9342               else if (*args == 'h')
9343                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9344               else
9345                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9346               imm_expr.X_op = O_absent;
9347               s = expr_end;
9348               continue;
9349
9350             case 'c':           /* break code */
9351               my_getExpression (&imm_expr, s);
9352               check_absolute_expr (ip, &imm_expr);
9353               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9354                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9355                          ip->insn_mo->name,
9356                          (unsigned long) imm_expr.X_add_number);
9357               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9358               imm_expr.X_op = O_absent;
9359               s = expr_end;
9360               continue;
9361
9362             case 'q':           /* lower break code */
9363               my_getExpression (&imm_expr, s);
9364               check_absolute_expr (ip, &imm_expr);
9365               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9366                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9367                          ip->insn_mo->name,
9368                          (unsigned long) imm_expr.X_add_number);
9369               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9370               imm_expr.X_op = O_absent;
9371               s = expr_end;
9372               continue;
9373
9374             case 'B':           /* 20-bit syscall/break code.  */
9375               my_getExpression (&imm_expr, s);
9376               check_absolute_expr (ip, &imm_expr);
9377               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9378                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9379                          ip->insn_mo->name,
9380                          (unsigned long) imm_expr.X_add_number);
9381               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9382               imm_expr.X_op = O_absent;
9383               s = expr_end;
9384               continue;
9385
9386             case 'C':           /* Coprocessor code */
9387               my_getExpression (&imm_expr, s);
9388               check_absolute_expr (ip, &imm_expr);
9389               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9390                 {
9391                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9392                            (unsigned long) imm_expr.X_add_number);
9393                   imm_expr.X_add_number &= OP_MASK_COPZ;
9394                 }
9395               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9396               imm_expr.X_op = O_absent;
9397               s = expr_end;
9398               continue;
9399
9400             case 'J':           /* 19-bit wait code.  */
9401               my_getExpression (&imm_expr, s);
9402               check_absolute_expr (ip, &imm_expr);
9403               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9404                 {
9405                   as_warn (_("Illegal 19-bit code (%lu)"),
9406                            (unsigned long) imm_expr.X_add_number);
9407                   imm_expr.X_add_number &= OP_MASK_CODE19;
9408                 }
9409               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9410               imm_expr.X_op = O_absent;
9411               s = expr_end;
9412               continue;
9413
9414             case 'P':           /* Performance register.  */
9415               my_getExpression (&imm_expr, s);
9416               check_absolute_expr (ip, &imm_expr);
9417               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9418                 as_warn (_("Invalid performance register (%lu)"),
9419                          (unsigned long) imm_expr.X_add_number);
9420               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9421               imm_expr.X_op = O_absent;
9422               s = expr_end;
9423               continue;
9424
9425             case 'G':           /* Coprocessor destination register.  */
9426               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9427                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9428               else
9429                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9430               INSERT_OPERAND (RD, *ip, regno);
9431               if (ok) 
9432                 {
9433                   lastregno = regno;
9434                   continue;
9435                 }
9436               else
9437                 break;
9438
9439             case 'b':           /* base register */
9440             case 'd':           /* destination register */
9441             case 's':           /* source register */
9442             case 't':           /* target register */
9443             case 'r':           /* both target and source */
9444             case 'v':           /* both dest and source */
9445             case 'w':           /* both dest and target */
9446             case 'E':           /* coprocessor target register */
9447             case 'K':           /* 'rdhwr' destination register */
9448             case 'x':           /* ignore register name */
9449             case 'z':           /* must be zero register */
9450             case 'U':           /* destination register (clo/clz).  */
9451             case 'g':           /* coprocessor destination register */
9452               s_reset = s;            
9453               if (*args == 'E' || *args == 'K')
9454                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9455               else
9456                 {
9457                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9458                   if (regno == AT && mips_opts.at)
9459                     {
9460                       if (mips_opts.at == ATREG)
9461                         as_warn (_("used $at without \".set noat\""));
9462                       else
9463                         as_warn (_("used $%u with \".set at=$%u\""),
9464                                  regno, mips_opts.at);
9465                     }
9466                 }
9467               if (ok)
9468                 {
9469                   c = *args;
9470                   if (*s == ' ')
9471                     ++s;
9472                   if (args[1] != *s)
9473                     {
9474                       if (c == 'r' || c == 'v' || c == 'w')
9475                         {
9476                           regno = lastregno;
9477                           s = s_reset;
9478                           ++args;
9479                         }
9480                     }
9481                   /* 'z' only matches $0.  */
9482                   if (c == 'z' && regno != 0)
9483                     break;
9484
9485                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9486                     {
9487                       if (regno == lastregno)
9488                         {
9489                           insn_error = _("source and destination must be different");
9490                           continue;
9491                         }
9492                       if (regno == 31 && lastregno == 0xffffffff)
9493                         {
9494                           insn_error = _("a destination register must be supplied");
9495                           continue;
9496                         }
9497                     }
9498         /* Now that we have assembled one operand, we use the args string
9499          * to figure out where it goes in the instruction.  */
9500                   switch (c)
9501                     {
9502                     case 'r':
9503                     case 's':
9504                     case 'v':
9505                     case 'b':
9506                       INSERT_OPERAND (RS, *ip, regno);
9507                       break;
9508                     case 'd':
9509                     case 'G':
9510                     case 'K':
9511                     case 'g':
9512                       INSERT_OPERAND (RD, *ip, regno);
9513                       break;
9514                     case 'U':
9515                       INSERT_OPERAND (RD, *ip, regno);
9516                       INSERT_OPERAND (RT, *ip, regno);
9517                       break;
9518                     case 'w':
9519                     case 't':
9520                     case 'E':
9521                       INSERT_OPERAND (RT, *ip, regno);
9522                       break;
9523                     case 'x':
9524                       /* This case exists because on the r3000 trunc
9525                          expands into a macro which requires a gp
9526                          register.  On the r6000 or r4000 it is
9527                          assembled into a single instruction which
9528                          ignores the register.  Thus the insn version
9529                          is MIPS_ISA2 and uses 'x', and the macro
9530                          version is MIPS_ISA1 and uses 't'.  */
9531                       break;
9532                     case 'z':
9533                       /* This case is for the div instruction, which
9534                          acts differently if the destination argument
9535                          is $0.  This only matches $0, and is checked
9536                          outside the switch.  */
9537                       break;
9538                     case 'D':
9539                       /* Itbl operand; not yet implemented. FIXME ?? */
9540                       break;
9541                       /* What about all other operands like 'i', which
9542                          can be specified in the opcode table? */
9543                     }
9544                   lastregno = regno;
9545                   continue;
9546                 }
9547               switch (*args++)
9548                 {
9549                 case 'r':
9550                 case 'v':
9551                   INSERT_OPERAND (RS, *ip, lastregno);
9552                   continue;
9553                 case 'w':
9554                   INSERT_OPERAND (RT, *ip, lastregno);
9555                   continue;
9556                 }
9557               break;
9558
9559             case 'O':           /* MDMX alignment immediate constant.  */
9560               my_getExpression (&imm_expr, s);
9561               check_absolute_expr (ip, &imm_expr);
9562               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9563                 as_warn (_("Improper align amount (%ld), using low bits"),
9564                          (long) imm_expr.X_add_number);
9565               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9566               imm_expr.X_op = O_absent;
9567               s = expr_end;
9568               continue;
9569
9570             case 'Q':           /* MDMX vector, element sel, or const.  */
9571               if (s[0] != '$')
9572                 {
9573                   /* MDMX Immediate.  */
9574                   my_getExpression (&imm_expr, s);
9575                   check_absolute_expr (ip, &imm_expr);
9576                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9577                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9578                              (long) imm_expr.X_add_number);
9579                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9580                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9581                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9582                   else
9583                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9584                   imm_expr.X_op = O_absent;
9585                   s = expr_end;
9586                   continue;
9587                 }
9588               /* Not MDMX Immediate.  Fall through.  */
9589             case 'X':           /* MDMX destination register.  */
9590             case 'Y':           /* MDMX source register.  */
9591             case 'Z':           /* MDMX target register.  */
9592               is_mdmx = 1;
9593             case 'D':           /* floating point destination register */
9594             case 'S':           /* floating point source register */
9595             case 'T':           /* floating point target register */
9596             case 'R':           /* floating point source register */
9597             case 'V':
9598             case 'W':
9599               rtype = RTYPE_FPU;
9600               if (is_mdmx
9601                   || (mips_opts.ase_mdmx
9602                       && (ip->insn_mo->pinfo & FP_D)
9603                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9604                                                 | INSN_COPROC_MEMORY_DELAY
9605                                                 | INSN_LOAD_COPROC_DELAY
9606                                                 | INSN_LOAD_MEMORY_DELAY
9607                                                 | INSN_STORE_MEMORY))))
9608                 rtype |= RTYPE_VEC;
9609               s_reset = s;
9610               if (reg_lookup (&s, rtype, &regno))
9611                 {
9612                   if ((regno & 1) != 0
9613                       && HAVE_32BIT_FPRS
9614                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9615                     as_warn (_("Float register should be even, was %d"),
9616                              regno);
9617
9618                   c = *args;
9619                   if (*s == ' ')
9620                     ++s;
9621                   if (args[1] != *s)
9622                     {
9623                       if (c == 'V' || c == 'W')
9624                         {
9625                           regno = lastregno;
9626                           s = s_reset;
9627                           ++args;
9628                         }
9629                     }
9630                   switch (c)
9631                     {
9632                     case 'D':
9633                     case 'X':
9634                       INSERT_OPERAND (FD, *ip, regno);
9635                       break;
9636                     case 'V':
9637                     case 'S':
9638                     case 'Y':
9639                       INSERT_OPERAND (FS, *ip, regno);
9640                       break;
9641                     case 'Q':
9642                       /* This is like 'Z', but also needs to fix the MDMX
9643                          vector/scalar select bits.  Note that the
9644                          scalar immediate case is handled above.  */
9645                       if (*s == '[')
9646                         {
9647                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9648                           int max_el = (is_qh ? 3 : 7);
9649                           s++;
9650                           my_getExpression(&imm_expr, s);
9651                           check_absolute_expr (ip, &imm_expr);
9652                           s = expr_end;
9653                           if (imm_expr.X_add_number > max_el)
9654                             as_bad (_("Bad element selector %ld"),
9655                                     (long) imm_expr.X_add_number);
9656                           imm_expr.X_add_number &= max_el;
9657                           ip->insn_opcode |= (imm_expr.X_add_number
9658                                               << (OP_SH_VSEL +
9659                                                   (is_qh ? 2 : 1)));
9660                           imm_expr.X_op = O_absent;
9661                           if (*s != ']')
9662                             as_warn (_("Expecting ']' found '%s'"), s);
9663                           else
9664                             s++;
9665                         }
9666                       else
9667                         {
9668                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9669                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9670                                                 << OP_SH_VSEL);
9671                           else
9672                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9673                                                 OP_SH_VSEL);
9674                         }
9675                       /* Fall through */
9676                     case 'W':
9677                     case 'T':
9678                     case 'Z':
9679                       INSERT_OPERAND (FT, *ip, regno);
9680                       break;
9681                     case 'R':
9682                       INSERT_OPERAND (FR, *ip, regno);
9683                       break;
9684                     }
9685                   lastregno = regno;
9686                   continue;
9687                 }
9688
9689               switch (*args++)
9690                 {
9691                 case 'V':
9692                   INSERT_OPERAND (FS, *ip, lastregno);
9693                   continue;
9694                 case 'W':
9695                   INSERT_OPERAND (FT, *ip, lastregno);
9696                   continue;
9697                 }
9698               break;
9699
9700             case 'I':
9701               my_getExpression (&imm_expr, s);
9702               if (imm_expr.X_op != O_big
9703                   && imm_expr.X_op != O_constant)
9704                 insn_error = _("absolute expression required");
9705               if (HAVE_32BIT_GPRS)
9706                 normalize_constant_expr (&imm_expr);
9707               s = expr_end;
9708               continue;
9709
9710             case 'A':
9711               my_getExpression (&offset_expr, s);
9712               normalize_address_expr (&offset_expr);
9713               *imm_reloc = BFD_RELOC_32;
9714               s = expr_end;
9715               continue;
9716
9717             case 'F':
9718             case 'L':
9719             case 'f':
9720             case 'l':
9721               {
9722                 int f64;
9723                 int using_gprs;
9724                 char *save_in;
9725                 char *err;
9726                 unsigned char temp[8];
9727                 int len;
9728                 unsigned int length;
9729                 segT seg;
9730                 subsegT subseg;
9731                 char *p;
9732
9733                 /* These only appear as the last operand in an
9734                    instruction, and every instruction that accepts
9735                    them in any variant accepts them in all variants.
9736                    This means we don't have to worry about backing out
9737                    any changes if the instruction does not match.
9738
9739                    The difference between them is the size of the
9740                    floating point constant and where it goes.  For 'F'
9741                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9742                    is 32 bits.  Where the constant is placed is based
9743                    on how the MIPS assembler does things:
9744                     F -- .rdata
9745                     L -- .lit8
9746                     f -- immediate value
9747                     l -- .lit4
9748
9749                     The .lit4 and .lit8 sections are only used if
9750                     permitted by the -G argument.
9751
9752                     The code below needs to know whether the target register
9753                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9754                     'F' are used with GPR-based instructions and 'l' and
9755                     'L' are used with FPR-based instructions.  */
9756
9757                 f64 = *args == 'F' || *args == 'L';
9758                 using_gprs = *args == 'F' || *args == 'f';
9759
9760                 save_in = input_line_pointer;
9761                 input_line_pointer = s;
9762                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9763                 length = len;
9764                 s = input_line_pointer;
9765                 input_line_pointer = save_in;
9766                 if (err != NULL && *err != '\0')
9767                   {
9768                     as_bad (_("Bad floating point constant: %s"), err);
9769                     memset (temp, '\0', sizeof temp);
9770                     length = f64 ? 8 : 4;
9771                   }
9772
9773                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
9774
9775                 if (*args == 'f'
9776                     || (*args == 'l'
9777                         && (g_switch_value < 4
9778                             || (temp[0] == 0 && temp[1] == 0)
9779                             || (temp[2] == 0 && temp[3] == 0))))
9780                   {
9781                     imm_expr.X_op = O_constant;
9782                     if (! target_big_endian)
9783                       imm_expr.X_add_number = bfd_getl32 (temp);
9784                     else
9785                       imm_expr.X_add_number = bfd_getb32 (temp);
9786                   }
9787                 else if (length > 4
9788                          && ! mips_disable_float_construction
9789                          /* Constants can only be constructed in GPRs and
9790                             copied to FPRs if the GPRs are at least as wide
9791                             as the FPRs.  Force the constant into memory if
9792                             we are using 64-bit FPRs but the GPRs are only
9793                             32 bits wide.  */
9794                          && (using_gprs
9795                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9796                          && ((temp[0] == 0 && temp[1] == 0)
9797                              || (temp[2] == 0 && temp[3] == 0))
9798                          && ((temp[4] == 0 && temp[5] == 0)
9799                              || (temp[6] == 0 && temp[7] == 0)))
9800                   {
9801                     /* The value is simple enough to load with a couple of
9802                        instructions.  If using 32-bit registers, set
9803                        imm_expr to the high order 32 bits and offset_expr to
9804                        the low order 32 bits.  Otherwise, set imm_expr to
9805                        the entire 64 bit constant.  */
9806                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9807                       {
9808                         imm_expr.X_op = O_constant;
9809                         offset_expr.X_op = O_constant;
9810                         if (! target_big_endian)
9811                           {
9812                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9813                             offset_expr.X_add_number = bfd_getl32 (temp);
9814                           }
9815                         else
9816                           {
9817                             imm_expr.X_add_number = bfd_getb32 (temp);
9818                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9819                           }
9820                         if (offset_expr.X_add_number == 0)
9821                           offset_expr.X_op = O_absent;
9822                       }
9823                     else if (sizeof (imm_expr.X_add_number) > 4)
9824                       {
9825                         imm_expr.X_op = O_constant;
9826                         if (! target_big_endian)
9827                           imm_expr.X_add_number = bfd_getl64 (temp);
9828                         else
9829                           imm_expr.X_add_number = bfd_getb64 (temp);
9830                       }
9831                     else
9832                       {
9833                         imm_expr.X_op = O_big;
9834                         imm_expr.X_add_number = 4;
9835                         if (! target_big_endian)
9836                           {
9837                             generic_bignum[0] = bfd_getl16 (temp);
9838                             generic_bignum[1] = bfd_getl16 (temp + 2);
9839                             generic_bignum[2] = bfd_getl16 (temp + 4);
9840                             generic_bignum[3] = bfd_getl16 (temp + 6);
9841                           }
9842                         else
9843                           {
9844                             generic_bignum[0] = bfd_getb16 (temp + 6);
9845                             generic_bignum[1] = bfd_getb16 (temp + 4);
9846                             generic_bignum[2] = bfd_getb16 (temp + 2);
9847                             generic_bignum[3] = bfd_getb16 (temp);
9848                           }
9849                       }
9850                   }
9851                 else
9852                   {
9853                     const char *newname;
9854                     segT new_seg;
9855
9856                     /* Switch to the right section.  */
9857                     seg = now_seg;
9858                     subseg = now_subseg;
9859                     switch (*args)
9860                       {
9861                       default: /* unused default case avoids warnings.  */
9862                       case 'L':
9863                         newname = RDATA_SECTION_NAME;
9864                         if (g_switch_value >= 8)
9865                           newname = ".lit8";
9866                         break;
9867                       case 'F':
9868                         newname = RDATA_SECTION_NAME;
9869                         break;
9870                       case 'l':
9871                         gas_assert (g_switch_value >= 4);
9872                         newname = ".lit4";
9873                         break;
9874                       }
9875                     new_seg = subseg_new (newname, (subsegT) 0);
9876                     if (IS_ELF)
9877                       bfd_set_section_flags (stdoutput, new_seg,
9878                                              (SEC_ALLOC
9879                                               | SEC_LOAD
9880                                               | SEC_READONLY
9881                                               | SEC_DATA));
9882                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9883                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9884                       record_alignment (new_seg, 4);
9885                     else
9886                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9887                     if (seg == now_seg)
9888                       as_bad (_("Can't use floating point insn in this section"));
9889
9890                     /* Set the argument to the current address in the
9891                        section.  */
9892                     offset_expr.X_op = O_symbol;
9893                     offset_expr.X_add_symbol =
9894                       symbol_new ("L0\001", now_seg,
9895                                   (valueT) frag_now_fix (), frag_now);
9896                     offset_expr.X_add_number = 0;
9897
9898                     /* Put the floating point number into the section.  */
9899                     p = frag_more ((int) length);
9900                     memcpy (p, temp, length);
9901
9902                     /* Switch back to the original section.  */
9903                     subseg_set (seg, subseg);
9904                   }
9905               }
9906               continue;
9907
9908             case 'i':           /* 16 bit unsigned immediate */
9909             case 'j':           /* 16 bit signed immediate */
9910               *imm_reloc = BFD_RELOC_LO16;
9911               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
9912                 {
9913                   int more;
9914                   offsetT minval, maxval;
9915
9916                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
9917                           && strcmp (insn->name, insn[1].name) == 0);
9918
9919                   /* If the expression was written as an unsigned number,
9920                      only treat it as signed if there are no more
9921                      alternatives.  */
9922                   if (more
9923                       && *args == 'j'
9924                       && sizeof (imm_expr.X_add_number) <= 4
9925                       && imm_expr.X_op == O_constant
9926                       && imm_expr.X_add_number < 0
9927                       && imm_expr.X_unsigned
9928                       && HAVE_64BIT_GPRS)
9929                     break;
9930
9931                   /* For compatibility with older assemblers, we accept
9932                      0x8000-0xffff as signed 16-bit numbers when only
9933                      signed numbers are allowed.  */
9934                   if (*args == 'i')
9935                     minval = 0, maxval = 0xffff;
9936                   else if (more)
9937                     minval = -0x8000, maxval = 0x7fff;
9938                   else
9939                     minval = -0x8000, maxval = 0xffff;
9940
9941                   if (imm_expr.X_op != O_constant
9942                       || imm_expr.X_add_number < minval
9943                       || imm_expr.X_add_number > maxval)
9944                     {
9945                       if (more)
9946                         break;
9947                       if (imm_expr.X_op == O_constant
9948                           || imm_expr.X_op == O_big)
9949                         as_bad (_("expression out of range"));
9950                     }
9951                 }
9952               s = expr_end;
9953               continue;
9954
9955             case 'o':           /* 16 bit offset */
9956               /* Check whether there is only a single bracketed expression
9957                  left.  If so, it must be the base register and the
9958                  constant must be zero.  */
9959               if (*s == '(' && strchr (s + 1, '(') == 0)
9960                 {
9961                   offset_expr.X_op = O_constant;
9962                   offset_expr.X_add_number = 0;
9963                   continue;
9964                 }
9965
9966               /* If this value won't fit into a 16 bit offset, then go
9967                  find a macro that will generate the 32 bit offset
9968                  code pattern.  */
9969               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
9970                   && (offset_expr.X_op != O_constant
9971                       || offset_expr.X_add_number >= 0x8000
9972                       || offset_expr.X_add_number < -0x8000))
9973                 break;
9974
9975               s = expr_end;
9976               continue;
9977
9978             case 'p':           /* pc relative offset */
9979               *offset_reloc = BFD_RELOC_16_PCREL_S2;
9980               my_getExpression (&offset_expr, s);
9981               s = expr_end;
9982               continue;
9983
9984             case 'u':           /* upper 16 bits */
9985               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
9986                   && imm_expr.X_op == O_constant
9987                   && (imm_expr.X_add_number < 0
9988                       || imm_expr.X_add_number >= 0x10000))
9989                 as_bad (_("lui expression not in range 0..65535"));
9990               s = expr_end;
9991               continue;
9992
9993             case 'a':           /* 26 bit address */
9994               my_getExpression (&offset_expr, s);
9995               s = expr_end;
9996               *offset_reloc = BFD_RELOC_MIPS_JMP;
9997               continue;
9998
9999             case 'N':           /* 3 bit branch condition code */
10000             case 'M':           /* 3 bit compare condition code */
10001               rtype = RTYPE_CCC;
10002               if (ip->insn_mo->pinfo & (FP_D| FP_S))
10003                 rtype |= RTYPE_FCC;
10004               if (!reg_lookup (&s, rtype, &regno))
10005                 break;
10006               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
10007                    || strcmp(str + strlen(str) - 5, "any2f") == 0
10008                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
10009                   && (regno & 1) != 0)
10010                 as_warn (_("Condition code register should be even for %s, was %d"),
10011                          str, regno);
10012               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
10013                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
10014                   && (regno & 3) != 0)
10015                 as_warn (_("Condition code register should be 0 or 4 for %s, was %d"),
10016                          str, regno);
10017               if (*args == 'N')
10018                 INSERT_OPERAND (BCC, *ip, regno);
10019               else
10020                 INSERT_OPERAND (CCC, *ip, regno);
10021               continue;
10022
10023             case 'H':
10024               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10025                 s += 2;
10026               if (ISDIGIT (*s))
10027                 {
10028                   c = 0;
10029                   do
10030                     {
10031                       c *= 10;
10032                       c += *s - '0';
10033                       ++s;
10034                     }
10035                   while (ISDIGIT (*s));
10036                 }
10037               else
10038                 c = 8; /* Invalid sel value.  */
10039
10040               if (c > 7)
10041                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
10042               ip->insn_opcode |= c;
10043               continue;
10044
10045             case 'e':
10046               /* Must be at least one digit.  */
10047               my_getExpression (&imm_expr, s);
10048               check_absolute_expr (ip, &imm_expr);
10049
10050               if ((unsigned long) imm_expr.X_add_number
10051                   > (unsigned long) OP_MASK_VECBYTE)
10052                 {
10053                   as_bad (_("bad byte vector index (%ld)"),
10054                            (long) imm_expr.X_add_number);
10055                   imm_expr.X_add_number = 0;
10056                 }
10057
10058               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10059               imm_expr.X_op = O_absent;
10060               s = expr_end;
10061               continue;
10062
10063             case '%':
10064               my_getExpression (&imm_expr, s);
10065               check_absolute_expr (ip, &imm_expr);
10066
10067               if ((unsigned long) imm_expr.X_add_number
10068                   > (unsigned long) OP_MASK_VECALIGN)
10069                 {
10070                   as_bad (_("bad byte vector index (%ld)"),
10071                            (long) imm_expr.X_add_number);
10072                   imm_expr.X_add_number = 0;
10073                 }
10074
10075               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10076               imm_expr.X_op = O_absent;
10077               s = expr_end;
10078               continue;
10079
10080             default:
10081               as_bad (_("bad char = '%c'\n"), *args);
10082               internalError ();
10083             }
10084           break;
10085         }
10086       /* Args don't match.  */
10087       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10088           !strcmp (insn->name, insn[1].name))
10089         {
10090           ++insn;
10091           s = argsStart;
10092           insn_error = _("illegal operands");
10093           continue;
10094         }
10095       if (save_c)
10096         *(--argsStart) = save_c;
10097       insn_error = _("illegal operands");
10098       return;
10099     }
10100 }
10101
10102 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10103
10104 /* This routine assembles an instruction into its binary format when
10105    assembling for the mips16.  As a side effect, it sets one of the
10106    global variables imm_reloc or offset_reloc to the type of
10107    relocation to do if one of the operands is an address expression.
10108    It also sets mips16_small and mips16_ext if the user explicitly
10109    requested a small or extended instruction.  */
10110
10111 static void
10112 mips16_ip (char *str, struct mips_cl_insn *ip)
10113 {
10114   char *s;
10115   const char *args;
10116   struct mips_opcode *insn;
10117   char *argsstart;
10118   unsigned int regno;
10119   unsigned int lastregno = 0;
10120   char *s_reset;
10121   size_t i;
10122
10123   insn_error = NULL;
10124
10125   mips16_small = FALSE;
10126   mips16_ext = FALSE;
10127
10128   for (s = str; ISLOWER (*s); ++s)
10129     ;
10130   switch (*s)
10131     {
10132     case '\0':
10133       break;
10134
10135     case ' ':
10136       *s++ = '\0';
10137       break;
10138
10139     case '.':
10140       if (s[1] == 't' && s[2] == ' ')
10141         {
10142           *s = '\0';
10143           mips16_small = TRUE;
10144           s += 3;
10145           break;
10146         }
10147       else if (s[1] == 'e' && s[2] == ' ')
10148         {
10149           *s = '\0';
10150           mips16_ext = TRUE;
10151           s += 3;
10152           break;
10153         }
10154       /* Fall through.  */
10155     default:
10156       insn_error = _("unknown opcode");
10157       return;
10158     }
10159
10160   if (mips_opts.noautoextend && ! mips16_ext)
10161     mips16_small = TRUE;
10162
10163   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10164     {
10165       insn_error = _("unrecognized opcode");
10166       return;
10167     }
10168
10169   argsstart = s;
10170   for (;;)
10171     {
10172       bfd_boolean ok;
10173
10174       gas_assert (strcmp (insn->name, str) == 0);
10175
10176       ok = is_opcode_valid_16 (insn);
10177       if (! ok)
10178         {
10179           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10180               && strcmp (insn->name, insn[1].name) == 0)
10181             {
10182               ++insn;
10183               continue;
10184             }
10185           else
10186             {
10187               if (!insn_error)
10188                 {
10189                   static char buf[100];
10190                   sprintf (buf,
10191                            _("opcode not supported on this processor: %s (%s)"),
10192                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10193                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10194                   insn_error = buf;
10195                 }
10196               return;
10197             }
10198         }
10199
10200       create_insn (ip, insn);
10201       imm_expr.X_op = O_absent;
10202       imm_reloc[0] = BFD_RELOC_UNUSED;
10203       imm_reloc[1] = BFD_RELOC_UNUSED;
10204       imm_reloc[2] = BFD_RELOC_UNUSED;
10205       imm2_expr.X_op = O_absent;
10206       offset_expr.X_op = O_absent;
10207       offset_reloc[0] = BFD_RELOC_UNUSED;
10208       offset_reloc[1] = BFD_RELOC_UNUSED;
10209       offset_reloc[2] = BFD_RELOC_UNUSED;
10210       for (args = insn->args; 1; ++args)
10211         {
10212           int c;
10213
10214           if (*s == ' ')
10215             ++s;
10216
10217           /* In this switch statement we call break if we did not find
10218              a match, continue if we did find a match, or return if we
10219              are done.  */
10220
10221           c = *args;
10222           switch (c)
10223             {
10224             case '\0':
10225               if (*s == '\0')
10226                 {
10227                   /* Stuff the immediate value in now, if we can.  */
10228                   if (imm_expr.X_op == O_constant
10229                       && *imm_reloc > BFD_RELOC_UNUSED
10230                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10231                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10232                       && insn->pinfo != INSN_MACRO)
10233                     {
10234                       valueT tmp;
10235
10236                       switch (*offset_reloc)
10237                         {
10238                           case BFD_RELOC_MIPS16_HI16_S:
10239                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10240                             break;
10241
10242                           case BFD_RELOC_MIPS16_HI16:
10243                             tmp = imm_expr.X_add_number >> 16;
10244                             break;
10245
10246                           case BFD_RELOC_MIPS16_LO16:
10247                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10248                                   - 0x8000;
10249                             break;
10250
10251                           case BFD_RELOC_UNUSED:
10252                             tmp = imm_expr.X_add_number;
10253                             break;
10254
10255                           default:
10256                             internalError ();
10257                         }
10258                       *offset_reloc = BFD_RELOC_UNUSED;
10259
10260                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10261                                     tmp, TRUE, mips16_small,
10262                                     mips16_ext, &ip->insn_opcode,
10263                                     &ip->use_extend, &ip->extend);
10264                       imm_expr.X_op = O_absent;
10265                       *imm_reloc = BFD_RELOC_UNUSED;
10266                     }
10267
10268                   return;
10269                 }
10270               break;
10271
10272             case ',':
10273               if (*s++ == c)
10274                 continue;
10275               s--;
10276               switch (*++args)
10277                 {
10278                 case 'v':
10279                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10280                   continue;
10281                 case 'w':
10282                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10283                   continue;
10284                 }
10285               break;
10286
10287             case '(':
10288             case ')':
10289               if (*s++ == c)
10290                 continue;
10291               break;
10292
10293             case 'v':
10294             case 'w':
10295               if (s[0] != '$')
10296                 {
10297                   if (c == 'v')
10298                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10299                   else
10300                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10301                   ++args;
10302                   continue;
10303                 }
10304               /* Fall through.  */
10305             case 'x':
10306             case 'y':
10307             case 'z':
10308             case 'Z':
10309             case '0':
10310             case 'S':
10311             case 'R':
10312             case 'X':
10313             case 'Y':
10314               s_reset = s;
10315               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10316                 {
10317                   if (c == 'v' || c == 'w')
10318                     {
10319                       if (c == 'v')
10320                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10321                       else
10322                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10323                       ++args;
10324                       continue;
10325                     }
10326                   break;
10327                 }
10328
10329               if (*s == ' ')
10330                 ++s;
10331               if (args[1] != *s)
10332                 {
10333                   if (c == 'v' || c == 'w')
10334                     {
10335                       regno = mips16_to_32_reg_map[lastregno];
10336                       s = s_reset;
10337                       ++args;
10338                     }
10339                 }
10340
10341               switch (c)
10342                 {
10343                 case 'x':
10344                 case 'y':
10345                 case 'z':
10346                 case 'v':
10347                 case 'w':
10348                 case 'Z':
10349                   regno = mips32_to_16_reg_map[regno];
10350                   break;
10351
10352                 case '0':
10353                   if (regno != 0)
10354                     regno = ILLEGAL_REG;
10355                   break;
10356
10357                 case 'S':
10358                   if (regno != SP)
10359                     regno = ILLEGAL_REG;
10360                   break;
10361
10362                 case 'R':
10363                   if (regno != RA)
10364                     regno = ILLEGAL_REG;
10365                   break;
10366
10367                 case 'X':
10368                 case 'Y':
10369                   if (regno == AT && mips_opts.at)
10370                     {
10371                       if (mips_opts.at == ATREG)
10372                         as_warn (_("used $at without \".set noat\""));
10373                       else
10374                         as_warn (_("used $%u with \".set at=$%u\""),
10375                                  regno, mips_opts.at);
10376                     }
10377                   break;
10378
10379                 default:
10380                   internalError ();
10381                 }
10382
10383               if (regno == ILLEGAL_REG)
10384                 break;
10385
10386               switch (c)
10387                 {
10388                 case 'x':
10389                 case 'v':
10390                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10391                   break;
10392                 case 'y':
10393                 case 'w':
10394                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10395                   break;
10396                 case 'z':
10397                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10398                   break;
10399                 case 'Z':
10400                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10401                 case '0':
10402                 case 'S':
10403                 case 'R':
10404                   break;
10405                 case 'X':
10406                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10407                   break;
10408                 case 'Y':
10409                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10410                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10411                   break;
10412                 default:
10413                   internalError ();
10414                 }
10415
10416               lastregno = regno;
10417               continue;
10418
10419             case 'P':
10420               if (strncmp (s, "$pc", 3) == 0)
10421                 {
10422                   s += 3;
10423                   continue;
10424                 }
10425               break;
10426
10427             case '5':
10428             case 'H':
10429             case 'W':
10430             case 'D':
10431             case 'j':
10432             case 'V':
10433             case 'C':
10434             case 'U':
10435             case 'k':
10436             case 'K':
10437               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10438               if (i > 0)
10439                 {
10440                   if (imm_expr.X_op != O_constant)
10441                     {
10442                       mips16_ext = TRUE;
10443                       ip->use_extend = TRUE;
10444                       ip->extend = 0;
10445                     }
10446                   else
10447                     {
10448                       /* We need to relax this instruction.  */
10449                       *offset_reloc = *imm_reloc;
10450                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10451                     }
10452                   s = expr_end;
10453                   continue;
10454                 }
10455               *imm_reloc = BFD_RELOC_UNUSED;
10456               /* Fall through.  */
10457             case '<':
10458             case '>':
10459             case '[':
10460             case ']':
10461             case '4':
10462             case '8':
10463               my_getExpression (&imm_expr, s);
10464               if (imm_expr.X_op == O_register)
10465                 {
10466                   /* What we thought was an expression turned out to
10467                      be a register.  */
10468
10469                   if (s[0] == '(' && args[1] == '(')
10470                     {
10471                       /* It looks like the expression was omitted
10472                          before a register indirection, which means
10473                          that the expression is implicitly zero.  We
10474                          still set up imm_expr, so that we handle
10475                          explicit extensions correctly.  */
10476                       imm_expr.X_op = O_constant;
10477                       imm_expr.X_add_number = 0;
10478                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10479                       continue;
10480                     }
10481
10482                   break;
10483                 }
10484
10485               /* We need to relax this instruction.  */
10486               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10487               s = expr_end;
10488               continue;
10489
10490             case 'p':
10491             case 'q':
10492             case 'A':
10493             case 'B':
10494             case 'E':
10495               /* We use offset_reloc rather than imm_reloc for the PC
10496                  relative operands.  This lets macros with both
10497                  immediate and address operands work correctly.  */
10498               my_getExpression (&offset_expr, s);
10499
10500               if (offset_expr.X_op == O_register)
10501                 break;
10502
10503               /* We need to relax this instruction.  */
10504               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10505               s = expr_end;
10506               continue;
10507
10508             case '6':           /* break code */
10509               my_getExpression (&imm_expr, s);
10510               check_absolute_expr (ip, &imm_expr);
10511               if ((unsigned long) imm_expr.X_add_number > 63)
10512                 as_warn (_("Invalid value for `%s' (%lu)"),
10513                          ip->insn_mo->name,
10514                          (unsigned long) imm_expr.X_add_number);
10515               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10516               imm_expr.X_op = O_absent;
10517               s = expr_end;
10518               continue;
10519
10520             case 'a':           /* 26 bit address */
10521               my_getExpression (&offset_expr, s);
10522               s = expr_end;
10523               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10524               ip->insn_opcode <<= 16;
10525               continue;
10526
10527             case 'l':           /* register list for entry macro */
10528             case 'L':           /* register list for exit macro */
10529               {
10530                 int mask;
10531
10532                 if (c == 'l')
10533                   mask = 0;
10534                 else
10535                   mask = 7 << 3;
10536                 while (*s != '\0')
10537                   {
10538                     unsigned int freg, reg1, reg2;
10539
10540                     while (*s == ' ' || *s == ',')
10541                       ++s;
10542                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10543                       freg = 0;
10544                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10545                       freg = 1;
10546                     else
10547                       {
10548                         as_bad (_("can't parse register list"));
10549                         break;
10550                       }
10551                     if (*s == ' ')
10552                       ++s;
10553                     if (*s != '-')
10554                       reg2 = reg1;
10555                     else
10556                       {
10557                         ++s;
10558                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10559                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10560                           {
10561                             as_bad (_("invalid register list"));
10562                             break;
10563                           }
10564                       }
10565                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10566                       {
10567                         mask &= ~ (7 << 3);
10568                         mask |= 5 << 3;
10569                       }
10570                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10571                       {
10572                         mask &= ~ (7 << 3);
10573                         mask |= 6 << 3;
10574                       }
10575                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10576                       mask |= (reg2 - 3) << 3;
10577                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10578                       mask |= (reg2 - 15) << 1;
10579                     else if (reg1 == RA && reg2 == RA)
10580                       mask |= 1;
10581                     else
10582                       {
10583                         as_bad (_("invalid register list"));
10584                         break;
10585                       }
10586                   }
10587                 /* The mask is filled in in the opcode table for the
10588                    benefit of the disassembler.  We remove it before
10589                    applying the actual mask.  */
10590                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10591                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10592               }
10593             continue;
10594
10595             case 'm':           /* Register list for save insn.  */
10596             case 'M':           /* Register list for restore insn.  */
10597               {
10598                 int opcode = 0;
10599                 int framesz = 0, seen_framesz = 0;
10600                 int args = 0, statics = 0, sregs = 0;
10601
10602                 while (*s != '\0')
10603                   {
10604                     unsigned int reg1, reg2;
10605
10606                     SKIP_SPACE_TABS (s);
10607                     while (*s == ',')
10608                       ++s;
10609                     SKIP_SPACE_TABS (s);
10610
10611                     my_getExpression (&imm_expr, s);
10612                     if (imm_expr.X_op == O_constant)
10613                       {
10614                         /* Handle the frame size.  */
10615                         if (seen_framesz)
10616                           {
10617                             as_bad (_("more than one frame size in list"));
10618                             break;
10619                           }
10620                         seen_framesz = 1;
10621                         framesz = imm_expr.X_add_number;
10622                         imm_expr.X_op = O_absent;
10623                         s = expr_end;
10624                         continue;
10625                       }
10626
10627                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10628                       {
10629                         as_bad (_("can't parse register list"));
10630                         break;
10631                       }
10632
10633                     while (*s == ' ')
10634                       ++s;
10635
10636                     if (*s != '-')
10637                       reg2 = reg1;
10638                     else
10639                       {
10640                         ++s;
10641                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10642                             || reg2 < reg1)
10643                           {
10644                             as_bad (_("can't parse register list"));
10645                             break;
10646                           }
10647                       }
10648
10649                     while (reg1 <= reg2)
10650                       {
10651                         if (reg1 >= 4 && reg1 <= 7)
10652                           {
10653                             if (!seen_framesz)
10654                                 /* args $a0-$a3 */
10655                                 args |= 1 << (reg1 - 4);
10656                             else
10657                                 /* statics $a0-$a3 */
10658                                 statics |= 1 << (reg1 - 4);
10659                           }
10660                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10661                           {
10662                             /* $s0-$s8 */
10663                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10664                           }
10665                         else if (reg1 == 31)
10666                           {
10667                             /* Add $ra to insn.  */
10668                             opcode |= 0x40;
10669                           }
10670                         else
10671                           {
10672                             as_bad (_("unexpected register in list"));
10673                             break;
10674                           }
10675                         if (++reg1 == 24)
10676                           reg1 = 30;
10677                       }
10678                   }
10679
10680                 /* Encode args/statics combination.  */
10681                 if (args & statics)
10682                   as_bad (_("arg/static registers overlap"));
10683                 else if (args == 0xf)
10684                   /* All $a0-$a3 are args.  */
10685                   opcode |= MIPS16_ALL_ARGS << 16;
10686                 else if (statics == 0xf)
10687                   /* All $a0-$a3 are statics.  */
10688                   opcode |= MIPS16_ALL_STATICS << 16;
10689                 else 
10690                   {
10691                     int narg = 0, nstat = 0;
10692
10693                     /* Count arg registers.  */
10694                     while (args & 0x1)
10695                       {
10696                         args >>= 1;
10697                         narg++;
10698                       }
10699                     if (args != 0)
10700                       as_bad (_("invalid arg register list"));
10701
10702                     /* Count static registers.  */
10703                     while (statics & 0x8)
10704                       {
10705                         statics = (statics << 1) & 0xf;
10706                         nstat++;
10707                       }
10708                     if (statics != 0) 
10709                       as_bad (_("invalid static register list"));
10710
10711                     /* Encode args/statics.  */
10712                     opcode |= ((narg << 2) | nstat) << 16;
10713                   }
10714
10715                 /* Encode $s0/$s1.  */
10716                 if (sregs & (1 << 0))           /* $s0 */
10717                   opcode |= 0x20;
10718                 if (sregs & (1 << 1))           /* $s1 */
10719                   opcode |= 0x10;
10720                 sregs >>= 2;
10721
10722                 if (sregs != 0)
10723                   {
10724                     /* Count regs $s2-$s8.  */
10725                     int nsreg = 0;
10726                     while (sregs & 1)
10727                       {
10728                         sregs >>= 1;
10729                         nsreg++;
10730                       }
10731                     if (sregs != 0)
10732                       as_bad (_("invalid static register list"));
10733                     /* Encode $s2-$s8. */
10734                     opcode |= nsreg << 24;
10735                   }
10736
10737                 /* Encode frame size.  */
10738                 if (!seen_framesz)
10739                   as_bad (_("missing frame size"));
10740                 else if ((framesz & 7) != 0 || framesz < 0
10741                          || framesz > 0xff * 8)
10742                   as_bad (_("invalid frame size"));
10743                 else if (framesz != 128 || (opcode >> 16) != 0)
10744                   {
10745                     framesz /= 8;
10746                     opcode |= (((framesz & 0xf0) << 16)
10747                              | (framesz & 0x0f));
10748                   }
10749
10750                 /* Finally build the instruction.  */
10751                 if ((opcode >> 16) != 0 || framesz == 0)
10752                   {
10753                     ip->use_extend = TRUE;
10754                     ip->extend = opcode >> 16;
10755                   }
10756                 ip->insn_opcode |= opcode & 0x7f;
10757               }
10758             continue;
10759
10760             case 'e':           /* extend code */
10761               my_getExpression (&imm_expr, s);
10762               check_absolute_expr (ip, &imm_expr);
10763               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10764                 {
10765                   as_warn (_("Invalid value for `%s' (%lu)"),
10766                            ip->insn_mo->name,
10767                            (unsigned long) imm_expr.X_add_number);
10768                   imm_expr.X_add_number &= 0x7ff;
10769                 }
10770               ip->insn_opcode |= imm_expr.X_add_number;
10771               imm_expr.X_op = O_absent;
10772               s = expr_end;
10773               continue;
10774
10775             default:
10776               internalError ();
10777             }
10778           break;
10779         }
10780
10781       /* Args don't match.  */
10782       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10783           strcmp (insn->name, insn[1].name) == 0)
10784         {
10785           ++insn;
10786           s = argsstart;
10787           continue;
10788         }
10789
10790       insn_error = _("illegal operands");
10791
10792       return;
10793     }
10794 }
10795
10796 /* This structure holds information we know about a mips16 immediate
10797    argument type.  */
10798
10799 struct mips16_immed_operand
10800 {
10801   /* The type code used in the argument string in the opcode table.  */
10802   int type;
10803   /* The number of bits in the short form of the opcode.  */
10804   int nbits;
10805   /* The number of bits in the extended form of the opcode.  */
10806   int extbits;
10807   /* The amount by which the short form is shifted when it is used;
10808      for example, the sw instruction has a shift count of 2.  */
10809   int shift;
10810   /* The amount by which the short form is shifted when it is stored
10811      into the instruction code.  */
10812   int op_shift;
10813   /* Non-zero if the short form is unsigned.  */
10814   int unsp;
10815   /* Non-zero if the extended form is unsigned.  */
10816   int extu;
10817   /* Non-zero if the value is PC relative.  */
10818   int pcrel;
10819 };
10820
10821 /* The mips16 immediate operand types.  */
10822
10823 static const struct mips16_immed_operand mips16_immed_operands[] =
10824 {
10825   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10826   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10827   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10828   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10829   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10830   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10831   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10832   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10833   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10834   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10835   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10836   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10837   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10838   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10839   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10840   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10841   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10842   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10843   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10844   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10845   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10846 };
10847
10848 #define MIPS16_NUM_IMMED \
10849   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10850
10851 /* Handle a mips16 instruction with an immediate value.  This or's the
10852    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10853    whether an extended value is needed; if one is needed, it sets
10854    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10855    If SMALL is true, an unextended opcode was explicitly requested.
10856    If EXT is true, an extended opcode was explicitly requested.  If
10857    WARN is true, warn if EXT does not match reality.  */
10858
10859 static void
10860 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10861               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10862               unsigned long *insn, bfd_boolean *use_extend,
10863               unsigned short *extend)
10864 {
10865   const struct mips16_immed_operand *op;
10866   int mintiny, maxtiny;
10867   bfd_boolean needext;
10868
10869   op = mips16_immed_operands;
10870   while (op->type != type)
10871     {
10872       ++op;
10873       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10874     }
10875
10876   if (op->unsp)
10877     {
10878       if (type == '<' || type == '>' || type == '[' || type == ']')
10879         {
10880           mintiny = 1;
10881           maxtiny = 1 << op->nbits;
10882         }
10883       else
10884         {
10885           mintiny = 0;
10886           maxtiny = (1 << op->nbits) - 1;
10887         }
10888     }
10889   else
10890     {
10891       mintiny = - (1 << (op->nbits - 1));
10892       maxtiny = (1 << (op->nbits - 1)) - 1;
10893     }
10894
10895   /* Branch offsets have an implicit 0 in the lowest bit.  */
10896   if (type == 'p' || type == 'q')
10897     val /= 2;
10898
10899   if ((val & ((1 << op->shift) - 1)) != 0
10900       || val < (mintiny << op->shift)
10901       || val > (maxtiny << op->shift))
10902     needext = TRUE;
10903   else
10904     needext = FALSE;
10905
10906   if (warn && ext && ! needext)
10907     as_warn_where (file, line,
10908                    _("extended operand requested but not required"));
10909   if (small && needext)
10910     as_bad_where (file, line, _("invalid unextended operand value"));
10911
10912   if (small || (! ext && ! needext))
10913     {
10914       int insnval;
10915
10916       *use_extend = FALSE;
10917       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
10918       insnval <<= op->op_shift;
10919       *insn |= insnval;
10920     }
10921   else
10922     {
10923       long minext, maxext;
10924       int extval;
10925
10926       if (op->extu)
10927         {
10928           minext = 0;
10929           maxext = (1 << op->extbits) - 1;
10930         }
10931       else
10932         {
10933           minext = - (1 << (op->extbits - 1));
10934           maxext = (1 << (op->extbits - 1)) - 1;
10935         }
10936       if (val < minext || val > maxext)
10937         as_bad_where (file, line,
10938                       _("operand value out of range for instruction"));
10939
10940       *use_extend = TRUE;
10941       if (op->extbits == 16)
10942         {
10943           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
10944           val &= 0x1f;
10945         }
10946       else if (op->extbits == 15)
10947         {
10948           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
10949           val &= 0xf;
10950         }
10951       else
10952         {
10953           extval = ((val & 0x1f) << 6) | (val & 0x20);
10954           val = 0;
10955         }
10956
10957       *extend = (unsigned short) extval;
10958       *insn |= val;
10959     }
10960 }
10961 \f
10962 struct percent_op_match
10963 {
10964   const char *str;
10965   bfd_reloc_code_real_type reloc;
10966 };
10967
10968 static const struct percent_op_match mips_percent_op[] =
10969 {
10970   {"%lo", BFD_RELOC_LO16},
10971 #ifdef OBJ_ELF
10972   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
10973   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
10974   {"%call16", BFD_RELOC_MIPS_CALL16},
10975   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
10976   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
10977   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
10978   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
10979   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
10980   {"%got", BFD_RELOC_MIPS_GOT16},
10981   {"%gp_rel", BFD_RELOC_GPREL16},
10982   {"%half", BFD_RELOC_16},
10983   {"%highest", BFD_RELOC_MIPS_HIGHEST},
10984   {"%higher", BFD_RELOC_MIPS_HIGHER},
10985   {"%neg", BFD_RELOC_MIPS_SUB},
10986   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
10987   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
10988   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
10989   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
10990   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
10991   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
10992   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
10993 #endif
10994   {"%hi", BFD_RELOC_HI16_S}
10995 };
10996
10997 static const struct percent_op_match mips16_percent_op[] =
10998 {
10999   {"%lo", BFD_RELOC_MIPS16_LO16},
11000   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11001   {"%got", BFD_RELOC_MIPS16_GOT16},
11002   {"%call16", BFD_RELOC_MIPS16_CALL16},
11003   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11004 };
11005
11006
11007 /* Return true if *STR points to a relocation operator.  When returning true,
11008    move *STR over the operator and store its relocation code in *RELOC.
11009    Leave both *STR and *RELOC alone when returning false.  */
11010
11011 static bfd_boolean
11012 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11013 {
11014   const struct percent_op_match *percent_op;
11015   size_t limit, i;
11016
11017   if (mips_opts.mips16)
11018     {
11019       percent_op = mips16_percent_op;
11020       limit = ARRAY_SIZE (mips16_percent_op);
11021     }
11022   else
11023     {
11024       percent_op = mips_percent_op;
11025       limit = ARRAY_SIZE (mips_percent_op);
11026     }
11027
11028   for (i = 0; i < limit; i++)
11029     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11030       {
11031         int len = strlen (percent_op[i].str);
11032
11033         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11034           continue;
11035
11036         *str += strlen (percent_op[i].str);
11037         *reloc = percent_op[i].reloc;
11038
11039         /* Check whether the output BFD supports this relocation.
11040            If not, issue an error and fall back on something safe.  */
11041         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11042           {
11043             as_bad (_("relocation %s isn't supported by the current ABI"),
11044                     percent_op[i].str);
11045             *reloc = BFD_RELOC_UNUSED;
11046           }
11047         return TRUE;
11048       }
11049   return FALSE;
11050 }
11051
11052
11053 /* Parse string STR as a 16-bit relocatable operand.  Store the
11054    expression in *EP and the relocations in the array starting
11055    at RELOC.  Return the number of relocation operators used.
11056
11057    On exit, EXPR_END points to the first character after the expression.  */
11058
11059 static size_t
11060 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11061                        char *str)
11062 {
11063   bfd_reloc_code_real_type reversed_reloc[3];
11064   size_t reloc_index, i;
11065   int crux_depth, str_depth;
11066   char *crux;
11067
11068   /* Search for the start of the main expression, recoding relocations
11069      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11070      of the main expression and with CRUX_DEPTH containing the number
11071      of open brackets at that point.  */
11072   reloc_index = -1;
11073   str_depth = 0;
11074   do
11075     {
11076       reloc_index++;
11077       crux = str;
11078       crux_depth = str_depth;
11079
11080       /* Skip over whitespace and brackets, keeping count of the number
11081          of brackets.  */
11082       while (*str == ' ' || *str == '\t' || *str == '(')
11083         if (*str++ == '(')
11084           str_depth++;
11085     }
11086   while (*str == '%'
11087          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11088          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11089
11090   my_getExpression (ep, crux);
11091   str = expr_end;
11092
11093   /* Match every open bracket.  */
11094   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11095     if (*str++ == ')')
11096       crux_depth--;
11097
11098   if (crux_depth > 0)
11099     as_bad (_("unclosed '('"));
11100
11101   expr_end = str;
11102
11103   if (reloc_index != 0)
11104     {
11105       prev_reloc_op_frag = frag_now;
11106       for (i = 0; i < reloc_index; i++)
11107         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11108     }
11109
11110   return reloc_index;
11111 }
11112
11113 static void
11114 my_getExpression (expressionS *ep, char *str)
11115 {
11116   char *save_in;
11117   valueT val;
11118
11119   save_in = input_line_pointer;
11120   input_line_pointer = str;
11121   expression (ep);
11122   expr_end = input_line_pointer;
11123   input_line_pointer = save_in;
11124
11125   /* If we are in mips16 mode, and this is an expression based on `.',
11126      then we bump the value of the symbol by 1 since that is how other
11127      text symbols are handled.  We don't bother to handle complex
11128      expressions, just `.' plus or minus a constant.  */
11129   if (mips_opts.mips16
11130       && ep->X_op == O_symbol
11131       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11132       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11133       && symbol_get_frag (ep->X_add_symbol) == frag_now
11134       && symbol_constant_p (ep->X_add_symbol)
11135       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11136     S_SET_VALUE (ep->X_add_symbol, val + 1);
11137 }
11138
11139 char *
11140 md_atof (int type, char *litP, int *sizeP)
11141 {
11142   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11143 }
11144
11145 void
11146 md_number_to_chars (char *buf, valueT val, int n)
11147 {
11148   if (target_big_endian)
11149     number_to_chars_bigendian (buf, val, n);
11150   else
11151     number_to_chars_littleendian (buf, val, n);
11152 }
11153 \f
11154 #ifdef OBJ_ELF
11155 static int support_64bit_objects(void)
11156 {
11157   const char **list, **l;
11158   int yes;
11159
11160   list = bfd_target_list ();
11161   for (l = list; *l != NULL; l++)
11162 #ifdef TE_TMIPS
11163     /* This is traditional mips */
11164     if (strcmp (*l, "elf64-tradbigmips") == 0
11165         || strcmp (*l, "elf64-tradlittlemips") == 0)
11166 #else
11167     if (strcmp (*l, "elf64-bigmips") == 0
11168         || strcmp (*l, "elf64-littlemips") == 0)
11169 #endif
11170       break;
11171   yes = (*l != NULL);
11172   free (list);
11173   return yes;
11174 }
11175 #endif /* OBJ_ELF */
11176
11177 const char *md_shortopts = "O::g::G:";
11178
11179 enum options
11180   {
11181     OPTION_MARCH = OPTION_MD_BASE,
11182     OPTION_MTUNE,
11183     OPTION_MIPS1,
11184     OPTION_MIPS2,
11185     OPTION_MIPS3,
11186     OPTION_MIPS4,
11187     OPTION_MIPS5,
11188     OPTION_MIPS32,
11189     OPTION_MIPS64,
11190     OPTION_MIPS32R2,
11191     OPTION_MIPS64R2,
11192     OPTION_MIPS16,
11193     OPTION_NO_MIPS16,
11194     OPTION_MIPS3D,
11195     OPTION_NO_MIPS3D,
11196     OPTION_MDMX,
11197     OPTION_NO_MDMX,
11198     OPTION_DSP,
11199     OPTION_NO_DSP,
11200     OPTION_MT,
11201     OPTION_NO_MT,
11202     OPTION_SMARTMIPS,
11203     OPTION_NO_SMARTMIPS,
11204     OPTION_DSPR2,
11205     OPTION_NO_DSPR2,
11206     OPTION_COMPAT_ARCH_BASE,
11207     OPTION_M4650,
11208     OPTION_NO_M4650,
11209     OPTION_M4010,
11210     OPTION_NO_M4010,
11211     OPTION_M4100,
11212     OPTION_NO_M4100,
11213     OPTION_M3900,
11214     OPTION_NO_M3900,
11215     OPTION_M7000_HILO_FIX,
11216     OPTION_MNO_7000_HILO_FIX, 
11217     OPTION_FIX_24K,
11218     OPTION_NO_FIX_24K,
11219     OPTION_FIX_VR4120,
11220     OPTION_NO_FIX_VR4120,
11221     OPTION_FIX_VR4130,
11222     OPTION_NO_FIX_VR4130,
11223     OPTION_TRAP,
11224     OPTION_BREAK,
11225     OPTION_EB,
11226     OPTION_EL,
11227     OPTION_FP32,
11228     OPTION_GP32,
11229     OPTION_CONSTRUCT_FLOATS,
11230     OPTION_NO_CONSTRUCT_FLOATS,
11231     OPTION_FP64,
11232     OPTION_GP64,
11233     OPTION_RELAX_BRANCH,
11234     OPTION_NO_RELAX_BRANCH,
11235     OPTION_MSHARED,
11236     OPTION_MNO_SHARED,
11237     OPTION_MSYM32,
11238     OPTION_MNO_SYM32,
11239     OPTION_SOFT_FLOAT,
11240     OPTION_HARD_FLOAT,
11241     OPTION_SINGLE_FLOAT,
11242     OPTION_DOUBLE_FLOAT,
11243     OPTION_32,
11244 #ifdef OBJ_ELF
11245     OPTION_CALL_SHARED,
11246     OPTION_CALL_NONPIC,
11247     OPTION_NON_SHARED,
11248     OPTION_XGOT,
11249     OPTION_MABI,
11250     OPTION_N32,
11251     OPTION_64,
11252     OPTION_MDEBUG,
11253     OPTION_NO_MDEBUG,
11254     OPTION_PDR,
11255     OPTION_NO_PDR,
11256     OPTION_MVXWORKS_PIC,
11257 #endif /* OBJ_ELF */
11258     OPTION_END_OF_ENUM    
11259   };
11260   
11261 struct option md_longopts[] =
11262 {
11263   /* Options which specify architecture.  */
11264   {"march", required_argument, NULL, OPTION_MARCH},
11265   {"mtune", required_argument, NULL, OPTION_MTUNE},
11266   {"mips0", no_argument, NULL, OPTION_MIPS1},
11267   {"mips1", no_argument, NULL, OPTION_MIPS1},
11268   {"mips2", no_argument, NULL, OPTION_MIPS2},
11269   {"mips3", no_argument, NULL, OPTION_MIPS3},
11270   {"mips4", no_argument, NULL, OPTION_MIPS4},
11271   {"mips5", no_argument, NULL, OPTION_MIPS5},
11272   {"mips32", no_argument, NULL, OPTION_MIPS32},
11273   {"mips64", no_argument, NULL, OPTION_MIPS64},
11274   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11275   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11276
11277   /* Options which specify Application Specific Extensions (ASEs).  */
11278   {"mips16", no_argument, NULL, OPTION_MIPS16},
11279   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11280   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11281   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11282   {"mdmx", no_argument, NULL, OPTION_MDMX},
11283   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11284   {"mdsp", no_argument, NULL, OPTION_DSP},
11285   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11286   {"mmt", no_argument, NULL, OPTION_MT},
11287   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11288   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11289   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11290   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11291   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11292
11293   /* Old-style architecture options.  Don't add more of these.  */
11294   {"m4650", no_argument, NULL, OPTION_M4650},
11295   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11296   {"m4010", no_argument, NULL, OPTION_M4010},
11297   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11298   {"m4100", no_argument, NULL, OPTION_M4100},
11299   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11300   {"m3900", no_argument, NULL, OPTION_M3900},
11301   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11302
11303   /* Options which enable bug fixes.  */
11304   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11305   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11306   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11307   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11308   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11309   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11310   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11311   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11312   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11313
11314   /* Miscellaneous options.  */
11315   {"trap", no_argument, NULL, OPTION_TRAP},
11316   {"no-break", no_argument, NULL, OPTION_TRAP},
11317   {"break", no_argument, NULL, OPTION_BREAK},
11318   {"no-trap", no_argument, NULL, OPTION_BREAK},
11319   {"EB", no_argument, NULL, OPTION_EB},
11320   {"EL", no_argument, NULL, OPTION_EL},
11321   {"mfp32", no_argument, NULL, OPTION_FP32},
11322   {"mgp32", no_argument, NULL, OPTION_GP32},
11323   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11324   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11325   {"mfp64", no_argument, NULL, OPTION_FP64},
11326   {"mgp64", no_argument, NULL, OPTION_GP64},
11327   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11328   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11329   {"mshared", no_argument, NULL, OPTION_MSHARED},
11330   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11331   {"msym32", no_argument, NULL, OPTION_MSYM32},
11332   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11333   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11334   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11335   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11336   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11337
11338   /* Strictly speaking this next option is ELF specific,
11339      but we allow it for other ports as well in order to
11340      make testing easier.  */
11341   {"32",          no_argument, NULL, OPTION_32},
11342   
11343   /* ELF-specific options.  */
11344 #ifdef OBJ_ELF
11345   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11346   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11347   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11348   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11349   {"xgot",        no_argument, NULL, OPTION_XGOT},
11350   {"mabi", required_argument, NULL, OPTION_MABI},
11351   {"n32",         no_argument, NULL, OPTION_N32},
11352   {"64",          no_argument, NULL, OPTION_64},
11353   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11354   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11355   {"mpdr", no_argument, NULL, OPTION_PDR},
11356   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11357   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11358 #endif /* OBJ_ELF */
11359
11360   {NULL, no_argument, NULL, 0}
11361 };
11362 size_t md_longopts_size = sizeof (md_longopts);
11363
11364 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11365    NEW_VALUE.  Warn if another value was already specified.  Note:
11366    we have to defer parsing the -march and -mtune arguments in order
11367    to handle 'from-abi' correctly, since the ABI might be specified
11368    in a later argument.  */
11369
11370 static void
11371 mips_set_option_string (const char **string_ptr, const char *new_value)
11372 {
11373   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11374     as_warn (_("A different %s was already specified, is now %s"),
11375              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11376              new_value);
11377
11378   *string_ptr = new_value;
11379 }
11380
11381 int
11382 md_parse_option (int c, char *arg)
11383 {
11384   switch (c)
11385     {
11386     case OPTION_CONSTRUCT_FLOATS:
11387       mips_disable_float_construction = 0;
11388       break;
11389
11390     case OPTION_NO_CONSTRUCT_FLOATS:
11391       mips_disable_float_construction = 1;
11392       break;
11393
11394     case OPTION_TRAP:
11395       mips_trap = 1;
11396       break;
11397
11398     case OPTION_BREAK:
11399       mips_trap = 0;
11400       break;
11401
11402     case OPTION_EB:
11403       target_big_endian = 1;
11404       break;
11405
11406     case OPTION_EL:
11407       target_big_endian = 0;
11408       break;
11409
11410     case 'O':
11411       if (arg == NULL)
11412         mips_optimize = 1;
11413       else if (arg[0] == '0')
11414         mips_optimize = 0;
11415       else if (arg[0] == '1')
11416         mips_optimize = 1;
11417       else
11418         mips_optimize = 2;
11419       break;
11420
11421     case 'g':
11422       if (arg == NULL)
11423         mips_debug = 2;
11424       else
11425         mips_debug = atoi (arg);
11426       break;
11427
11428     case OPTION_MIPS1:
11429       file_mips_isa = ISA_MIPS1;
11430       break;
11431
11432     case OPTION_MIPS2:
11433       file_mips_isa = ISA_MIPS2;
11434       break;
11435
11436     case OPTION_MIPS3:
11437       file_mips_isa = ISA_MIPS3;
11438       break;
11439
11440     case OPTION_MIPS4:
11441       file_mips_isa = ISA_MIPS4;
11442       break;
11443
11444     case OPTION_MIPS5:
11445       file_mips_isa = ISA_MIPS5;
11446       break;
11447
11448     case OPTION_MIPS32:
11449       file_mips_isa = ISA_MIPS32;
11450       break;
11451
11452     case OPTION_MIPS32R2:
11453       file_mips_isa = ISA_MIPS32R2;
11454       break;
11455
11456     case OPTION_MIPS64R2:
11457       file_mips_isa = ISA_MIPS64R2;
11458       break;
11459
11460     case OPTION_MIPS64:
11461       file_mips_isa = ISA_MIPS64;
11462       break;
11463
11464     case OPTION_MTUNE:
11465       mips_set_option_string (&mips_tune_string, arg);
11466       break;
11467
11468     case OPTION_MARCH:
11469       mips_set_option_string (&mips_arch_string, arg);
11470       break;
11471
11472     case OPTION_M4650:
11473       mips_set_option_string (&mips_arch_string, "4650");
11474       mips_set_option_string (&mips_tune_string, "4650");
11475       break;
11476
11477     case OPTION_NO_M4650:
11478       break;
11479
11480     case OPTION_M4010:
11481       mips_set_option_string (&mips_arch_string, "4010");
11482       mips_set_option_string (&mips_tune_string, "4010");
11483       break;
11484
11485     case OPTION_NO_M4010:
11486       break;
11487
11488     case OPTION_M4100:
11489       mips_set_option_string (&mips_arch_string, "4100");
11490       mips_set_option_string (&mips_tune_string, "4100");
11491       break;
11492
11493     case OPTION_NO_M4100:
11494       break;
11495
11496     case OPTION_M3900:
11497       mips_set_option_string (&mips_arch_string, "3900");
11498       mips_set_option_string (&mips_tune_string, "3900");
11499       break;
11500
11501     case OPTION_NO_M3900:
11502       break;
11503
11504     case OPTION_MDMX:
11505       mips_opts.ase_mdmx = 1;
11506       break;
11507
11508     case OPTION_NO_MDMX:
11509       mips_opts.ase_mdmx = 0;
11510       break;
11511
11512     case OPTION_DSP:
11513       mips_opts.ase_dsp = 1;
11514       mips_opts.ase_dspr2 = 0;
11515       break;
11516
11517     case OPTION_NO_DSP:
11518       mips_opts.ase_dsp = 0;
11519       mips_opts.ase_dspr2 = 0;
11520       break;
11521
11522     case OPTION_DSPR2:
11523       mips_opts.ase_dspr2 = 1;
11524       mips_opts.ase_dsp = 1;
11525       break;
11526
11527     case OPTION_NO_DSPR2:
11528       mips_opts.ase_dspr2 = 0;
11529       mips_opts.ase_dsp = 0;
11530       break;
11531
11532     case OPTION_MT:
11533       mips_opts.ase_mt = 1;
11534       break;
11535
11536     case OPTION_NO_MT:
11537       mips_opts.ase_mt = 0;
11538       break;
11539
11540     case OPTION_MIPS16:
11541       mips_opts.mips16 = 1;
11542       mips_no_prev_insn ();
11543       break;
11544
11545     case OPTION_NO_MIPS16:
11546       mips_opts.mips16 = 0;
11547       mips_no_prev_insn ();
11548       break;
11549
11550     case OPTION_MIPS3D:
11551       mips_opts.ase_mips3d = 1;
11552       break;
11553
11554     case OPTION_NO_MIPS3D:
11555       mips_opts.ase_mips3d = 0;
11556       break;
11557
11558     case OPTION_SMARTMIPS:
11559       mips_opts.ase_smartmips = 1;
11560       break;
11561
11562     case OPTION_NO_SMARTMIPS:
11563       mips_opts.ase_smartmips = 0;
11564       break;
11565
11566     case OPTION_FIX_24K:
11567       mips_fix_24k = 1;
11568       break;
11569
11570     case OPTION_NO_FIX_24K:
11571       mips_fix_24k = 0;
11572       break;
11573
11574     case OPTION_FIX_VR4120:
11575       mips_fix_vr4120 = 1;
11576       break;
11577
11578     case OPTION_NO_FIX_VR4120:
11579       mips_fix_vr4120 = 0;
11580       break;
11581
11582     case OPTION_FIX_VR4130:
11583       mips_fix_vr4130 = 1;
11584       break;
11585
11586     case OPTION_NO_FIX_VR4130:
11587       mips_fix_vr4130 = 0;
11588       break;
11589
11590     case OPTION_RELAX_BRANCH:
11591       mips_relax_branch = 1;
11592       break;
11593
11594     case OPTION_NO_RELAX_BRANCH:
11595       mips_relax_branch = 0;
11596       break;
11597
11598     case OPTION_MSHARED:
11599       mips_in_shared = TRUE;
11600       break;
11601
11602     case OPTION_MNO_SHARED:
11603       mips_in_shared = FALSE;
11604       break;
11605
11606     case OPTION_MSYM32:
11607       mips_opts.sym32 = TRUE;
11608       break;
11609
11610     case OPTION_MNO_SYM32:
11611       mips_opts.sym32 = FALSE;
11612       break;
11613
11614 #ifdef OBJ_ELF
11615       /* When generating ELF code, we permit -KPIC and -call_shared to
11616          select SVR4_PIC, and -non_shared to select no PIC.  This is
11617          intended to be compatible with Irix 5.  */
11618     case OPTION_CALL_SHARED:
11619       if (!IS_ELF)
11620         {
11621           as_bad (_("-call_shared is supported only for ELF format"));
11622           return 0;
11623         }
11624       mips_pic = SVR4_PIC;
11625       mips_abicalls = TRUE;
11626       break;
11627
11628     case OPTION_CALL_NONPIC:
11629       if (!IS_ELF)
11630         {
11631           as_bad (_("-call_nonpic is supported only for ELF format"));
11632           return 0;
11633         }
11634       mips_pic = NO_PIC;
11635       mips_abicalls = TRUE;
11636       break;
11637
11638     case OPTION_NON_SHARED:
11639       if (!IS_ELF)
11640         {
11641           as_bad (_("-non_shared is supported only for ELF format"));
11642           return 0;
11643         }
11644       mips_pic = NO_PIC;
11645       mips_abicalls = FALSE;
11646       break;
11647
11648       /* The -xgot option tells the assembler to use 32 bit offsets
11649          when accessing the got in SVR4_PIC mode.  It is for Irix
11650          compatibility.  */
11651     case OPTION_XGOT:
11652       mips_big_got = 1;
11653       break;
11654 #endif /* OBJ_ELF */
11655
11656     case 'G':
11657       g_switch_value = atoi (arg);
11658       g_switch_seen = 1;
11659       break;
11660
11661       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11662          and -mabi=64.  */
11663     case OPTION_32:
11664       if (IS_ELF)
11665         mips_abi = O32_ABI;
11666       /* We silently ignore -32 for non-ELF targets.  This greatly
11667          simplifies the construction of the MIPS GAS test cases.  */
11668       break;
11669
11670 #ifdef OBJ_ELF
11671     case OPTION_N32:
11672       if (!IS_ELF)
11673         {
11674           as_bad (_("-n32 is supported for ELF format only"));
11675           return 0;
11676         }
11677       mips_abi = N32_ABI;
11678       break;
11679
11680     case OPTION_64:
11681       if (!IS_ELF)
11682         {
11683           as_bad (_("-64 is supported for ELF format only"));
11684           return 0;
11685         }
11686       mips_abi = N64_ABI;
11687       if (!support_64bit_objects())
11688         as_fatal (_("No compiled in support for 64 bit object file format"));
11689       break;
11690 #endif /* OBJ_ELF */
11691
11692     case OPTION_GP32:
11693       file_mips_gp32 = 1;
11694       break;
11695
11696     case OPTION_GP64:
11697       file_mips_gp32 = 0;
11698       break;
11699
11700     case OPTION_FP32:
11701       file_mips_fp32 = 1;
11702       break;
11703
11704     case OPTION_FP64:
11705       file_mips_fp32 = 0;
11706       break;
11707
11708     case OPTION_SINGLE_FLOAT:
11709       file_mips_single_float = 1;
11710       break;
11711
11712     case OPTION_DOUBLE_FLOAT:
11713       file_mips_single_float = 0;
11714       break;
11715
11716     case OPTION_SOFT_FLOAT:
11717       file_mips_soft_float = 1;
11718       break;
11719
11720     case OPTION_HARD_FLOAT:
11721       file_mips_soft_float = 0;
11722       break;
11723
11724 #ifdef OBJ_ELF
11725     case OPTION_MABI:
11726       if (!IS_ELF)
11727         {
11728           as_bad (_("-mabi is supported for ELF format only"));
11729           return 0;
11730         }
11731       if (strcmp (arg, "32") == 0)
11732         mips_abi = O32_ABI;
11733       else if (strcmp (arg, "o64") == 0)
11734         mips_abi = O64_ABI;
11735       else if (strcmp (arg, "n32") == 0)
11736         mips_abi = N32_ABI;
11737       else if (strcmp (arg, "64") == 0)
11738         {
11739           mips_abi = N64_ABI;
11740           if (! support_64bit_objects())
11741             as_fatal (_("No compiled in support for 64 bit object file "
11742                         "format"));
11743         }
11744       else if (strcmp (arg, "eabi") == 0)
11745         mips_abi = EABI_ABI;
11746       else
11747         {
11748           as_fatal (_("invalid abi -mabi=%s"), arg);
11749           return 0;
11750         }
11751       break;
11752 #endif /* OBJ_ELF */
11753
11754     case OPTION_M7000_HILO_FIX:
11755       mips_7000_hilo_fix = TRUE;
11756       break;
11757
11758     case OPTION_MNO_7000_HILO_FIX:
11759       mips_7000_hilo_fix = FALSE;
11760       break;
11761
11762 #ifdef OBJ_ELF
11763     case OPTION_MDEBUG:
11764       mips_flag_mdebug = TRUE;
11765       break;
11766
11767     case OPTION_NO_MDEBUG:
11768       mips_flag_mdebug = FALSE;
11769       break;
11770
11771     case OPTION_PDR:
11772       mips_flag_pdr = TRUE;
11773       break;
11774
11775     case OPTION_NO_PDR:
11776       mips_flag_pdr = FALSE;
11777       break;
11778
11779     case OPTION_MVXWORKS_PIC:
11780       mips_pic = VXWORKS_PIC;
11781       break;
11782 #endif /* OBJ_ELF */
11783
11784     default:
11785       return 0;
11786     }
11787
11788   return 1;
11789 }
11790 \f
11791 /* Set up globals to generate code for the ISA or processor
11792    described by INFO.  */
11793
11794 static void
11795 mips_set_architecture (const struct mips_cpu_info *info)
11796 {
11797   if (info != 0)
11798     {
11799       file_mips_arch = info->cpu;
11800       mips_opts.arch = info->cpu;
11801       mips_opts.isa = info->isa;
11802     }
11803 }
11804
11805
11806 /* Likewise for tuning.  */
11807
11808 static void
11809 mips_set_tune (const struct mips_cpu_info *info)
11810 {
11811   if (info != 0)
11812     mips_tune = info->cpu;
11813 }
11814
11815
11816 void
11817 mips_after_parse_args (void)
11818 {
11819   const struct mips_cpu_info *arch_info = 0;
11820   const struct mips_cpu_info *tune_info = 0;
11821
11822   /* GP relative stuff not working for PE */
11823   if (strncmp (TARGET_OS, "pe", 2) == 0)
11824     {
11825       if (g_switch_seen && g_switch_value != 0)
11826         as_bad (_("-G not supported in this configuration."));
11827       g_switch_value = 0;
11828     }
11829
11830   if (mips_abi == NO_ABI)
11831     mips_abi = MIPS_DEFAULT_ABI;
11832
11833   /* The following code determines the architecture and register size.
11834      Similar code was added to GCC 3.3 (see override_options() in
11835      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11836      as much as possible.  */
11837
11838   if (mips_arch_string != 0)
11839     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11840
11841   if (file_mips_isa != ISA_UNKNOWN)
11842     {
11843       /* Handle -mipsN.  At this point, file_mips_isa contains the
11844          ISA level specified by -mipsN, while arch_info->isa contains
11845          the -march selection (if any).  */
11846       if (arch_info != 0)
11847         {
11848           /* -march takes precedence over -mipsN, since it is more descriptive.
11849              There's no harm in specifying both as long as the ISA levels
11850              are the same.  */
11851           if (file_mips_isa != arch_info->isa)
11852             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11853                     mips_cpu_info_from_isa (file_mips_isa)->name,
11854                     mips_cpu_info_from_isa (arch_info->isa)->name);
11855         }
11856       else
11857         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11858     }
11859
11860   if (arch_info == 0)
11861     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11862
11863   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11864     as_bad (_("-march=%s is not compatible with the selected ABI"),
11865             arch_info->name);
11866
11867   mips_set_architecture (arch_info);
11868
11869   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11870   if (mips_tune_string != 0)
11871     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11872
11873   if (tune_info == 0)
11874     mips_set_tune (arch_info);
11875   else
11876     mips_set_tune (tune_info);
11877
11878   if (file_mips_gp32 >= 0)
11879     {
11880       /* The user specified the size of the integer registers.  Make sure
11881          it agrees with the ABI and ISA.  */
11882       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
11883         as_bad (_("-mgp64 used with a 32-bit processor"));
11884       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
11885         as_bad (_("-mgp32 used with a 64-bit ABI"));
11886       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
11887         as_bad (_("-mgp64 used with a 32-bit ABI"));
11888     }
11889   else
11890     {
11891       /* Infer the integer register size from the ABI and processor.
11892          Restrict ourselves to 32-bit registers if that's all the
11893          processor has, or if the ABI cannot handle 64-bit registers.  */
11894       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
11895                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
11896     }
11897
11898   switch (file_mips_fp32)
11899     {
11900     default:
11901     case -1:
11902       /* No user specified float register size.
11903          ??? GAS treats single-float processors as though they had 64-bit
11904          float registers (although it complains when double-precision
11905          instructions are used).  As things stand, saying they have 32-bit
11906          registers would lead to spurious "register must be even" messages.
11907          So here we assume float registers are never smaller than the
11908          integer ones.  */
11909       if (file_mips_gp32 == 0)
11910         /* 64-bit integer registers implies 64-bit float registers.  */
11911         file_mips_fp32 = 0;
11912       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
11913                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
11914         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
11915         file_mips_fp32 = 0;
11916       else
11917         /* 32-bit float registers.  */
11918         file_mips_fp32 = 1;
11919       break;
11920
11921     /* The user specified the size of the float registers.  Check if it
11922        agrees with the ABI and ISA.  */
11923     case 0:
11924       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
11925         as_bad (_("-mfp64 used with a 32-bit fpu"));
11926       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
11927                && !ISA_HAS_MXHC1 (mips_opts.isa))
11928         as_warn (_("-mfp64 used with a 32-bit ABI"));
11929       break;
11930     case 1:
11931       if (ABI_NEEDS_64BIT_REGS (mips_abi))
11932         as_warn (_("-mfp32 used with a 64-bit ABI"));
11933       break;
11934     }
11935
11936   /* End of GCC-shared inference code.  */
11937
11938   /* This flag is set when we have a 64-bit capable CPU but use only
11939      32-bit wide registers.  Note that EABI does not use it.  */
11940   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
11941       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
11942           || mips_abi == O32_ABI))
11943     mips_32bitmode = 1;
11944
11945   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
11946     as_bad (_("trap exception not supported at ISA 1"));
11947
11948   /* If the selected architecture includes support for ASEs, enable
11949      generation of code for them.  */
11950   if (mips_opts.mips16 == -1)
11951     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
11952   if (mips_opts.ase_mips3d == -1)
11953     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
11954                             && file_mips_fp32 == 0) ? 1 : 0;
11955   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
11956     as_bad (_("-mfp32 used with -mips3d"));
11957
11958   if (mips_opts.ase_mdmx == -1)
11959     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
11960                           && file_mips_fp32 == 0) ? 1 : 0;
11961   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
11962     as_bad (_("-mfp32 used with -mdmx"));
11963
11964   if (mips_opts.ase_smartmips == -1)
11965     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
11966   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
11967     as_warn (_("%s ISA does not support SmartMIPS"), 
11968              mips_cpu_info_from_isa (mips_opts.isa)->name);
11969
11970   if (mips_opts.ase_dsp == -1)
11971     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11972   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
11973     as_warn (_("%s ISA does not support DSP ASE"), 
11974              mips_cpu_info_from_isa (mips_opts.isa)->name);
11975
11976   if (mips_opts.ase_dspr2 == -1)
11977     {
11978       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
11979       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
11980     }
11981   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
11982     as_warn (_("%s ISA does not support DSP R2 ASE"),
11983              mips_cpu_info_from_isa (mips_opts.isa)->name);
11984
11985   if (mips_opts.ase_mt == -1)
11986     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
11987   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
11988     as_warn (_("%s ISA does not support MT ASE"),
11989              mips_cpu_info_from_isa (mips_opts.isa)->name);
11990
11991   file_mips_isa = mips_opts.isa;
11992   file_ase_mips16 = mips_opts.mips16;
11993   file_ase_mips3d = mips_opts.ase_mips3d;
11994   file_ase_mdmx = mips_opts.ase_mdmx;
11995   file_ase_smartmips = mips_opts.ase_smartmips;
11996   file_ase_dsp = mips_opts.ase_dsp;
11997   file_ase_dspr2 = mips_opts.ase_dspr2;
11998   file_ase_mt = mips_opts.ase_mt;
11999   mips_opts.gp32 = file_mips_gp32;
12000   mips_opts.fp32 = file_mips_fp32;
12001   mips_opts.soft_float = file_mips_soft_float;
12002   mips_opts.single_float = file_mips_single_float;
12003
12004   if (mips_flag_mdebug < 0)
12005     {
12006 #ifdef OBJ_MAYBE_ECOFF
12007       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12008         mips_flag_mdebug = 1;
12009       else
12010 #endif /* OBJ_MAYBE_ECOFF */
12011         mips_flag_mdebug = 0;
12012     }
12013 }
12014 \f
12015 void
12016 mips_init_after_args (void)
12017 {
12018   /* initialize opcodes */
12019   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12020   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12021 }
12022
12023 long
12024 md_pcrel_from (fixS *fixP)
12025 {
12026   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12027   switch (fixP->fx_r_type)
12028     {
12029     case BFD_RELOC_16_PCREL_S2:
12030     case BFD_RELOC_MIPS_JMP:
12031       /* Return the address of the delay slot.  */
12032       return addr + 4;
12033     default:
12034       /* We have no relocation type for PC relative MIPS16 instructions.  */
12035       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12036         as_bad_where (fixP->fx_file, fixP->fx_line,
12037                       _("PC relative MIPS16 instruction references a different section"));
12038       return addr;
12039     }
12040 }
12041
12042 /* This is called before the symbol table is processed.  In order to
12043    work with gcc when using mips-tfile, we must keep all local labels.
12044    However, in other cases, we want to discard them.  If we were
12045    called with -g, but we didn't see any debugging information, it may
12046    mean that gcc is smuggling debugging information through to
12047    mips-tfile, in which case we must generate all local labels.  */
12048
12049 void
12050 mips_frob_file_before_adjust (void)
12051 {
12052 #ifndef NO_ECOFF_DEBUGGING
12053   if (ECOFF_DEBUGGING
12054       && mips_debug != 0
12055       && ! ecoff_debugging_seen)
12056     flag_keep_locals = 1;
12057 #endif
12058 }
12059
12060 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12061    the corresponding LO16 reloc.  This is called before md_apply_fix and
12062    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12063    relocation operators.
12064
12065    For our purposes, a %lo() expression matches a %got() or %hi()
12066    expression if:
12067
12068       (a) it refers to the same symbol; and
12069       (b) the offset applied in the %lo() expression is no lower than
12070           the offset applied in the %got() or %hi().
12071
12072    (b) allows us to cope with code like:
12073
12074         lui     $4,%hi(foo)
12075         lh      $4,%lo(foo+2)($4)
12076
12077    ...which is legal on RELA targets, and has a well-defined behaviour
12078    if the user knows that adding 2 to "foo" will not induce a carry to
12079    the high 16 bits.
12080
12081    When several %lo()s match a particular %got() or %hi(), we use the
12082    following rules to distinguish them:
12083
12084      (1) %lo()s with smaller offsets are a better match than %lo()s with
12085          higher offsets.
12086
12087      (2) %lo()s with no matching %got() or %hi() are better than those
12088          that already have a matching %got() or %hi().
12089
12090      (3) later %lo()s are better than earlier %lo()s.
12091
12092    These rules are applied in order.
12093
12094    (1) means, among other things, that %lo()s with identical offsets are
12095    chosen if they exist.
12096
12097    (2) means that we won't associate several high-part relocations with
12098    the same low-part relocation unless there's no alternative.  Having
12099    several high parts for the same low part is a GNU extension; this rule
12100    allows careful users to avoid it.
12101
12102    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12103    with the last high-part relocation being at the front of the list.
12104    It therefore makes sense to choose the last matching low-part
12105    relocation, all other things being equal.  It's also easier
12106    to code that way.  */
12107
12108 void
12109 mips_frob_file (void)
12110 {
12111   struct mips_hi_fixup *l;
12112   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12113
12114   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12115     {
12116       segment_info_type *seginfo;
12117       bfd_boolean matched_lo_p;
12118       fixS **hi_pos, **lo_pos, **pos;
12119
12120       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12121
12122       /* If a GOT16 relocation turns out to be against a global symbol,
12123          there isn't supposed to be a matching LO.  */
12124       if (got16_reloc_p (l->fixp->fx_r_type)
12125           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12126         continue;
12127
12128       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12129       if (fixup_has_matching_lo_p (l->fixp))
12130         continue;
12131
12132       seginfo = seg_info (l->seg);
12133
12134       /* Set HI_POS to the position of this relocation in the chain.
12135          Set LO_POS to the position of the chosen low-part relocation.
12136          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12137          relocation that matches an immediately-preceding high-part
12138          relocation.  */
12139       hi_pos = NULL;
12140       lo_pos = NULL;
12141       matched_lo_p = FALSE;
12142       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12143
12144       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12145         {
12146           if (*pos == l->fixp)
12147             hi_pos = pos;
12148
12149           if ((*pos)->fx_r_type == looking_for_rtype
12150               && (*pos)->fx_addsy == l->fixp->fx_addsy
12151               && (*pos)->fx_offset >= l->fixp->fx_offset
12152               && (lo_pos == NULL
12153                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12154                   || (!matched_lo_p
12155                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12156             lo_pos = pos;
12157
12158           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12159                           && fixup_has_matching_lo_p (*pos));
12160         }
12161
12162       /* If we found a match, remove the high-part relocation from its
12163          current position and insert it before the low-part relocation.
12164          Make the offsets match so that fixup_has_matching_lo_p()
12165          will return true.
12166
12167          We don't warn about unmatched high-part relocations since some
12168          versions of gcc have been known to emit dead "lui ...%hi(...)"
12169          instructions.  */
12170       if (lo_pos != NULL)
12171         {
12172           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12173           if (l->fixp->fx_next != *lo_pos)
12174             {
12175               *hi_pos = l->fixp->fx_next;
12176               l->fixp->fx_next = *lo_pos;
12177               *lo_pos = l->fixp;
12178             }
12179         }
12180     }
12181 }
12182
12183 /* We may have combined relocations without symbols in the N32/N64 ABI.
12184    We have to prevent gas from dropping them.  */
12185
12186 int
12187 mips_force_relocation (fixS *fixp)
12188 {
12189   if (generic_force_reloc (fixp))
12190     return 1;
12191
12192   if (HAVE_NEWABI
12193       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12194       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12195           || hi16_reloc_p (fixp->fx_r_type)
12196           || lo16_reloc_p (fixp->fx_r_type)))
12197     return 1;
12198
12199   return 0;
12200 }
12201
12202 /* Apply a fixup to the object file.  */
12203
12204 void
12205 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12206 {
12207   bfd_byte *buf;
12208   long insn;
12209   reloc_howto_type *howto;
12210
12211   /* We ignore generic BFD relocations we don't know about.  */
12212   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12213   if (! howto)
12214     return;
12215
12216   gas_assert (fixP->fx_size == 4
12217           || fixP->fx_r_type == BFD_RELOC_16
12218           || fixP->fx_r_type == BFD_RELOC_64
12219           || fixP->fx_r_type == BFD_RELOC_CTOR
12220           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12221           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12222           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12223           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12224
12225   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12226
12227   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12228
12229   /* Don't treat parts of a composite relocation as done.  There are two
12230      reasons for this:
12231
12232      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12233          should nevertheless be emitted if the first part is.
12234
12235      (2) In normal usage, composite relocations are never assembly-time
12236          constants.  The easiest way of dealing with the pathological
12237          exceptions is to generate a relocation against STN_UNDEF and
12238          leave everything up to the linker.  */
12239   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12240     fixP->fx_done = 1;
12241
12242   switch (fixP->fx_r_type)
12243     {
12244     case BFD_RELOC_MIPS_TLS_GD:
12245     case BFD_RELOC_MIPS_TLS_LDM:
12246     case BFD_RELOC_MIPS_TLS_DTPREL32:
12247     case BFD_RELOC_MIPS_TLS_DTPREL64:
12248     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12249     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12250     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12251     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12252     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12253       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12254       /* fall through */
12255
12256     case BFD_RELOC_MIPS_JMP:
12257     case BFD_RELOC_MIPS_SHIFT5:
12258     case BFD_RELOC_MIPS_SHIFT6:
12259     case BFD_RELOC_MIPS_GOT_DISP:
12260     case BFD_RELOC_MIPS_GOT_PAGE:
12261     case BFD_RELOC_MIPS_GOT_OFST:
12262     case BFD_RELOC_MIPS_SUB:
12263     case BFD_RELOC_MIPS_INSERT_A:
12264     case BFD_RELOC_MIPS_INSERT_B:
12265     case BFD_RELOC_MIPS_DELETE:
12266     case BFD_RELOC_MIPS_HIGHEST:
12267     case BFD_RELOC_MIPS_HIGHER:
12268     case BFD_RELOC_MIPS_SCN_DISP:
12269     case BFD_RELOC_MIPS_REL16:
12270     case BFD_RELOC_MIPS_RELGOT:
12271     case BFD_RELOC_MIPS_JALR:
12272     case BFD_RELOC_HI16:
12273     case BFD_RELOC_HI16_S:
12274     case BFD_RELOC_GPREL16:
12275     case BFD_RELOC_MIPS_LITERAL:
12276     case BFD_RELOC_MIPS_CALL16:
12277     case BFD_RELOC_MIPS_GOT16:
12278     case BFD_RELOC_GPREL32:
12279     case BFD_RELOC_MIPS_GOT_HI16:
12280     case BFD_RELOC_MIPS_GOT_LO16:
12281     case BFD_RELOC_MIPS_CALL_HI16:
12282     case BFD_RELOC_MIPS_CALL_LO16:
12283     case BFD_RELOC_MIPS16_GPREL:
12284     case BFD_RELOC_MIPS16_GOT16:
12285     case BFD_RELOC_MIPS16_CALL16:
12286     case BFD_RELOC_MIPS16_HI16:
12287     case BFD_RELOC_MIPS16_HI16_S:
12288     case BFD_RELOC_MIPS16_JMP:
12289       /* Nothing needed to do.  The value comes from the reloc entry.  */
12290       break;
12291
12292     case BFD_RELOC_64:
12293       /* This is handled like BFD_RELOC_32, but we output a sign
12294          extended value if we are only 32 bits.  */
12295       if (fixP->fx_done)
12296         {
12297           if (8 <= sizeof (valueT))
12298             md_number_to_chars ((char *) buf, *valP, 8);
12299           else
12300             {
12301               valueT hiv;
12302
12303               if ((*valP & 0x80000000) != 0)
12304                 hiv = 0xffffffff;
12305               else
12306                 hiv = 0;
12307               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12308                                   *valP, 4);
12309               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12310                                   hiv, 4);
12311             }
12312         }
12313       break;
12314
12315     case BFD_RELOC_RVA:
12316     case BFD_RELOC_32:
12317     case BFD_RELOC_16:
12318       /* If we are deleting this reloc entry, we must fill in the
12319          value now.  This can happen if we have a .word which is not
12320          resolved when it appears but is later defined.  */
12321       if (fixP->fx_done)
12322         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12323       break;
12324
12325     case BFD_RELOC_LO16:
12326     case BFD_RELOC_MIPS16_LO16:
12327       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12328          may be safe to remove, but if so it's not obvious.  */
12329       /* When handling an embedded PIC switch statement, we can wind
12330          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12331       if (fixP->fx_done)
12332         {
12333           if (*valP + 0x8000 > 0xffff)
12334             as_bad_where (fixP->fx_file, fixP->fx_line,
12335                           _("relocation overflow"));
12336           if (target_big_endian)
12337             buf += 2;
12338           md_number_to_chars ((char *) buf, *valP, 2);
12339         }
12340       break;
12341
12342     case BFD_RELOC_16_PCREL_S2:
12343       if ((*valP & 0x3) != 0)
12344         as_bad_where (fixP->fx_file, fixP->fx_line,
12345                       _("Branch to misaligned address (%lx)"), (long) *valP);
12346
12347       /* We need to save the bits in the instruction since fixup_segment()
12348          might be deleting the relocation entry (i.e., a branch within
12349          the current segment).  */
12350       if (! fixP->fx_done)
12351         break;
12352
12353       /* Update old instruction data.  */
12354       if (target_big_endian)
12355         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12356       else
12357         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12358
12359       if (*valP + 0x20000 <= 0x3ffff)
12360         {
12361           insn |= (*valP >> 2) & 0xffff;
12362           md_number_to_chars ((char *) buf, insn, 4);
12363         }
12364       else if (mips_pic == NO_PIC
12365                && fixP->fx_done
12366                && fixP->fx_frag->fr_address >= text_section->vma
12367                && (fixP->fx_frag->fr_address
12368                    < text_section->vma + bfd_get_section_size (text_section))
12369                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12370                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12371                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12372         {
12373           /* The branch offset is too large.  If this is an
12374              unconditional branch, and we are not generating PIC code,
12375              we can convert it to an absolute jump instruction.  */
12376           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12377             insn = 0x0c000000;  /* jal */
12378           else
12379             insn = 0x08000000;  /* j */
12380           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12381           fixP->fx_done = 0;
12382           fixP->fx_addsy = section_symbol (text_section);
12383           *valP += md_pcrel_from (fixP);
12384           md_number_to_chars ((char *) buf, insn, 4);
12385         }
12386       else
12387         {
12388           /* If we got here, we have branch-relaxation disabled,
12389              and there's nothing we can do to fix this instruction
12390              without turning it into a longer sequence.  */
12391           as_bad_where (fixP->fx_file, fixP->fx_line,
12392                         _("Branch out of range"));
12393         }
12394       break;
12395
12396     case BFD_RELOC_VTABLE_INHERIT:
12397       fixP->fx_done = 0;
12398       if (fixP->fx_addsy
12399           && !S_IS_DEFINED (fixP->fx_addsy)
12400           && !S_IS_WEAK (fixP->fx_addsy))
12401         S_SET_WEAK (fixP->fx_addsy);
12402       break;
12403
12404     case BFD_RELOC_VTABLE_ENTRY:
12405       fixP->fx_done = 0;
12406       break;
12407
12408     default:
12409       internalError ();
12410     }
12411
12412   /* Remember value for tc_gen_reloc.  */
12413   fixP->fx_addnumber = *valP;
12414 }
12415
12416 static symbolS *
12417 get_symbol (void)
12418 {
12419   int c;
12420   char *name;
12421   symbolS *p;
12422
12423   name = input_line_pointer;
12424   c = get_symbol_end ();
12425   p = (symbolS *) symbol_find_or_make (name);
12426   *input_line_pointer = c;
12427   return p;
12428 }
12429
12430 /* Align the current frag to a given power of two.  If a particular
12431    fill byte should be used, FILL points to an integer that contains
12432    that byte, otherwise FILL is null.
12433
12434    The MIPS assembler also automatically adjusts any preceding
12435    label.  */
12436
12437 static void
12438 mips_align (int to, int *fill, symbolS *label)
12439 {
12440   mips_emit_delays ();
12441   mips_record_mips16_mode ();
12442   if (fill == NULL && subseg_text_p (now_seg))
12443     frag_align_code (to, 0);
12444   else
12445     frag_align (to, fill ? *fill : 0, 0);
12446   record_alignment (now_seg, to);
12447   if (label != NULL)
12448     {
12449       gas_assert (S_GET_SEGMENT (label) == now_seg);
12450       symbol_set_frag (label, frag_now);
12451       S_SET_VALUE (label, (valueT) frag_now_fix ());
12452     }
12453 }
12454
12455 /* Align to a given power of two.  .align 0 turns off the automatic
12456    alignment used by the data creating pseudo-ops.  */
12457
12458 static void
12459 s_align (int x ATTRIBUTE_UNUSED)
12460 {
12461   int temp, fill_value, *fill_ptr;
12462   long max_alignment = 28;
12463
12464   /* o Note that the assembler pulls down any immediately preceding label
12465        to the aligned address.
12466      o It's not documented but auto alignment is reinstated by
12467        a .align pseudo instruction.
12468      o Note also that after auto alignment is turned off the mips assembler
12469        issues an error on attempt to assemble an improperly aligned data item.
12470        We don't.  */
12471
12472   temp = get_absolute_expression ();
12473   if (temp > max_alignment)
12474     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12475   else if (temp < 0)
12476     {
12477       as_warn (_("Alignment negative: 0 assumed."));
12478       temp = 0;
12479     }
12480   if (*input_line_pointer == ',')
12481     {
12482       ++input_line_pointer;
12483       fill_value = get_absolute_expression ();
12484       fill_ptr = &fill_value;
12485     }
12486   else
12487     fill_ptr = 0;
12488   if (temp)
12489     {
12490       segment_info_type *si = seg_info (now_seg);
12491       struct insn_label_list *l = si->label_list;
12492       /* Auto alignment should be switched on by next section change.  */
12493       auto_align = 1;
12494       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12495     }
12496   else
12497     {
12498       auto_align = 0;
12499     }
12500
12501   demand_empty_rest_of_line ();
12502 }
12503
12504 static void
12505 s_change_sec (int sec)
12506 {
12507   segT seg;
12508
12509 #ifdef OBJ_ELF
12510   /* The ELF backend needs to know that we are changing sections, so
12511      that .previous works correctly.  We could do something like check
12512      for an obj_section_change_hook macro, but that might be confusing
12513      as it would not be appropriate to use it in the section changing
12514      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12515      This should be cleaner, somehow.  */
12516   if (IS_ELF)
12517     obj_elf_section_change_hook ();
12518 #endif
12519
12520   mips_emit_delays ();
12521
12522   switch (sec)
12523     {
12524     case 't':
12525       s_text (0);
12526       break;
12527     case 'd':
12528       s_data (0);
12529       break;
12530     case 'b':
12531       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12532       demand_empty_rest_of_line ();
12533       break;
12534
12535     case 'r':
12536       seg = subseg_new (RDATA_SECTION_NAME,
12537                         (subsegT) get_absolute_expression ());
12538       if (IS_ELF)
12539         {
12540           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12541                                                   | SEC_READONLY | SEC_RELOC
12542                                                   | SEC_DATA));
12543           if (strncmp (TARGET_OS, "elf", 3) != 0)
12544             record_alignment (seg, 4);
12545         }
12546       demand_empty_rest_of_line ();
12547       break;
12548
12549     case 's':
12550       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12551       if (IS_ELF)
12552         {
12553           bfd_set_section_flags (stdoutput, seg,
12554                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12555           if (strncmp (TARGET_OS, "elf", 3) != 0)
12556             record_alignment (seg, 4);
12557         }
12558       demand_empty_rest_of_line ();
12559       break;
12560     }
12561
12562   auto_align = 1;
12563 }
12564
12565 void
12566 s_change_section (int ignore ATTRIBUTE_UNUSED)
12567 {
12568 #ifdef OBJ_ELF
12569   char *section_name;
12570   char c;
12571   char next_c = 0;
12572   int section_type;
12573   int section_flag;
12574   int section_entry_size;
12575   int section_alignment;
12576
12577   if (!IS_ELF)
12578     return;
12579
12580   section_name = input_line_pointer;
12581   c = get_symbol_end ();
12582   if (c)
12583     next_c = *(input_line_pointer + 1);
12584
12585   /* Do we have .section Name<,"flags">?  */
12586   if (c != ',' || (c == ',' && next_c == '"'))
12587     {
12588       /* just after name is now '\0'.  */
12589       *input_line_pointer = c;
12590       input_line_pointer = section_name;
12591       obj_elf_section (ignore);
12592       return;
12593     }
12594   input_line_pointer++;
12595
12596   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12597   if (c == ',')
12598     section_type = get_absolute_expression ();
12599   else
12600     section_type = 0;
12601   if (*input_line_pointer++ == ',')
12602     section_flag = get_absolute_expression ();
12603   else
12604     section_flag = 0;
12605   if (*input_line_pointer++ == ',')
12606     section_entry_size = get_absolute_expression ();
12607   else
12608     section_entry_size = 0;
12609   if (*input_line_pointer++ == ',')
12610     section_alignment = get_absolute_expression ();
12611   else
12612     section_alignment = 0;
12613
12614   section_name = xstrdup (section_name);
12615
12616   /* When using the generic form of .section (as implemented by obj-elf.c),
12617      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12618      traditionally had to fall back on the more common @progbits instead.
12619
12620      There's nothing really harmful in this, since bfd will correct
12621      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12622      means that, for backwards compatibility, the special_section entries
12623      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12624
12625      Even so, we shouldn't force users of the MIPS .section syntax to
12626      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12627      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12628      generic type-checking code.  */
12629   if (section_type == SHT_MIPS_DWARF)
12630     section_type = SHT_PROGBITS;
12631
12632   obj_elf_change_section (section_name, section_type, section_flag,
12633                           section_entry_size, 0, 0, 0);
12634
12635   if (now_seg->name != section_name)
12636     free (section_name);
12637 #endif /* OBJ_ELF */
12638 }
12639
12640 void
12641 mips_enable_auto_align (void)
12642 {
12643   auto_align = 1;
12644 }
12645
12646 static void
12647 s_cons (int log_size)
12648 {
12649   segment_info_type *si = seg_info (now_seg);
12650   struct insn_label_list *l = si->label_list;
12651   symbolS *label;
12652
12653   label = l != NULL ? l->label : NULL;
12654   mips_emit_delays ();
12655   if (log_size > 0 && auto_align)
12656     mips_align (log_size, 0, label);
12657   mips_clear_insn_labels ();
12658   cons (1 << log_size);
12659 }
12660
12661 static void
12662 s_float_cons (int type)
12663 {
12664   segment_info_type *si = seg_info (now_seg);
12665   struct insn_label_list *l = si->label_list;
12666   symbolS *label;
12667
12668   label = l != NULL ? l->label : NULL;
12669
12670   mips_emit_delays ();
12671
12672   if (auto_align)
12673     {
12674       if (type == 'd')
12675         mips_align (3, 0, label);
12676       else
12677         mips_align (2, 0, label);
12678     }
12679
12680   mips_clear_insn_labels ();
12681
12682   float_cons (type);
12683 }
12684
12685 /* Handle .globl.  We need to override it because on Irix 5 you are
12686    permitted to say
12687        .globl foo .text
12688    where foo is an undefined symbol, to mean that foo should be
12689    considered to be the address of a function.  */
12690
12691 static void
12692 s_mips_globl (int x ATTRIBUTE_UNUSED)
12693 {
12694   char *name;
12695   int c;
12696   symbolS *symbolP;
12697   flagword flag;
12698
12699   do
12700     {
12701       name = input_line_pointer;
12702       c = get_symbol_end ();
12703       symbolP = symbol_find_or_make (name);
12704       S_SET_EXTERNAL (symbolP);
12705
12706       *input_line_pointer = c;
12707       SKIP_WHITESPACE ();
12708
12709       /* On Irix 5, every global symbol that is not explicitly labelled as
12710          being a function is apparently labelled as being an object.  */
12711       flag = BSF_OBJECT;
12712
12713       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12714           && (*input_line_pointer != ','))
12715         {
12716           char *secname;
12717           asection *sec;
12718
12719           secname = input_line_pointer;
12720           c = get_symbol_end ();
12721           sec = bfd_get_section_by_name (stdoutput, secname);
12722           if (sec == NULL)
12723             as_bad (_("%s: no such section"), secname);
12724           *input_line_pointer = c;
12725
12726           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12727             flag = BSF_FUNCTION;
12728         }
12729
12730       symbol_get_bfdsym (symbolP)->flags |= flag;
12731
12732       c = *input_line_pointer;
12733       if (c == ',')
12734         {
12735           input_line_pointer++;
12736           SKIP_WHITESPACE ();
12737           if (is_end_of_line[(unsigned char) *input_line_pointer])
12738             c = '\n';
12739         }
12740     }
12741   while (c == ',');
12742
12743   demand_empty_rest_of_line ();
12744 }
12745
12746 static void
12747 s_option (int x ATTRIBUTE_UNUSED)
12748 {
12749   char *opt;
12750   char c;
12751
12752   opt = input_line_pointer;
12753   c = get_symbol_end ();
12754
12755   if (*opt == 'O')
12756     {
12757       /* FIXME: What does this mean?  */
12758     }
12759   else if (strncmp (opt, "pic", 3) == 0)
12760     {
12761       int i;
12762
12763       i = atoi (opt + 3);
12764       if (i == 0)
12765         mips_pic = NO_PIC;
12766       else if (i == 2)
12767         {
12768         mips_pic = SVR4_PIC;
12769           mips_abicalls = TRUE;
12770         }
12771       else
12772         as_bad (_(".option pic%d not supported"), i);
12773
12774       if (mips_pic == SVR4_PIC)
12775         {
12776           if (g_switch_seen && g_switch_value != 0)
12777             as_warn (_("-G may not be used with SVR4 PIC code"));
12778           g_switch_value = 0;
12779           bfd_set_gp_size (stdoutput, 0);
12780         }
12781     }
12782   else
12783     as_warn (_("Unrecognized option \"%s\""), opt);
12784
12785   *input_line_pointer = c;
12786   demand_empty_rest_of_line ();
12787 }
12788
12789 /* This structure is used to hold a stack of .set values.  */
12790
12791 struct mips_option_stack
12792 {
12793   struct mips_option_stack *next;
12794   struct mips_set_options options;
12795 };
12796
12797 static struct mips_option_stack *mips_opts_stack;
12798
12799 /* Handle the .set pseudo-op.  */
12800
12801 static void
12802 s_mipsset (int x ATTRIBUTE_UNUSED)
12803 {
12804   char *name = input_line_pointer, ch;
12805
12806   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12807     ++input_line_pointer;
12808   ch = *input_line_pointer;
12809   *input_line_pointer = '\0';
12810
12811   if (strcmp (name, "reorder") == 0)
12812     {
12813       if (mips_opts.noreorder)
12814         end_noreorder ();
12815     }
12816   else if (strcmp (name, "noreorder") == 0)
12817     {
12818       if (!mips_opts.noreorder)
12819         start_noreorder ();
12820     }
12821   else if (strncmp (name, "at=", 3) == 0)
12822     {
12823       char *s = name + 3;
12824
12825       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12826         as_bad (_("Unrecognized register name `%s'"), s);
12827     }
12828   else if (strcmp (name, "at") == 0)
12829     {
12830       mips_opts.at = ATREG;
12831     }
12832   else if (strcmp (name, "noat") == 0)
12833     {
12834       mips_opts.at = ZERO;
12835     }
12836   else if (strcmp (name, "macro") == 0)
12837     {
12838       mips_opts.warn_about_macros = 0;
12839     }
12840   else if (strcmp (name, "nomacro") == 0)
12841     {
12842       if (mips_opts.noreorder == 0)
12843         as_bad (_("`noreorder' must be set before `nomacro'"));
12844       mips_opts.warn_about_macros = 1;
12845     }
12846   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12847     {
12848       mips_opts.nomove = 0;
12849     }
12850   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12851     {
12852       mips_opts.nomove = 1;
12853     }
12854   else if (strcmp (name, "bopt") == 0)
12855     {
12856       mips_opts.nobopt = 0;
12857     }
12858   else if (strcmp (name, "nobopt") == 0)
12859     {
12860       mips_opts.nobopt = 1;
12861     }
12862   else if (strcmp (name, "gp=default") == 0)
12863     mips_opts.gp32 = file_mips_gp32;
12864   else if (strcmp (name, "gp=32") == 0)
12865     mips_opts.gp32 = 1;
12866   else if (strcmp (name, "gp=64") == 0)
12867     {
12868       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
12869         as_warn (_("%s isa does not support 64-bit registers"),
12870                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12871       mips_opts.gp32 = 0;
12872     }
12873   else if (strcmp (name, "fp=default") == 0)
12874     mips_opts.fp32 = file_mips_fp32;
12875   else if (strcmp (name, "fp=32") == 0)
12876     mips_opts.fp32 = 1;
12877   else if (strcmp (name, "fp=64") == 0)
12878     {
12879       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12880         as_warn (_("%s isa does not support 64-bit floating point registers"),
12881                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12882       mips_opts.fp32 = 0;
12883     }
12884   else if (strcmp (name, "softfloat") == 0)
12885     mips_opts.soft_float = 1;
12886   else if (strcmp (name, "hardfloat") == 0)
12887     mips_opts.soft_float = 0;
12888   else if (strcmp (name, "singlefloat") == 0)
12889     mips_opts.single_float = 1;
12890   else if (strcmp (name, "doublefloat") == 0)
12891     mips_opts.single_float = 0;
12892   else if (strcmp (name, "mips16") == 0
12893            || strcmp (name, "MIPS-16") == 0)
12894     mips_opts.mips16 = 1;
12895   else if (strcmp (name, "nomips16") == 0
12896            || strcmp (name, "noMIPS-16") == 0)
12897     mips_opts.mips16 = 0;
12898   else if (strcmp (name, "smartmips") == 0)
12899     {
12900       if (!ISA_SUPPORTS_SMARTMIPS)
12901         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
12902                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12903       mips_opts.ase_smartmips = 1;
12904     }
12905   else if (strcmp (name, "nosmartmips") == 0)
12906     mips_opts.ase_smartmips = 0;
12907   else if (strcmp (name, "mips3d") == 0)
12908     mips_opts.ase_mips3d = 1;
12909   else if (strcmp (name, "nomips3d") == 0)
12910     mips_opts.ase_mips3d = 0;
12911   else if (strcmp (name, "mdmx") == 0)
12912     mips_opts.ase_mdmx = 1;
12913   else if (strcmp (name, "nomdmx") == 0)
12914     mips_opts.ase_mdmx = 0;
12915   else if (strcmp (name, "dsp") == 0)
12916     {
12917       if (!ISA_SUPPORTS_DSP_ASE)
12918         as_warn (_("%s ISA does not support DSP ASE"), 
12919                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12920       mips_opts.ase_dsp = 1;
12921       mips_opts.ase_dspr2 = 0;
12922     }
12923   else if (strcmp (name, "nodsp") == 0)
12924     {
12925       mips_opts.ase_dsp = 0;
12926       mips_opts.ase_dspr2 = 0;
12927     }
12928   else if (strcmp (name, "dspr2") == 0)
12929     {
12930       if (!ISA_SUPPORTS_DSPR2_ASE)
12931         as_warn (_("%s ISA does not support DSP R2 ASE"),
12932                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12933       mips_opts.ase_dspr2 = 1;
12934       mips_opts.ase_dsp = 1;
12935     }
12936   else if (strcmp (name, "nodspr2") == 0)
12937     {
12938       mips_opts.ase_dspr2 = 0;
12939       mips_opts.ase_dsp = 0;
12940     }
12941   else if (strcmp (name, "mt") == 0)
12942     {
12943       if (!ISA_SUPPORTS_MT_ASE)
12944         as_warn (_("%s ISA does not support MT ASE"), 
12945                  mips_cpu_info_from_isa (mips_opts.isa)->name);
12946       mips_opts.ase_mt = 1;
12947     }
12948   else if (strcmp (name, "nomt") == 0)
12949     mips_opts.ase_mt = 0;
12950   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
12951     {
12952       int reset = 0;
12953
12954       /* Permit the user to change the ISA and architecture on the fly.
12955          Needless to say, misuse can cause serious problems.  */
12956       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
12957         {
12958           reset = 1;
12959           mips_opts.isa = file_mips_isa;
12960           mips_opts.arch = file_mips_arch;
12961         }
12962       else if (strncmp (name, "arch=", 5) == 0)
12963         {
12964           const struct mips_cpu_info *p;
12965
12966           p = mips_parse_cpu("internal use", name + 5);
12967           if (!p)
12968             as_bad (_("unknown architecture %s"), name + 5);
12969           else
12970             {
12971               mips_opts.arch = p->cpu;
12972               mips_opts.isa = p->isa;
12973             }
12974         }
12975       else if (strncmp (name, "mips", 4) == 0)
12976         {
12977           const struct mips_cpu_info *p;
12978
12979           p = mips_parse_cpu("internal use", name);
12980           if (!p)
12981             as_bad (_("unknown ISA level %s"), name + 4);
12982           else
12983             {
12984               mips_opts.arch = p->cpu;
12985               mips_opts.isa = p->isa;
12986             }
12987         }
12988       else
12989         as_bad (_("unknown ISA or architecture %s"), name);
12990
12991       switch (mips_opts.isa)
12992         {
12993         case  0:
12994           break;
12995         case ISA_MIPS1:
12996         case ISA_MIPS2:
12997         case ISA_MIPS32:
12998         case ISA_MIPS32R2:
12999           mips_opts.gp32 = 1;
13000           mips_opts.fp32 = 1;
13001           break;
13002         case ISA_MIPS3:
13003         case ISA_MIPS4:
13004         case ISA_MIPS5:
13005         case ISA_MIPS64:
13006         case ISA_MIPS64R2:
13007           mips_opts.gp32 = 0;
13008           mips_opts.fp32 = 0;
13009           break;
13010         default:
13011           as_bad (_("unknown ISA level %s"), name + 4);
13012           break;
13013         }
13014       if (reset)
13015         {
13016           mips_opts.gp32 = file_mips_gp32;
13017           mips_opts.fp32 = file_mips_fp32;
13018         }
13019     }
13020   else if (strcmp (name, "autoextend") == 0)
13021     mips_opts.noautoextend = 0;
13022   else if (strcmp (name, "noautoextend") == 0)
13023     mips_opts.noautoextend = 1;
13024   else if (strcmp (name, "push") == 0)
13025     {
13026       struct mips_option_stack *s;
13027
13028       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13029       s->next = mips_opts_stack;
13030       s->options = mips_opts;
13031       mips_opts_stack = s;
13032     }
13033   else if (strcmp (name, "pop") == 0)
13034     {
13035       struct mips_option_stack *s;
13036
13037       s = mips_opts_stack;
13038       if (s == NULL)
13039         as_bad (_(".set pop with no .set push"));
13040       else
13041         {
13042           /* If we're changing the reorder mode we need to handle
13043              delay slots correctly.  */
13044           if (s->options.noreorder && ! mips_opts.noreorder)
13045             start_noreorder ();
13046           else if (! s->options.noreorder && mips_opts.noreorder)
13047             end_noreorder ();
13048
13049           mips_opts = s->options;
13050           mips_opts_stack = s->next;
13051           free (s);
13052         }
13053     }
13054   else if (strcmp (name, "sym32") == 0)
13055     mips_opts.sym32 = TRUE;
13056   else if (strcmp (name, "nosym32") == 0)
13057     mips_opts.sym32 = FALSE;
13058   else if (strchr (name, ','))
13059     {
13060       /* Generic ".set" directive; use the generic handler.  */
13061       *input_line_pointer = ch;
13062       input_line_pointer = name;
13063       s_set (0);
13064       return;
13065     }
13066   else
13067     {
13068       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13069     }
13070   *input_line_pointer = ch;
13071   demand_empty_rest_of_line ();
13072 }
13073
13074 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13075    .option pic2.  It means to generate SVR4 PIC calls.  */
13076
13077 static void
13078 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13079 {
13080   mips_pic = SVR4_PIC;
13081   mips_abicalls = TRUE;
13082
13083   if (g_switch_seen && g_switch_value != 0)
13084     as_warn (_("-G may not be used with SVR4 PIC code"));
13085   g_switch_value = 0;
13086
13087   bfd_set_gp_size (stdoutput, 0);
13088   demand_empty_rest_of_line ();
13089 }
13090
13091 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13092    PIC code.  It sets the $gp register for the function based on the
13093    function address, which is in the register named in the argument.
13094    This uses a relocation against _gp_disp, which is handled specially
13095    by the linker.  The result is:
13096         lui     $gp,%hi(_gp_disp)
13097         addiu   $gp,$gp,%lo(_gp_disp)
13098         addu    $gp,$gp,.cpload argument
13099    The .cpload argument is normally $25 == $t9.
13100
13101    The -mno-shared option changes this to:
13102         lui     $gp,%hi(__gnu_local_gp)
13103         addiu   $gp,$gp,%lo(__gnu_local_gp)
13104    and the argument is ignored.  This saves an instruction, but the
13105    resulting code is not position independent; it uses an absolute
13106    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13107    can go into an ordinary executable, but not into a shared library.  */
13108
13109 static void
13110 s_cpload (int ignore ATTRIBUTE_UNUSED)
13111 {
13112   expressionS ex;
13113   int reg;
13114   int in_shared;
13115
13116   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13117      .cpload is ignored.  */
13118   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13119     {
13120       s_ignore (0);
13121       return;
13122     }
13123
13124   /* .cpload should be in a .set noreorder section.  */
13125   if (mips_opts.noreorder == 0)
13126     as_warn (_(".cpload not in noreorder section"));
13127
13128   reg = tc_get_register (0);
13129
13130   /* If we need to produce a 64-bit address, we are better off using
13131      the default instruction sequence.  */
13132   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13133
13134   ex.X_op = O_symbol;
13135   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13136                                          "__gnu_local_gp");
13137   ex.X_op_symbol = NULL;
13138   ex.X_add_number = 0;
13139
13140   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13141   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13142
13143   macro_start ();
13144   macro_build_lui (&ex, mips_gp_register);
13145   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13146                mips_gp_register, BFD_RELOC_LO16);
13147   if (in_shared)
13148     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13149                  mips_gp_register, reg);
13150   macro_end ();
13151
13152   demand_empty_rest_of_line ();
13153 }
13154
13155 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13156      .cpsetup $reg1, offset|$reg2, label
13157
13158    If offset is given, this results in:
13159      sd         $gp, offset($sp)
13160      lui        $gp, %hi(%neg(%gp_rel(label)))
13161      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13162      daddu      $gp, $gp, $reg1
13163
13164    If $reg2 is given, this results in:
13165      daddu      $reg2, $gp, $0
13166      lui        $gp, %hi(%neg(%gp_rel(label)))
13167      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13168      daddu      $gp, $gp, $reg1
13169    $reg1 is normally $25 == $t9.
13170
13171    The -mno-shared option replaces the last three instructions with
13172         lui     $gp,%hi(_gp)
13173         addiu   $gp,$gp,%lo(_gp)  */
13174
13175 static void
13176 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13177 {
13178   expressionS ex_off;
13179   expressionS ex_sym;
13180   int reg1;
13181
13182   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13183      We also need NewABI support.  */
13184   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13185     {
13186       s_ignore (0);
13187       return;
13188     }
13189
13190   reg1 = tc_get_register (0);
13191   SKIP_WHITESPACE ();
13192   if (*input_line_pointer != ',')
13193     {
13194       as_bad (_("missing argument separator ',' for .cpsetup"));
13195       return;
13196     }
13197   else
13198     ++input_line_pointer;
13199   SKIP_WHITESPACE ();
13200   if (*input_line_pointer == '$')
13201     {
13202       mips_cpreturn_register = tc_get_register (0);
13203       mips_cpreturn_offset = -1;
13204     }
13205   else
13206     {
13207       mips_cpreturn_offset = get_absolute_expression ();
13208       mips_cpreturn_register = -1;
13209     }
13210   SKIP_WHITESPACE ();
13211   if (*input_line_pointer != ',')
13212     {
13213       as_bad (_("missing argument separator ',' for .cpsetup"));
13214       return;
13215     }
13216   else
13217     ++input_line_pointer;
13218   SKIP_WHITESPACE ();
13219   expression (&ex_sym);
13220
13221   macro_start ();
13222   if (mips_cpreturn_register == -1)
13223     {
13224       ex_off.X_op = O_constant;
13225       ex_off.X_add_symbol = NULL;
13226       ex_off.X_op_symbol = NULL;
13227       ex_off.X_add_number = mips_cpreturn_offset;
13228
13229       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13230                    BFD_RELOC_LO16, SP);
13231     }
13232   else
13233     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13234                  mips_gp_register, 0);
13235
13236   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13237     {
13238       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13239                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13240                    BFD_RELOC_HI16_S);
13241
13242       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13243                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13244                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13245
13246       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13247                    mips_gp_register, reg1);
13248     }
13249   else
13250     {
13251       expressionS ex;
13252
13253       ex.X_op = O_symbol;
13254       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13255       ex.X_op_symbol = NULL;
13256       ex.X_add_number = 0;
13257
13258       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13259       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13260
13261       macro_build_lui (&ex, mips_gp_register);
13262       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13263                    mips_gp_register, BFD_RELOC_LO16);
13264     }
13265
13266   macro_end ();
13267
13268   demand_empty_rest_of_line ();
13269 }
13270
13271 static void
13272 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13273 {
13274   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13275      .cplocal is ignored.  */
13276   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13277     {
13278       s_ignore (0);
13279       return;
13280     }
13281
13282   mips_gp_register = tc_get_register (0);
13283   demand_empty_rest_of_line ();
13284 }
13285
13286 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13287    offset from $sp.  The offset is remembered, and after making a PIC
13288    call $gp is restored from that location.  */
13289
13290 static void
13291 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13292 {
13293   expressionS ex;
13294
13295   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13296      .cprestore is ignored.  */
13297   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13298     {
13299       s_ignore (0);
13300       return;
13301     }
13302
13303   mips_cprestore_offset = get_absolute_expression ();
13304   mips_cprestore_valid = 1;
13305
13306   ex.X_op = O_constant;
13307   ex.X_add_symbol = NULL;
13308   ex.X_op_symbol = NULL;
13309   ex.X_add_number = mips_cprestore_offset;
13310
13311   macro_start ();
13312   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13313                                 SP, HAVE_64BIT_ADDRESSES);
13314   macro_end ();
13315
13316   demand_empty_rest_of_line ();
13317 }
13318
13319 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13320    was given in the preceding .cpsetup, it results in:
13321      ld         $gp, offset($sp)
13322
13323    If a register $reg2 was given there, it results in:
13324      daddu      $gp, $reg2, $0  */
13325
13326 static void
13327 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13328 {
13329   expressionS ex;
13330
13331   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13332      We also need NewABI support.  */
13333   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13334     {
13335       s_ignore (0);
13336       return;
13337     }
13338
13339   macro_start ();
13340   if (mips_cpreturn_register == -1)
13341     {
13342       ex.X_op = O_constant;
13343       ex.X_add_symbol = NULL;
13344       ex.X_op_symbol = NULL;
13345       ex.X_add_number = mips_cpreturn_offset;
13346
13347       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13348     }
13349   else
13350     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13351                  mips_cpreturn_register, 0);
13352   macro_end ();
13353
13354   demand_empty_rest_of_line ();
13355 }
13356
13357 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13358    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13359    use in DWARF debug information.  */
13360
13361 static void
13362 s_dtprel_internal (size_t bytes)
13363 {
13364   expressionS ex;
13365   char *p;
13366
13367   expression (&ex);
13368
13369   if (ex.X_op != O_symbol)
13370     {
13371       as_bad (_("Unsupported use of %s"), (bytes == 8
13372                                            ? ".dtpreldword"
13373                                            : ".dtprelword"));
13374       ignore_rest_of_line ();
13375     }
13376
13377   p = frag_more (bytes);
13378   md_number_to_chars (p, 0, bytes);
13379   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13380                (bytes == 8
13381                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13382                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13383
13384   demand_empty_rest_of_line ();
13385 }
13386
13387 /* Handle .dtprelword.  */
13388
13389 static void
13390 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13391 {
13392   s_dtprel_internal (4);
13393 }
13394
13395 /* Handle .dtpreldword.  */
13396
13397 static void
13398 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13399 {
13400   s_dtprel_internal (8);
13401 }
13402
13403 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13404    code.  It sets the offset to use in gp_rel relocations.  */
13405
13406 static void
13407 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13408 {
13409   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13410      We also need NewABI support.  */
13411   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13412     {
13413       s_ignore (0);
13414       return;
13415     }
13416
13417   mips_gprel_offset = get_absolute_expression ();
13418
13419   demand_empty_rest_of_line ();
13420 }
13421
13422 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13423    code.  It generates a 32 bit GP relative reloc.  */
13424
13425 static void
13426 s_gpword (int ignore ATTRIBUTE_UNUSED)
13427 {
13428   segment_info_type *si;
13429   struct insn_label_list *l;
13430   symbolS *label;
13431   expressionS ex;
13432   char *p;
13433
13434   /* When not generating PIC code, this is treated as .word.  */
13435   if (mips_pic != SVR4_PIC)
13436     {
13437       s_cons (2);
13438       return;
13439     }
13440
13441   si = seg_info (now_seg);
13442   l = si->label_list;
13443   label = l != NULL ? l->label : NULL;
13444   mips_emit_delays ();
13445   if (auto_align)
13446     mips_align (2, 0, label);
13447   mips_clear_insn_labels ();
13448
13449   expression (&ex);
13450
13451   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13452     {
13453       as_bad (_("Unsupported use of .gpword"));
13454       ignore_rest_of_line ();
13455     }
13456
13457   p = frag_more (4);
13458   md_number_to_chars (p, 0, 4);
13459   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13460                BFD_RELOC_GPREL32);
13461
13462   demand_empty_rest_of_line ();
13463 }
13464
13465 static void
13466 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13467 {
13468   segment_info_type *si;
13469   struct insn_label_list *l;
13470   symbolS *label;
13471   expressionS ex;
13472   char *p;
13473
13474   /* When not generating PIC code, this is treated as .dword.  */
13475   if (mips_pic != SVR4_PIC)
13476     {
13477       s_cons (3);
13478       return;
13479     }
13480
13481   si = seg_info (now_seg);
13482   l = si->label_list;
13483   label = l != NULL ? l->label : NULL;
13484   mips_emit_delays ();
13485   if (auto_align)
13486     mips_align (3, 0, label);
13487   mips_clear_insn_labels ();
13488
13489   expression (&ex);
13490
13491   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13492     {
13493       as_bad (_("Unsupported use of .gpdword"));
13494       ignore_rest_of_line ();
13495     }
13496
13497   p = frag_more (8);
13498   md_number_to_chars (p, 0, 8);
13499   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13500                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13501
13502   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13503   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13504            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13505
13506   demand_empty_rest_of_line ();
13507 }
13508
13509 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13510    tables in SVR4 PIC code.  */
13511
13512 static void
13513 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13514 {
13515   int reg;
13516
13517   /* This is ignored when not generating SVR4 PIC code.  */
13518   if (mips_pic != SVR4_PIC)
13519     {
13520       s_ignore (0);
13521       return;
13522     }
13523
13524   /* Add $gp to the register named as an argument.  */
13525   macro_start ();
13526   reg = tc_get_register (0);
13527   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13528   macro_end ();
13529
13530   demand_empty_rest_of_line ();
13531 }
13532
13533 /* Handle the .insn pseudo-op.  This marks instruction labels in
13534    mips16 mode.  This permits the linker to handle them specially,
13535    such as generating jalx instructions when needed.  We also make
13536    them odd for the duration of the assembly, in order to generate the
13537    right sort of code.  We will make them even in the adjust_symtab
13538    routine, while leaving them marked.  This is convenient for the
13539    debugger and the disassembler.  The linker knows to make them odd
13540    again.  */
13541
13542 static void
13543 s_insn (int ignore ATTRIBUTE_UNUSED)
13544 {
13545   mips16_mark_labels ();
13546
13547   demand_empty_rest_of_line ();
13548 }
13549
13550 /* Handle a .stabn directive.  We need these in order to mark a label
13551    as being a mips16 text label correctly.  Sometimes the compiler
13552    will emit a label, followed by a .stabn, and then switch sections.
13553    If the label and .stabn are in mips16 mode, then the label is
13554    really a mips16 text label.  */
13555
13556 static void
13557 s_mips_stab (int type)
13558 {
13559   if (type == 'n')
13560     mips16_mark_labels ();
13561
13562   s_stab (type);
13563 }
13564
13565 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13566
13567 static void
13568 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13569 {
13570   char *name;
13571   int c;
13572   symbolS *symbolP;
13573   expressionS exp;
13574
13575   name = input_line_pointer;
13576   c = get_symbol_end ();
13577   symbolP = symbol_find_or_make (name);
13578   S_SET_WEAK (symbolP);
13579   *input_line_pointer = c;
13580
13581   SKIP_WHITESPACE ();
13582
13583   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13584     {
13585       if (S_IS_DEFINED (symbolP))
13586         {
13587           as_bad (_("ignoring attempt to redefine symbol %s"),
13588                   S_GET_NAME (symbolP));
13589           ignore_rest_of_line ();
13590           return;
13591         }
13592
13593       if (*input_line_pointer == ',')
13594         {
13595           ++input_line_pointer;
13596           SKIP_WHITESPACE ();
13597         }
13598
13599       expression (&exp);
13600       if (exp.X_op != O_symbol)
13601         {
13602           as_bad (_("bad .weakext directive"));
13603           ignore_rest_of_line ();
13604           return;
13605         }
13606       symbol_set_value_expression (symbolP, &exp);
13607     }
13608
13609   demand_empty_rest_of_line ();
13610 }
13611
13612 /* Parse a register string into a number.  Called from the ECOFF code
13613    to parse .frame.  The argument is non-zero if this is the frame
13614    register, so that we can record it in mips_frame_reg.  */
13615
13616 int
13617 tc_get_register (int frame)
13618 {
13619   unsigned int reg;
13620
13621   SKIP_WHITESPACE ();
13622   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13623     reg = 0;
13624   if (frame)
13625     {
13626       mips_frame_reg = reg != 0 ? reg : SP;
13627       mips_frame_reg_valid = 1;
13628       mips_cprestore_valid = 0;
13629     }
13630   return reg;
13631 }
13632
13633 valueT
13634 md_section_align (asection *seg, valueT addr)
13635 {
13636   int align = bfd_get_section_alignment (stdoutput, seg);
13637
13638   if (IS_ELF)
13639     {
13640       /* We don't need to align ELF sections to the full alignment.
13641          However, Irix 5 may prefer that we align them at least to a 16
13642          byte boundary.  We don't bother to align the sections if we
13643          are targeted for an embedded system.  */
13644       if (strncmp (TARGET_OS, "elf", 3) == 0)
13645         return addr;
13646       if (align > 4)
13647         align = 4;
13648     }
13649
13650   return ((addr + (1 << align) - 1) & (-1 << align));
13651 }
13652
13653 /* Utility routine, called from above as well.  If called while the
13654    input file is still being read, it's only an approximation.  (For
13655    example, a symbol may later become defined which appeared to be
13656    undefined earlier.)  */
13657
13658 static int
13659 nopic_need_relax (symbolS *sym, int before_relaxing)
13660 {
13661   if (sym == 0)
13662     return 0;
13663
13664   if (g_switch_value > 0)
13665     {
13666       const char *symname;
13667       int change;
13668
13669       /* Find out whether this symbol can be referenced off the $gp
13670          register.  It can be if it is smaller than the -G size or if
13671          it is in the .sdata or .sbss section.  Certain symbols can
13672          not be referenced off the $gp, although it appears as though
13673          they can.  */
13674       symname = S_GET_NAME (sym);
13675       if (symname != (const char *) NULL
13676           && (strcmp (symname, "eprol") == 0
13677               || strcmp (symname, "etext") == 0
13678               || strcmp (symname, "_gp") == 0
13679               || strcmp (symname, "edata") == 0
13680               || strcmp (symname, "_fbss") == 0
13681               || strcmp (symname, "_fdata") == 0
13682               || strcmp (symname, "_ftext") == 0
13683               || strcmp (symname, "end") == 0
13684               || strcmp (symname, "_gp_disp") == 0))
13685         change = 1;
13686       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13687                && (0
13688 #ifndef NO_ECOFF_DEBUGGING
13689                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13690                        && (symbol_get_obj (sym)->ecoff_extern_size
13691                            <= g_switch_value))
13692 #endif
13693                    /* We must defer this decision until after the whole
13694                       file has been read, since there might be a .extern
13695                       after the first use of this symbol.  */
13696                    || (before_relaxing
13697 #ifndef NO_ECOFF_DEBUGGING
13698                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13699 #endif
13700                        && S_GET_VALUE (sym) == 0)
13701                    || (S_GET_VALUE (sym) != 0
13702                        && S_GET_VALUE (sym) <= g_switch_value)))
13703         change = 0;
13704       else
13705         {
13706           const char *segname;
13707
13708           segname = segment_name (S_GET_SEGMENT (sym));
13709           gas_assert (strcmp (segname, ".lit8") != 0
13710                   && strcmp (segname, ".lit4") != 0);
13711           change = (strcmp (segname, ".sdata") != 0
13712                     && strcmp (segname, ".sbss") != 0
13713                     && strncmp (segname, ".sdata.", 7) != 0
13714                     && strncmp (segname, ".sbss.", 6) != 0
13715                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13716                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13717         }
13718       return change;
13719     }
13720   else
13721     /* We are not optimizing for the $gp register.  */
13722     return 1;
13723 }
13724
13725
13726 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13727
13728 static bfd_boolean
13729 pic_need_relax (symbolS *sym, asection *segtype)
13730 {
13731   asection *symsec;
13732
13733   /* Handle the case of a symbol equated to another symbol.  */
13734   while (symbol_equated_reloc_p (sym))
13735     {
13736       symbolS *n;
13737
13738       /* It's possible to get a loop here in a badly written program.  */
13739       n = symbol_get_value_expression (sym)->X_add_symbol;
13740       if (n == sym)
13741         break;
13742       sym = n;
13743     }
13744
13745   if (symbol_section_p (sym))
13746     return TRUE;
13747
13748   symsec = S_GET_SEGMENT (sym);
13749
13750   /* This must duplicate the test in adjust_reloc_syms.  */
13751   return (symsec != &bfd_und_section
13752           && symsec != &bfd_abs_section
13753           && !bfd_is_com_section (symsec)
13754           && !s_is_linkonce (sym, segtype)
13755 #ifdef OBJ_ELF
13756           /* A global or weak symbol is treated as external.  */
13757           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13758 #endif
13759           );
13760 }
13761
13762
13763 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13764    extended opcode.  SEC is the section the frag is in.  */
13765
13766 static int
13767 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13768 {
13769   int type;
13770   const struct mips16_immed_operand *op;
13771   offsetT val;
13772   int mintiny, maxtiny;
13773   segT symsec;
13774   fragS *sym_frag;
13775
13776   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13777     return 0;
13778   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13779     return 1;
13780
13781   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13782   op = mips16_immed_operands;
13783   while (op->type != type)
13784     {
13785       ++op;
13786       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13787     }
13788
13789   if (op->unsp)
13790     {
13791       if (type == '<' || type == '>' || type == '[' || type == ']')
13792         {
13793           mintiny = 1;
13794           maxtiny = 1 << op->nbits;
13795         }
13796       else
13797         {
13798           mintiny = 0;
13799           maxtiny = (1 << op->nbits) - 1;
13800         }
13801     }
13802   else
13803     {
13804       mintiny = - (1 << (op->nbits - 1));
13805       maxtiny = (1 << (op->nbits - 1)) - 1;
13806     }
13807
13808   sym_frag = symbol_get_frag (fragp->fr_symbol);
13809   val = S_GET_VALUE (fragp->fr_symbol);
13810   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13811
13812   if (op->pcrel)
13813     {
13814       addressT addr;
13815
13816       /* We won't have the section when we are called from
13817          mips_relax_frag.  However, we will always have been called
13818          from md_estimate_size_before_relax first.  If this is a
13819          branch to a different section, we mark it as such.  If SEC is
13820          NULL, and the frag is not marked, then it must be a branch to
13821          the same section.  */
13822       if (sec == NULL)
13823         {
13824           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13825             return 1;
13826         }
13827       else
13828         {
13829           /* Must have been called from md_estimate_size_before_relax.  */
13830           if (symsec != sec)
13831             {
13832               fragp->fr_subtype =
13833                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13834
13835               /* FIXME: We should support this, and let the linker
13836                  catch branches and loads that are out of range.  */
13837               as_bad_where (fragp->fr_file, fragp->fr_line,
13838                             _("unsupported PC relative reference to different section"));
13839
13840               return 1;
13841             }
13842           if (fragp != sym_frag && sym_frag->fr_address == 0)
13843             /* Assume non-extended on the first relaxation pass.
13844                The address we have calculated will be bogus if this is
13845                a forward branch to another frag, as the forward frag
13846                will have fr_address == 0.  */
13847             return 0;
13848         }
13849
13850       /* In this case, we know for sure that the symbol fragment is in
13851          the same section.  If the relax_marker of the symbol fragment
13852          differs from the relax_marker of this fragment, we have not
13853          yet adjusted the symbol fragment fr_address.  We want to add
13854          in STRETCH in order to get a better estimate of the address.
13855          This particularly matters because of the shift bits.  */
13856       if (stretch != 0
13857           && sym_frag->relax_marker != fragp->relax_marker)
13858         {
13859           fragS *f;
13860
13861           /* Adjust stretch for any alignment frag.  Note that if have
13862              been expanding the earlier code, the symbol may be
13863              defined in what appears to be an earlier frag.  FIXME:
13864              This doesn't handle the fr_subtype field, which specifies
13865              a maximum number of bytes to skip when doing an
13866              alignment.  */
13867           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
13868             {
13869               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
13870                 {
13871                   if (stretch < 0)
13872                     stretch = - ((- stretch)
13873                                  & ~ ((1 << (int) f->fr_offset) - 1));
13874                   else
13875                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
13876                   if (stretch == 0)
13877                     break;
13878                 }
13879             }
13880           if (f != NULL)
13881             val += stretch;
13882         }
13883
13884       addr = fragp->fr_address + fragp->fr_fix;
13885
13886       /* The base address rules are complicated.  The base address of
13887          a branch is the following instruction.  The base address of a
13888          PC relative load or add is the instruction itself, but if it
13889          is in a delay slot (in which case it can not be extended) use
13890          the address of the instruction whose delay slot it is in.  */
13891       if (type == 'p' || type == 'q')
13892         {
13893           addr += 2;
13894
13895           /* If we are currently assuming that this frag should be
13896              extended, then, the current address is two bytes
13897              higher.  */
13898           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
13899             addr += 2;
13900
13901           /* Ignore the low bit in the target, since it will be set
13902              for a text label.  */
13903           if ((val & 1) != 0)
13904             --val;
13905         }
13906       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
13907         addr -= 4;
13908       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
13909         addr -= 2;
13910
13911       val -= addr & ~ ((1 << op->shift) - 1);
13912
13913       /* Branch offsets have an implicit 0 in the lowest bit.  */
13914       if (type == 'p' || type == 'q')
13915         val /= 2;
13916
13917       /* If any of the shifted bits are set, we must use an extended
13918          opcode.  If the address depends on the size of this
13919          instruction, this can lead to a loop, so we arrange to always
13920          use an extended opcode.  We only check this when we are in
13921          the main relaxation loop, when SEC is NULL.  */
13922       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
13923         {
13924           fragp->fr_subtype =
13925             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13926           return 1;
13927         }
13928
13929       /* If we are about to mark a frag as extended because the value
13930          is precisely maxtiny + 1, then there is a chance of an
13931          infinite loop as in the following code:
13932              la $4,foo
13933              .skip      1020
13934              .align     2
13935            foo:
13936          In this case when the la is extended, foo is 0x3fc bytes
13937          away, so the la can be shrunk, but then foo is 0x400 away, so
13938          the la must be extended.  To avoid this loop, we mark the
13939          frag as extended if it was small, and is about to become
13940          extended with a value of maxtiny + 1.  */
13941       if (val == ((maxtiny + 1) << op->shift)
13942           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
13943           && sec == NULL)
13944         {
13945           fragp->fr_subtype =
13946             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13947           return 1;
13948         }
13949     }
13950   else if (symsec != absolute_section && sec != NULL)
13951     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
13952
13953   if ((val & ((1 << op->shift) - 1)) != 0
13954       || val < (mintiny << op->shift)
13955       || val > (maxtiny << op->shift))
13956     return 1;
13957   else
13958     return 0;
13959 }
13960
13961 /* Compute the length of a branch sequence, and adjust the
13962    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
13963    worst-case length is computed, with UPDATE being used to indicate
13964    whether an unconditional (-1), branch-likely (+1) or regular (0)
13965    branch is to be computed.  */
13966 static int
13967 relaxed_branch_length (fragS *fragp, asection *sec, int update)
13968 {
13969   bfd_boolean toofar;
13970   int length;
13971
13972   if (fragp
13973       && S_IS_DEFINED (fragp->fr_symbol)
13974       && sec == S_GET_SEGMENT (fragp->fr_symbol))
13975     {
13976       addressT addr;
13977       offsetT val;
13978
13979       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
13980
13981       addr = fragp->fr_address + fragp->fr_fix + 4;
13982
13983       val -= addr;
13984
13985       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
13986     }
13987   else if (fragp)
13988     /* If the symbol is not defined or it's in a different segment,
13989        assume the user knows what's going on and emit a short
13990        branch.  */
13991     toofar = FALSE;
13992   else
13993     toofar = TRUE;
13994
13995   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
13996     fragp->fr_subtype
13997       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
13998                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
13999                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14000                              toofar);
14001
14002   length = 4;
14003   if (toofar)
14004     {
14005       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14006         length += 8;
14007
14008       if (mips_pic != NO_PIC)
14009         {
14010           /* Additional space for PIC loading of target address.  */
14011           length += 8;
14012           if (mips_opts.isa == ISA_MIPS1)
14013             /* Additional space for $at-stabilizing nop.  */
14014             length += 4;
14015         }
14016
14017       /* If branch is conditional.  */
14018       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14019         length += 8;
14020     }
14021
14022   return length;
14023 }
14024
14025 /* Estimate the size of a frag before relaxing.  Unless this is the
14026    mips16, we are not really relaxing here, and the final size is
14027    encoded in the subtype information.  For the mips16, we have to
14028    decide whether we are using an extended opcode or not.  */
14029
14030 int
14031 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14032 {
14033   int change;
14034
14035   if (RELAX_BRANCH_P (fragp->fr_subtype))
14036     {
14037
14038       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14039
14040       return fragp->fr_var;
14041     }
14042
14043   if (RELAX_MIPS16_P (fragp->fr_subtype))
14044     /* We don't want to modify the EXTENDED bit here; it might get us
14045        into infinite loops.  We change it only in mips_relax_frag().  */
14046     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14047
14048   if (mips_pic == NO_PIC)
14049     change = nopic_need_relax (fragp->fr_symbol, 0);
14050   else if (mips_pic == SVR4_PIC)
14051     change = pic_need_relax (fragp->fr_symbol, segtype);
14052   else if (mips_pic == VXWORKS_PIC)
14053     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14054     change = 0;
14055   else
14056     abort ();
14057
14058   if (change)
14059     {
14060       fragp->fr_subtype |= RELAX_USE_SECOND;
14061       return -RELAX_FIRST (fragp->fr_subtype);
14062     }
14063   else
14064     return -RELAX_SECOND (fragp->fr_subtype);
14065 }
14066
14067 /* This is called to see whether a reloc against a defined symbol
14068    should be converted into a reloc against a section.  */
14069
14070 int
14071 mips_fix_adjustable (fixS *fixp)
14072 {
14073   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14074       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14075     return 0;
14076
14077   if (fixp->fx_addsy == NULL)
14078     return 1;
14079
14080   /* If symbol SYM is in a mergeable section, relocations of the form
14081      SYM + 0 can usually be made section-relative.  The mergeable data
14082      is then identified by the section offset rather than by the symbol.
14083
14084      However, if we're generating REL LO16 relocations, the offset is split
14085      between the LO16 and parterning high part relocation.  The linker will
14086      need to recalculate the complete offset in order to correctly identify
14087      the merge data.
14088
14089      The linker has traditionally not looked for the parterning high part
14090      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14091      placed anywhere.  Rather than break backwards compatibility by changing
14092      this, it seems better not to force the issue, and instead keep the
14093      original symbol.  This will work with either linker behavior.  */
14094   if ((lo16_reloc_p (fixp->fx_r_type)
14095        || reloc_needs_lo_p (fixp->fx_r_type))
14096       && HAVE_IN_PLACE_ADDENDS
14097       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14098     return 0;
14099
14100 #ifdef OBJ_ELF
14101   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14102      to a floating-point stub.  The same is true for non-R_MIPS16_26
14103      relocations against MIPS16 functions; in this case, the stub becomes
14104      the function's canonical address.
14105
14106      Floating-point stubs are stored in unique .mips16.call.* or
14107      .mips16.fn.* sections.  If a stub T for function F is in section S,
14108      the first relocation in section S must be against F; this is how the
14109      linker determines the target function.  All relocations that might
14110      resolve to T must also be against F.  We therefore have the following
14111      restrictions, which are given in an intentionally-redundant way:
14112
14113        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14114           symbols.
14115
14116        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14117           if that stub might be used.
14118
14119        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14120           symbols.
14121
14122        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14123           that stub might be used.
14124
14125      There is a further restriction:
14126
14127        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14128           on targets with in-place addends; the relocation field cannot
14129           encode the low bit.
14130
14131      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14132      against a MIPS16 symbol.
14133
14134      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14135      relocation against some symbol R, no relocation against R may be
14136      reduced.  (Note that this deals with (2) as well as (1) because
14137      relocations against global symbols will never be reduced on ELF
14138      targets.)  This approach is a little simpler than trying to detect
14139      stub sections, and gives the "all or nothing" per-symbol consistency
14140      that we have for MIPS16 symbols.  */
14141   if (IS_ELF
14142       && fixp->fx_subsy == NULL
14143       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14144           || *symbol_get_tc (fixp->fx_addsy)))
14145     return 0;
14146 #endif
14147
14148   return 1;
14149 }
14150
14151 /* Translate internal representation of relocation info to BFD target
14152    format.  */
14153
14154 arelent **
14155 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14156 {
14157   static arelent *retval[4];
14158   arelent *reloc;
14159   bfd_reloc_code_real_type code;
14160
14161   memset (retval, 0, sizeof(retval));
14162   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14163   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14164   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14165   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14166
14167   if (fixp->fx_pcrel)
14168     {
14169       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14170
14171       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14172          Relocations want only the symbol offset.  */
14173       reloc->addend = fixp->fx_addnumber + reloc->address;
14174       if (!IS_ELF)
14175         {
14176           /* A gruesome hack which is a result of the gruesome gas
14177              reloc handling.  What's worse, for COFF (as opposed to
14178              ECOFF), we might need yet another copy of reloc->address.
14179              See bfd_install_relocation.  */
14180           reloc->addend += reloc->address;
14181         }
14182     }
14183   else
14184     reloc->addend = fixp->fx_addnumber;
14185
14186   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14187      entry to be used in the relocation's section offset.  */
14188   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14189     {
14190       reloc->address = reloc->addend;
14191       reloc->addend = 0;
14192     }
14193
14194   code = fixp->fx_r_type;
14195
14196   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14197   if (reloc->howto == NULL)
14198     {
14199       as_bad_where (fixp->fx_file, fixp->fx_line,
14200                     _("Can not represent %s relocation in this object file format"),
14201                     bfd_get_reloc_code_name (code));
14202       retval[0] = NULL;
14203     }
14204
14205   return retval;
14206 }
14207
14208 /* Relax a machine dependent frag.  This returns the amount by which
14209    the current size of the frag should change.  */
14210
14211 int
14212 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14213 {
14214   if (RELAX_BRANCH_P (fragp->fr_subtype))
14215     {
14216       offsetT old_var = fragp->fr_var;
14217
14218       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14219
14220       return fragp->fr_var - old_var;
14221     }
14222
14223   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14224     return 0;
14225
14226   if (mips16_extended_frag (fragp, NULL, stretch))
14227     {
14228       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14229         return 0;
14230       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14231       return 2;
14232     }
14233   else
14234     {
14235       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14236         return 0;
14237       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14238       return -2;
14239     }
14240
14241   return 0;
14242 }
14243
14244 /* Convert a machine dependent frag.  */
14245
14246 void
14247 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14248 {
14249   if (RELAX_BRANCH_P (fragp->fr_subtype))
14250     {
14251       bfd_byte *buf;
14252       unsigned long insn;
14253       expressionS exp;
14254       fixS *fixp;
14255
14256       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14257
14258       if (target_big_endian)
14259         insn = bfd_getb32 (buf);
14260       else
14261         insn = bfd_getl32 (buf);
14262
14263       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14264         {
14265           /* We generate a fixup instead of applying it right now
14266              because, if there are linker relaxations, we're going to
14267              need the relocations.  */
14268           exp.X_op = O_symbol;
14269           exp.X_add_symbol = fragp->fr_symbol;
14270           exp.X_add_number = fragp->fr_offset;
14271
14272           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14273                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14274           fixp->fx_file = fragp->fr_file;
14275           fixp->fx_line = fragp->fr_line;
14276
14277           md_number_to_chars ((char *) buf, insn, 4);
14278           buf += 4;
14279         }
14280       else
14281         {
14282           int i;
14283
14284           as_warn_where (fragp->fr_file, fragp->fr_line,
14285                          _("relaxed out-of-range branch into a jump"));
14286
14287           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14288             goto uncond;
14289
14290           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14291             {
14292               /* Reverse the branch.  */
14293               switch ((insn >> 28) & 0xf)
14294                 {
14295                 case 4:
14296                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14297                      have the condition reversed by tweaking a single
14298                      bit, and their opcodes all have 0x4???????.  */
14299                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14300                   insn ^= 0x00010000;
14301                   break;
14302
14303                 case 0:
14304                   /* bltz       0x04000000      bgez    0x04010000
14305                      bltzal     0x04100000      bgezal  0x04110000  */
14306                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14307                   insn ^= 0x00010000;
14308                   break;
14309
14310                 case 1:
14311                   /* beq        0x10000000      bne     0x14000000
14312                      blez       0x18000000      bgtz    0x1c000000  */
14313                   insn ^= 0x04000000;
14314                   break;
14315
14316                 default:
14317                   abort ();
14318                 }
14319             }
14320
14321           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14322             {
14323               /* Clear the and-link bit.  */
14324               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14325
14326               /* bltzal         0x04100000      bgezal  0x04110000
14327                  bltzall        0x04120000      bgezall 0x04130000  */
14328               insn &= ~0x00100000;
14329             }
14330
14331           /* Branch over the branch (if the branch was likely) or the
14332              full jump (not likely case).  Compute the offset from the
14333              current instruction to branch to.  */
14334           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14335             i = 16;
14336           else
14337             {
14338               /* How many bytes in instructions we've already emitted?  */
14339               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14340               /* How many bytes in instructions from here to the end?  */
14341               i = fragp->fr_var - i;
14342             }
14343           /* Convert to instruction count.  */
14344           i >>= 2;
14345           /* Branch counts from the next instruction.  */
14346           i--;
14347           insn |= i;
14348           /* Branch over the jump.  */
14349           md_number_to_chars ((char *) buf, insn, 4);
14350           buf += 4;
14351
14352           /* nop */
14353           md_number_to_chars ((char *) buf, 0, 4);
14354           buf += 4;
14355
14356           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14357             {
14358               /* beql $0, $0, 2f */
14359               insn = 0x50000000;
14360               /* Compute the PC offset from the current instruction to
14361                  the end of the variable frag.  */
14362               /* How many bytes in instructions we've already emitted?  */
14363               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14364               /* How many bytes in instructions from here to the end?  */
14365               i = fragp->fr_var - i;
14366               /* Convert to instruction count.  */
14367               i >>= 2;
14368               /* Don't decrement i, because we want to branch over the
14369                  delay slot.  */
14370
14371               insn |= i;
14372               md_number_to_chars ((char *) buf, insn, 4);
14373               buf += 4;
14374
14375               md_number_to_chars ((char *) buf, 0, 4);
14376               buf += 4;
14377             }
14378
14379         uncond:
14380           if (mips_pic == NO_PIC)
14381             {
14382               /* j or jal.  */
14383               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14384                       ? 0x0c000000 : 0x08000000);
14385               exp.X_op = O_symbol;
14386               exp.X_add_symbol = fragp->fr_symbol;
14387               exp.X_add_number = fragp->fr_offset;
14388
14389               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14390                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14391               fixp->fx_file = fragp->fr_file;
14392               fixp->fx_line = fragp->fr_line;
14393
14394               md_number_to_chars ((char *) buf, insn, 4);
14395               buf += 4;
14396             }
14397           else
14398             {
14399               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14400               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14401               exp.X_op = O_symbol;
14402               exp.X_add_symbol = fragp->fr_symbol;
14403               exp.X_add_number = fragp->fr_offset;
14404
14405               if (fragp->fr_offset)
14406                 {
14407                   exp.X_add_symbol = make_expr_symbol (&exp);
14408                   exp.X_add_number = 0;
14409                 }
14410
14411               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14412                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14413               fixp->fx_file = fragp->fr_file;
14414               fixp->fx_line = fragp->fr_line;
14415
14416               md_number_to_chars ((char *) buf, insn, 4);
14417               buf += 4;
14418
14419               if (mips_opts.isa == ISA_MIPS1)
14420                 {
14421                   /* nop */
14422                   md_number_to_chars ((char *) buf, 0, 4);
14423                   buf += 4;
14424                 }
14425
14426               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14427               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14428
14429               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14430                                   4, &exp, FALSE, BFD_RELOC_LO16);
14431               fixp->fx_file = fragp->fr_file;
14432               fixp->fx_line = fragp->fr_line;
14433
14434               md_number_to_chars ((char *) buf, insn, 4);
14435               buf += 4;
14436
14437               /* j(al)r $at.  */
14438               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14439                 insn = 0x0020f809;
14440               else
14441                 insn = 0x00200008;
14442
14443               md_number_to_chars ((char *) buf, insn, 4);
14444               buf += 4;
14445             }
14446         }
14447
14448       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14449               + fragp->fr_fix + fragp->fr_var);
14450
14451       fragp->fr_fix += fragp->fr_var;
14452
14453       return;
14454     }
14455
14456   if (RELAX_MIPS16_P (fragp->fr_subtype))
14457     {
14458       int type;
14459       const struct mips16_immed_operand *op;
14460       bfd_boolean small, ext;
14461       offsetT val;
14462       bfd_byte *buf;
14463       unsigned long insn;
14464       bfd_boolean use_extend;
14465       unsigned short extend;
14466
14467       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14468       op = mips16_immed_operands;
14469       while (op->type != type)
14470         ++op;
14471
14472       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14473         {
14474           small = FALSE;
14475           ext = TRUE;
14476         }
14477       else
14478         {
14479           small = TRUE;
14480           ext = FALSE;
14481         }
14482
14483       resolve_symbol_value (fragp->fr_symbol);
14484       val = S_GET_VALUE (fragp->fr_symbol);
14485       if (op->pcrel)
14486         {
14487           addressT addr;
14488
14489           addr = fragp->fr_address + fragp->fr_fix;
14490
14491           /* The rules for the base address of a PC relative reloc are
14492              complicated; see mips16_extended_frag.  */
14493           if (type == 'p' || type == 'q')
14494             {
14495               addr += 2;
14496               if (ext)
14497                 addr += 2;
14498               /* Ignore the low bit in the target, since it will be
14499                  set for a text label.  */
14500               if ((val & 1) != 0)
14501                 --val;
14502             }
14503           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14504             addr -= 4;
14505           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14506             addr -= 2;
14507
14508           addr &= ~ (addressT) ((1 << op->shift) - 1);
14509           val -= addr;
14510
14511           /* Make sure the section winds up with the alignment we have
14512              assumed.  */
14513           if (op->shift > 0)
14514             record_alignment (asec, op->shift);
14515         }
14516
14517       if (ext
14518           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14519               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14520         as_warn_where (fragp->fr_file, fragp->fr_line,
14521                        _("extended instruction in delay slot"));
14522
14523       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14524
14525       if (target_big_endian)
14526         insn = bfd_getb16 (buf);
14527       else
14528         insn = bfd_getl16 (buf);
14529
14530       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14531                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14532                     small, ext, &insn, &use_extend, &extend);
14533
14534       if (use_extend)
14535         {
14536           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14537           fragp->fr_fix += 2;
14538           buf += 2;
14539         }
14540
14541       md_number_to_chars ((char *) buf, insn, 2);
14542       fragp->fr_fix += 2;
14543       buf += 2;
14544     }
14545   else
14546     {
14547       int first, second;
14548       fixS *fixp;
14549
14550       first = RELAX_FIRST (fragp->fr_subtype);
14551       second = RELAX_SECOND (fragp->fr_subtype);
14552       fixp = (fixS *) fragp->fr_opcode;
14553
14554       /* Possibly emit a warning if we've chosen the longer option.  */
14555       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14556           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14557         {
14558           const char *msg = macro_warning (fragp->fr_subtype);
14559           if (msg != 0)
14560             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14561         }
14562
14563       /* Go through all the fixups for the first sequence.  Disable them
14564          (by marking them as done) if we're going to use the second
14565          sequence instead.  */
14566       while (fixp
14567              && fixp->fx_frag == fragp
14568              && fixp->fx_where < fragp->fr_fix - second)
14569         {
14570           if (fragp->fr_subtype & RELAX_USE_SECOND)
14571             fixp->fx_done = 1;
14572           fixp = fixp->fx_next;
14573         }
14574
14575       /* Go through the fixups for the second sequence.  Disable them if
14576          we're going to use the first sequence, otherwise adjust their
14577          addresses to account for the relaxation.  */
14578       while (fixp && fixp->fx_frag == fragp)
14579         {
14580           if (fragp->fr_subtype & RELAX_USE_SECOND)
14581             fixp->fx_where -= first;
14582           else
14583             fixp->fx_done = 1;
14584           fixp = fixp->fx_next;
14585         }
14586
14587       /* Now modify the frag contents.  */
14588       if (fragp->fr_subtype & RELAX_USE_SECOND)
14589         {
14590           char *start;
14591
14592           start = fragp->fr_literal + fragp->fr_fix - first - second;
14593           memmove (start, start + first, second);
14594           fragp->fr_fix -= first;
14595         }
14596       else
14597         fragp->fr_fix -= second;
14598     }
14599 }
14600
14601 #ifdef OBJ_ELF
14602
14603 /* This function is called after the relocs have been generated.
14604    We've been storing mips16 text labels as odd.  Here we convert them
14605    back to even for the convenience of the debugger.  */
14606
14607 void
14608 mips_frob_file_after_relocs (void)
14609 {
14610   asymbol **syms;
14611   unsigned int count, i;
14612
14613   if (!IS_ELF)
14614     return;
14615
14616   syms = bfd_get_outsymbols (stdoutput);
14617   count = bfd_get_symcount (stdoutput);
14618   for (i = 0; i < count; i++, syms++)
14619     {
14620       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14621           && ((*syms)->value & 1) != 0)
14622         {
14623           (*syms)->value &= ~1;
14624           /* If the symbol has an odd size, it was probably computed
14625              incorrectly, so adjust that as well.  */
14626           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14627             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14628         }
14629     }
14630 }
14631
14632 #endif
14633
14634 /* This function is called whenever a label is defined.  It is used
14635    when handling branch delays; if a branch has a label, we assume we
14636    can not move it.  */
14637
14638 void
14639 mips_define_label (symbolS *sym)
14640 {
14641   segment_info_type *si = seg_info (now_seg);
14642   struct insn_label_list *l;
14643
14644   if (free_insn_labels == NULL)
14645     l = (struct insn_label_list *) xmalloc (sizeof *l);
14646   else
14647     {
14648       l = free_insn_labels;
14649       free_insn_labels = l->next;
14650     }
14651
14652   l->label = sym;
14653   l->next = si->label_list;
14654   si->label_list = l;
14655
14656 #ifdef OBJ_ELF
14657   dwarf2_emit_label (sym);
14658 #endif
14659 }
14660 \f
14661 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14662
14663 /* Some special processing for a MIPS ELF file.  */
14664
14665 void
14666 mips_elf_final_processing (void)
14667 {
14668   /* Write out the register information.  */
14669   if (mips_abi != N64_ABI)
14670     {
14671       Elf32_RegInfo s;
14672
14673       s.ri_gprmask = mips_gprmask;
14674       s.ri_cprmask[0] = mips_cprmask[0];
14675       s.ri_cprmask[1] = mips_cprmask[1];
14676       s.ri_cprmask[2] = mips_cprmask[2];
14677       s.ri_cprmask[3] = mips_cprmask[3];
14678       /* The gp_value field is set by the MIPS ELF backend.  */
14679
14680       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14681                                        ((Elf32_External_RegInfo *)
14682                                         mips_regmask_frag));
14683     }
14684   else
14685     {
14686       Elf64_Internal_RegInfo s;
14687
14688       s.ri_gprmask = mips_gprmask;
14689       s.ri_pad = 0;
14690       s.ri_cprmask[0] = mips_cprmask[0];
14691       s.ri_cprmask[1] = mips_cprmask[1];
14692       s.ri_cprmask[2] = mips_cprmask[2];
14693       s.ri_cprmask[3] = mips_cprmask[3];
14694       /* The gp_value field is set by the MIPS ELF backend.  */
14695
14696       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14697                                        ((Elf64_External_RegInfo *)
14698                                         mips_regmask_frag));
14699     }
14700
14701   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14702      sort of BFD interface for this.  */
14703   if (mips_any_noreorder)
14704     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14705   if (mips_pic != NO_PIC)
14706     {
14707     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14708       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14709     }
14710   if (mips_abicalls)
14711     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14712
14713   /* Set MIPS ELF flags for ASEs.  */
14714   /* We may need to define a new flag for DSP ASE, and set this flag when
14715      file_ase_dsp is true.  */
14716   /* Same for DSP R2.  */
14717   /* We may need to define a new flag for MT ASE, and set this flag when
14718      file_ase_mt is true.  */
14719   if (file_ase_mips16)
14720     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14721 #if 0 /* XXX FIXME */
14722   if (file_ase_mips3d)
14723     elf_elfheader (stdoutput)->e_flags |= ???;
14724 #endif
14725   if (file_ase_mdmx)
14726     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14727
14728   /* Set the MIPS ELF ABI flags.  */
14729   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14730     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14731   else if (mips_abi == O64_ABI)
14732     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14733   else if (mips_abi == EABI_ABI)
14734     {
14735       if (!file_mips_gp32)
14736         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14737       else
14738         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14739     }
14740   else if (mips_abi == N32_ABI)
14741     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14742
14743   /* Nothing to do for N64_ABI.  */
14744
14745   if (mips_32bitmode)
14746     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14747
14748 #if 0 /* XXX FIXME */
14749   /* 32 bit code with 64 bit FP registers.  */
14750   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14751     elf_elfheader (stdoutput)->e_flags |= ???;
14752 #endif
14753 }
14754
14755 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14756 \f
14757 typedef struct proc {
14758   symbolS *func_sym;
14759   symbolS *func_end_sym;
14760   unsigned long reg_mask;
14761   unsigned long reg_offset;
14762   unsigned long fpreg_mask;
14763   unsigned long fpreg_offset;
14764   unsigned long frame_offset;
14765   unsigned long frame_reg;
14766   unsigned long pc_reg;
14767 } procS;
14768
14769 static procS cur_proc;
14770 static procS *cur_proc_ptr;
14771 static int numprocs;
14772
14773 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14774    nop as "0".  */
14775
14776 char
14777 mips_nop_opcode (void)
14778 {
14779   return seg_info (now_seg)->tc_segment_info_data.mips16;
14780 }
14781
14782 /* Fill in an rs_align_code fragment.  This only needs to do something
14783    for MIPS16 code, where 0 is not a nop.  */
14784
14785 void
14786 mips_handle_align (fragS *fragp)
14787 {
14788   char *p;
14789
14790   if (fragp->fr_type != rs_align_code)
14791     return;
14792
14793   p = fragp->fr_literal + fragp->fr_fix;
14794   if (*p)
14795     {
14796       int bytes;
14797
14798       bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14799       if (bytes & 1)
14800         {
14801           *p++ = 0;
14802           fragp->fr_fix++;
14803         }
14804       md_number_to_chars (p, mips16_nop_insn.insn_opcode, 2);
14805       fragp->fr_var = 2;
14806     }
14807 }
14808
14809 static void
14810 md_obj_begin (void)
14811 {
14812 }
14813
14814 static void
14815 md_obj_end (void)
14816 {
14817   /* Check for premature end, nesting errors, etc.  */
14818   if (cur_proc_ptr)
14819     as_warn (_("missing .end at end of assembly"));
14820 }
14821
14822 static long
14823 get_number (void)
14824 {
14825   int negative = 0;
14826   long val = 0;
14827
14828   if (*input_line_pointer == '-')
14829     {
14830       ++input_line_pointer;
14831       negative = 1;
14832     }
14833   if (!ISDIGIT (*input_line_pointer))
14834     as_bad (_("expected simple number"));
14835   if (input_line_pointer[0] == '0')
14836     {
14837       if (input_line_pointer[1] == 'x')
14838         {
14839           input_line_pointer += 2;
14840           while (ISXDIGIT (*input_line_pointer))
14841             {
14842               val <<= 4;
14843               val |= hex_value (*input_line_pointer++);
14844             }
14845           return negative ? -val : val;
14846         }
14847       else
14848         {
14849           ++input_line_pointer;
14850           while (ISDIGIT (*input_line_pointer))
14851             {
14852               val <<= 3;
14853               val |= *input_line_pointer++ - '0';
14854             }
14855           return negative ? -val : val;
14856         }
14857     }
14858   if (!ISDIGIT (*input_line_pointer))
14859     {
14860       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
14861               *input_line_pointer, *input_line_pointer);
14862       as_warn (_("invalid number"));
14863       return -1;
14864     }
14865   while (ISDIGIT (*input_line_pointer))
14866     {
14867       val *= 10;
14868       val += *input_line_pointer++ - '0';
14869     }
14870   return negative ? -val : val;
14871 }
14872
14873 /* The .file directive; just like the usual .file directive, but there
14874    is an initial number which is the ECOFF file index.  In the non-ECOFF
14875    case .file implies DWARF-2.  */
14876
14877 static void
14878 s_mips_file (int x ATTRIBUTE_UNUSED)
14879 {
14880   static int first_file_directive = 0;
14881
14882   if (ECOFF_DEBUGGING)
14883     {
14884       get_number ();
14885       s_app_file (0);
14886     }
14887   else
14888     {
14889       char *filename;
14890
14891       filename = dwarf2_directive_file (0);
14892
14893       /* Versions of GCC up to 3.1 start files with a ".file"
14894          directive even for stabs output.  Make sure that this
14895          ".file" is handled.  Note that you need a version of GCC
14896          after 3.1 in order to support DWARF-2 on MIPS.  */
14897       if (filename != NULL && ! first_file_directive)
14898         {
14899           (void) new_logical_line (filename, -1);
14900           s_app_file_string (filename, 0);
14901         }
14902       first_file_directive = 1;
14903     }
14904 }
14905
14906 /* The .loc directive, implying DWARF-2.  */
14907
14908 static void
14909 s_mips_loc (int x ATTRIBUTE_UNUSED)
14910 {
14911   if (!ECOFF_DEBUGGING)
14912     dwarf2_directive_loc (0);
14913 }
14914
14915 /* The .end directive.  */
14916
14917 static void
14918 s_mips_end (int x ATTRIBUTE_UNUSED)
14919 {
14920   symbolS *p;
14921
14922   /* Following functions need their own .frame and .cprestore directives.  */
14923   mips_frame_reg_valid = 0;
14924   mips_cprestore_valid = 0;
14925
14926   if (!is_end_of_line[(unsigned char) *input_line_pointer])
14927     {
14928       p = get_symbol ();
14929       demand_empty_rest_of_line ();
14930     }
14931   else
14932     p = NULL;
14933
14934   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
14935     as_warn (_(".end not in text section"));
14936
14937   if (!cur_proc_ptr)
14938     {
14939       as_warn (_(".end directive without a preceding .ent directive."));
14940       demand_empty_rest_of_line ();
14941       return;
14942     }
14943
14944   if (p != NULL)
14945     {
14946       gas_assert (S_GET_NAME (p));
14947       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
14948         as_warn (_(".end symbol does not match .ent symbol."));
14949
14950       if (debug_type == DEBUG_STABS)
14951         stabs_generate_asm_endfunc (S_GET_NAME (p),
14952                                     S_GET_NAME (p));
14953     }
14954   else
14955     as_warn (_(".end directive missing or unknown symbol"));
14956
14957 #ifdef OBJ_ELF
14958   /* Create an expression to calculate the size of the function.  */
14959   if (p && cur_proc_ptr)
14960     {
14961       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
14962       expressionS *exp = xmalloc (sizeof (expressionS));
14963
14964       obj->size = exp;
14965       exp->X_op = O_subtract;
14966       exp->X_add_symbol = symbol_temp_new_now ();
14967       exp->X_op_symbol = p;
14968       exp->X_add_number = 0;
14969
14970       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
14971     }
14972
14973   /* Generate a .pdr section.  */
14974   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
14975     {
14976       segT saved_seg = now_seg;
14977       subsegT saved_subseg = now_subseg;
14978       valueT dot;
14979       expressionS exp;
14980       char *fragp;
14981
14982       dot = frag_now_fix ();
14983
14984 #ifdef md_flush_pending_output
14985       md_flush_pending_output ();
14986 #endif
14987
14988       gas_assert (pdr_seg);
14989       subseg_set (pdr_seg, 0);
14990
14991       /* Write the symbol.  */
14992       exp.X_op = O_symbol;
14993       exp.X_add_symbol = p;
14994       exp.X_add_number = 0;
14995       emit_expr (&exp, 4);
14996
14997       fragp = frag_more (7 * 4);
14998
14999       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15000       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15001       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15002       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15003       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15004       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15005       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15006
15007       subseg_set (saved_seg, saved_subseg);
15008     }
15009 #endif /* OBJ_ELF */
15010
15011   cur_proc_ptr = NULL;
15012 }
15013
15014 /* The .aent and .ent directives.  */
15015
15016 static void
15017 s_mips_ent (int aent)
15018 {
15019   symbolS *symbolP;
15020
15021   symbolP = get_symbol ();
15022   if (*input_line_pointer == ',')
15023     ++input_line_pointer;
15024   SKIP_WHITESPACE ();
15025   if (ISDIGIT (*input_line_pointer)
15026       || *input_line_pointer == '-')
15027     get_number ();
15028
15029   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15030     as_warn (_(".ent or .aent not in text section."));
15031
15032   if (!aent && cur_proc_ptr)
15033     as_warn (_("missing .end"));
15034
15035   if (!aent)
15036     {
15037       /* This function needs its own .frame and .cprestore directives.  */
15038       mips_frame_reg_valid = 0;
15039       mips_cprestore_valid = 0;
15040
15041       cur_proc_ptr = &cur_proc;
15042       memset (cur_proc_ptr, '\0', sizeof (procS));
15043
15044       cur_proc_ptr->func_sym = symbolP;
15045
15046       symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15047
15048       ++numprocs;
15049
15050       if (debug_type == DEBUG_STABS)
15051         stabs_generate_asm_func (S_GET_NAME (symbolP),
15052                                  S_GET_NAME (symbolP));
15053     }
15054
15055   demand_empty_rest_of_line ();
15056 }
15057
15058 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15059    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15060    s_mips_frame is used so that we can set the PDR information correctly.
15061    We can't use the ecoff routines because they make reference to the ecoff
15062    symbol table (in the mdebug section).  */
15063
15064 static void
15065 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15066 {
15067 #ifdef OBJ_ELF
15068   if (IS_ELF && !ECOFF_DEBUGGING)
15069     {
15070       long val;
15071
15072       if (cur_proc_ptr == (procS *) NULL)
15073         {
15074           as_warn (_(".frame outside of .ent"));
15075           demand_empty_rest_of_line ();
15076           return;
15077         }
15078
15079       cur_proc_ptr->frame_reg = tc_get_register (1);
15080
15081       SKIP_WHITESPACE ();
15082       if (*input_line_pointer++ != ','
15083           || get_absolute_expression_and_terminator (&val) != ',')
15084         {
15085           as_warn (_("Bad .frame directive"));
15086           --input_line_pointer;
15087           demand_empty_rest_of_line ();
15088           return;
15089         }
15090
15091       cur_proc_ptr->frame_offset = val;
15092       cur_proc_ptr->pc_reg = tc_get_register (0);
15093
15094       demand_empty_rest_of_line ();
15095     }
15096   else
15097 #endif /* OBJ_ELF */
15098     s_ignore (ignore);
15099 }
15100
15101 /* The .fmask and .mask directives. If the mdebug section is present
15102    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15103    embedded targets, s_mips_mask is used so that we can set the PDR
15104    information correctly. We can't use the ecoff routines because they
15105    make reference to the ecoff symbol table (in the mdebug section).  */
15106
15107 static void
15108 s_mips_mask (int reg_type)
15109 {
15110 #ifdef OBJ_ELF
15111   if (IS_ELF && !ECOFF_DEBUGGING)
15112     {
15113       long mask, off;
15114
15115       if (cur_proc_ptr == (procS *) NULL)
15116         {
15117           as_warn (_(".mask/.fmask outside of .ent"));
15118           demand_empty_rest_of_line ();
15119           return;
15120         }
15121
15122       if (get_absolute_expression_and_terminator (&mask) != ',')
15123         {
15124           as_warn (_("Bad .mask/.fmask directive"));
15125           --input_line_pointer;
15126           demand_empty_rest_of_line ();
15127           return;
15128         }
15129
15130       off = get_absolute_expression ();
15131
15132       if (reg_type == 'F')
15133         {
15134           cur_proc_ptr->fpreg_mask = mask;
15135           cur_proc_ptr->fpreg_offset = off;
15136         }
15137       else
15138         {
15139           cur_proc_ptr->reg_mask = mask;
15140           cur_proc_ptr->reg_offset = off;
15141         }
15142
15143       demand_empty_rest_of_line ();
15144     }
15145   else
15146 #endif /* OBJ_ELF */
15147     s_ignore (reg_type);
15148 }
15149
15150 /* A table describing all the processors gas knows about.  Names are
15151    matched in the order listed.
15152
15153    To ease comparison, please keep this table in the same order as
15154    gcc's mips_cpu_info_table[].  */
15155 static const struct mips_cpu_info mips_cpu_info_table[] =
15156 {
15157   /* Entries for generic ISAs */
15158   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15159   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15160   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15161   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15162   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15163   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15164   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15165   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15166   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15167
15168   /* MIPS I */
15169   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15170   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15171   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15172
15173   /* MIPS II */
15174   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15175
15176   /* MIPS III */
15177   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15178   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15179   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15180   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15181   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15182   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15183   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15184   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15185   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15186   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15187   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15188   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15189   /* ST Microelectronics Loongson 2E and 2F cores */
15190   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15191   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15192
15193   /* MIPS IV */
15194   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15195   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15196   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15197   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15198   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15199   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15200   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15201   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15202   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15203   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15204   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15205   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15206   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15207   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15208   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15209
15210   /* MIPS 32 */
15211   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15212   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15213   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15214   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15215
15216   /* MIPS 32 Release 2 */
15217   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15218   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15219   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15220   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15221   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15222   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15223   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15224   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15225   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15226   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15227   /* Deprecated forms of the above.  */
15228   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15229   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15230   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15231   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15232   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15233   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15234   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15235   /* Deprecated forms of the above.  */
15236   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15237   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15238   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15239   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15240                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15241   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15242                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15243   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15244                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15245   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15246                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15247   /* Deprecated forms of the above.  */
15248   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15249                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15250   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15251                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15252   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15253   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15254                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15255   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15256                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15257   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15258                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15259   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15260                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15261   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15262                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15263   /* Deprecated forms of the above.  */
15264   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15265                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15266   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15267                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15268   /* 1004K cores are multiprocessor versions of the 34K.  */
15269   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15270                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15271   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15272                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15273   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15274                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15275   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15276                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15277
15278   /* MIPS 64 */
15279   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15280   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15281   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15282   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15283
15284   /* Broadcom SB-1 CPU core */
15285   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15286                                                 ISA_MIPS64,     CPU_SB1 },
15287   /* Broadcom SB-1A CPU core */
15288   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15289                                                 ISA_MIPS64,     CPU_SB1 },
15290
15291   /* MIPS 64 Release 2 */
15292
15293   /* Cavium Networks Octeon CPU core */
15294   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15295
15296   /* RMI Xlr */
15297   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15298
15299   /* End marker */
15300   { NULL, 0, 0, 0 }
15301 };
15302
15303
15304 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15305    with a final "000" replaced by "k".  Ignore case.
15306
15307    Note: this function is shared between GCC and GAS.  */
15308
15309 static bfd_boolean
15310 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15311 {
15312   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15313     given++, canonical++;
15314
15315   return ((*given == 0 && *canonical == 0)
15316           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15317 }
15318
15319
15320 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15321    CPU name.  We've traditionally allowed a lot of variation here.
15322
15323    Note: this function is shared between GCC and GAS.  */
15324
15325 static bfd_boolean
15326 mips_matching_cpu_name_p (const char *canonical, const char *given)
15327 {
15328   /* First see if the name matches exactly, or with a final "000"
15329      turned into "k".  */
15330   if (mips_strict_matching_cpu_name_p (canonical, given))
15331     return TRUE;
15332
15333   /* If not, try comparing based on numerical designation alone.
15334      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15335   if (TOLOWER (*given) == 'r')
15336     given++;
15337   if (!ISDIGIT (*given))
15338     return FALSE;
15339
15340   /* Skip over some well-known prefixes in the canonical name,
15341      hoping to find a number there too.  */
15342   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15343     canonical += 2;
15344   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15345     canonical += 2;
15346   else if (TOLOWER (canonical[0]) == 'r')
15347     canonical += 1;
15348
15349   return mips_strict_matching_cpu_name_p (canonical, given);
15350 }
15351
15352
15353 /* Parse an option that takes the name of a processor as its argument.
15354    OPTION is the name of the option and CPU_STRING is the argument.
15355    Return the corresponding processor enumeration if the CPU_STRING is
15356    recognized, otherwise report an error and return null.
15357
15358    A similar function exists in GCC.  */
15359
15360 static const struct mips_cpu_info *
15361 mips_parse_cpu (const char *option, const char *cpu_string)
15362 {
15363   const struct mips_cpu_info *p;
15364
15365   /* 'from-abi' selects the most compatible architecture for the given
15366      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15367      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15368      version.  Look first at the -mgp options, if given, otherwise base
15369      the choice on MIPS_DEFAULT_64BIT.
15370
15371      Treat NO_ABI like the EABIs.  One reason to do this is that the
15372      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15373      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15374      'mips64', just as we did in the days before 'from-abi'.  */
15375   if (strcasecmp (cpu_string, "from-abi") == 0)
15376     {
15377       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15378         return mips_cpu_info_from_isa (ISA_MIPS1);
15379
15380       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15381         return mips_cpu_info_from_isa (ISA_MIPS3);
15382
15383       if (file_mips_gp32 >= 0)
15384         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15385
15386       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15387                                      ? ISA_MIPS3
15388                                      : ISA_MIPS1);
15389     }
15390
15391   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15392   if (strcasecmp (cpu_string, "default") == 0)
15393     return 0;
15394
15395   for (p = mips_cpu_info_table; p->name != 0; p++)
15396     if (mips_matching_cpu_name_p (p->name, cpu_string))
15397       return p;
15398
15399   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15400   return 0;
15401 }
15402
15403 /* Return the canonical processor information for ISA (a member of the
15404    ISA_MIPS* enumeration).  */
15405
15406 static const struct mips_cpu_info *
15407 mips_cpu_info_from_isa (int isa)
15408 {
15409   int i;
15410
15411   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15412     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15413         && isa == mips_cpu_info_table[i].isa)
15414       return (&mips_cpu_info_table[i]);
15415
15416   return NULL;
15417 }
15418
15419 static const struct mips_cpu_info *
15420 mips_cpu_info_from_arch (int arch)
15421 {
15422   int i;
15423
15424   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15425     if (arch == mips_cpu_info_table[i].cpu)
15426       return (&mips_cpu_info_table[i]);
15427
15428   return NULL;
15429 }
15430 \f
15431 static void
15432 show (FILE *stream, const char *string, int *col_p, int *first_p)
15433 {
15434   if (*first_p)
15435     {
15436       fprintf (stream, "%24s", "");
15437       *col_p = 24;
15438     }
15439   else
15440     {
15441       fprintf (stream, ", ");
15442       *col_p += 2;
15443     }
15444
15445   if (*col_p + strlen (string) > 72)
15446     {
15447       fprintf (stream, "\n%24s", "");
15448       *col_p = 24;
15449     }
15450
15451   fprintf (stream, "%s", string);
15452   *col_p += strlen (string);
15453
15454   *first_p = 0;
15455 }
15456
15457 void
15458 md_show_usage (FILE *stream)
15459 {
15460   int column, first;
15461   size_t i;
15462
15463   fprintf (stream, _("\
15464 MIPS options:\n\
15465 -EB                     generate big endian output\n\
15466 -EL                     generate little endian output\n\
15467 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15468 -G NUM                  allow referencing objects up to NUM bytes\n\
15469                         implicitly with the gp register [default 8]\n"));
15470   fprintf (stream, _("\
15471 -mips1                  generate MIPS ISA I instructions\n\
15472 -mips2                  generate MIPS ISA II instructions\n\
15473 -mips3                  generate MIPS ISA III instructions\n\
15474 -mips4                  generate MIPS ISA IV instructions\n\
15475 -mips5                  generate MIPS ISA V instructions\n\
15476 -mips32                 generate MIPS32 ISA instructions\n\
15477 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15478 -mips64                 generate MIPS64 ISA instructions\n\
15479 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15480 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15481
15482   first = 1;
15483
15484   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15485     show (stream, mips_cpu_info_table[i].name, &column, &first);
15486   show (stream, "from-abi", &column, &first);
15487   fputc ('\n', stream);
15488
15489   fprintf (stream, _("\
15490 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15491 -no-mCPU                don't generate code specific to CPU.\n\
15492                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15493
15494   first = 1;
15495
15496   show (stream, "3900", &column, &first);
15497   show (stream, "4010", &column, &first);
15498   show (stream, "4100", &column, &first);
15499   show (stream, "4650", &column, &first);
15500   fputc ('\n', stream);
15501
15502   fprintf (stream, _("\
15503 -mips16                 generate mips16 instructions\n\
15504 -no-mips16              do not generate mips16 instructions\n"));
15505   fprintf (stream, _("\
15506 -msmartmips             generate smartmips instructions\n\
15507 -mno-smartmips          do not generate smartmips instructions\n"));  
15508   fprintf (stream, _("\
15509 -mdsp                   generate DSP instructions\n\
15510 -mno-dsp                do not generate DSP instructions\n"));
15511   fprintf (stream, _("\
15512 -mdspr2                 generate DSP R2 instructions\n\
15513 -mno-dspr2              do not generate DSP R2 instructions\n"));
15514   fprintf (stream, _("\
15515 -mmt                    generate MT instructions\n\
15516 -mno-mt                 do not generate MT instructions\n"));
15517   fprintf (stream, _("\
15518 -mfix-vr4120            work around certain VR4120 errata\n\
15519 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15520 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15521 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15522 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15523 -msym32                 assume all symbols have 32-bit values\n\
15524 -O0                     remove unneeded NOPs, do not swap branches\n\
15525 -O                      remove unneeded NOPs and swap branches\n\
15526 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15527 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15528   fprintf (stream, _("\
15529 -mhard-float            allow floating-point instructions\n\
15530 -msoft-float            do not allow floating-point instructions\n\
15531 -msingle-float          only allow 32-bit floating-point operations\n\
15532 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15533 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15534                      ));
15535 #ifdef OBJ_ELF
15536   fprintf (stream, _("\
15537 -KPIC, -call_shared     generate SVR4 position independent code\n\
15538 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15539 -mvxworks-pic           generate VxWorks position independent code\n\
15540 -non_shared             do not generate code that can operate with DSOs\n\
15541 -xgot                   assume a 32 bit GOT\n\
15542 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15543 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15544                         position dependent (non shared) code\n\
15545 -mabi=ABI               create ABI conformant object file for:\n"));
15546
15547   first = 1;
15548
15549   show (stream, "32", &column, &first);
15550   show (stream, "o64", &column, &first);
15551   show (stream, "n32", &column, &first);
15552   show (stream, "64", &column, &first);
15553   show (stream, "eabi", &column, &first);
15554
15555   fputc ('\n', stream);
15556
15557   fprintf (stream, _("\
15558 -32                     create o32 ABI object file (default)\n\
15559 -n32                    create n32 ABI object file\n\
15560 -64                     create 64 ABI object file\n"));
15561 #endif
15562 }
15563
15564 enum dwarf2_format
15565 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15566 {
15567   if (HAVE_64BIT_SYMBOLS)
15568     {
15569 #ifdef TE_IRIX
15570       return dwarf2_format_64bit_irix;
15571 #else
15572       return dwarf2_format_64bit;
15573 #endif
15574     }
15575   else
15576     return dwarf2_format_32bit;
15577 }
15578
15579 int
15580 mips_dwarf2_addr_size (void)
15581 {
15582   if (HAVE_64BIT_OBJECTS)
15583     return 8;
15584   else
15585     return 4;
15586 }
15587
15588 /* Standard calling conventions leave the CFA at SP on entry.  */
15589 void
15590 mips_cfi_frame_initial_instructions (void)
15591 {
15592   cfi_add_CFA_def_cfa_register (SP);
15593 }
15594
15595 int
15596 tc_mips_regname_to_dw2regnum (char *regname)
15597 {
15598   unsigned int regnum = -1;
15599   unsigned int reg;
15600
15601   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15602     regnum = reg;
15603
15604   return regnum;
15605 }