gas/
[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, 2010
4    Free Software Foundation, Inc.
5    Contributed by the OSF and Ralph Campbell.
6    Written by Keith Knowles and Ralph Campbell, working independently.
7    Modified for ECOFF and R4000 support by Ian Lance Taylor of Cygnus
8    Support.
9
10    This file is part of GAS.
11
12    GAS is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 3, or (at your option)
15    any later version.
16
17    GAS is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21
22    You should have received a copy of the GNU General Public License
23    along with GAS; see the file COPYING.  If not, write to the Free
24    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
25    02110-1301, USA.  */
26
27 #include "as.h"
28 #include "config.h"
29 #include "subsegs.h"
30 #include "safe-ctype.h"
31
32 #include "opcode/mips.h"
33 #include "itbl-ops.h"
34 #include "dwarf2dbg.h"
35 #include "dw2gencfi.h"
36
37 #ifdef DEBUG
38 #define DBG(x) printf x
39 #else
40 #define DBG(x)
41 #endif
42
43 #ifdef OBJ_MAYBE_ELF
44 /* Clean up namespace so we can include obj-elf.h too.  */
45 static int mips_output_flavor (void);
46 static int mips_output_flavor (void) { return OUTPUT_FLAVOR; }
47 #undef OBJ_PROCESS_STAB
48 #undef OUTPUT_FLAVOR
49 #undef S_GET_ALIGN
50 #undef S_GET_SIZE
51 #undef S_SET_ALIGN
52 #undef S_SET_SIZE
53 #undef obj_frob_file
54 #undef obj_frob_file_after_relocs
55 #undef obj_frob_symbol
56 #undef obj_pop_insert
57 #undef obj_sec_sym_ok_for_reloc
58 #undef OBJ_COPY_SYMBOL_ATTRIBUTES
59
60 #include "obj-elf.h"
61 /* Fix any of them that we actually care about.  */
62 #undef OUTPUT_FLAVOR
63 #define OUTPUT_FLAVOR mips_output_flavor()
64 #endif
65
66 #if defined (OBJ_ELF)
67 #include "elf/mips.h"
68 #endif
69
70 #ifndef ECOFF_DEBUGGING
71 #define NO_ECOFF_DEBUGGING
72 #define ECOFF_DEBUGGING 0
73 #endif
74
75 int mips_flag_mdebug = -1;
76
77 /* Control generation of .pdr sections.  Off by default on IRIX: the native
78    linker doesn't know about and discards them, but relocations against them
79    remain, leading to rld crashes.  */
80 #ifdef TE_IRIX
81 int mips_flag_pdr = FALSE;
82 #else
83 int mips_flag_pdr = TRUE;
84 #endif
85
86 #include "ecoff.h"
87
88 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
89 static char *mips_regmask_frag;
90 #endif
91
92 #define ZERO 0
93 #define ATREG 1
94 #define TREG 24
95 #define PIC_CALL_REG 25
96 #define KT0 26
97 #define KT1 27
98 #define GP  28
99 #define SP  29
100 #define FP  30
101 #define RA  31
102
103 #define ILLEGAL_REG (32)
104
105 #define AT  mips_opts.at
106
107 /* Allow override of standard little-endian ECOFF format.  */
108
109 #ifndef ECOFF_LITTLE_FORMAT
110 #define ECOFF_LITTLE_FORMAT "ecoff-littlemips"
111 #endif
112
113 extern int target_big_endian;
114
115 /* The name of the readonly data section.  */
116 #define RDATA_SECTION_NAME (OUTPUT_FLAVOR == bfd_target_ecoff_flavour \
117                             ? ".rdata" \
118                             : OUTPUT_FLAVOR == bfd_target_coff_flavour \
119                             ? ".rdata" \
120                             : OUTPUT_FLAVOR == bfd_target_elf_flavour \
121                             ? ".rodata" \
122                             : (abort (), ""))
123
124 /* Ways in which an instruction can be "appended" to the output.  */
125 enum append_method {
126   /* Just add it normally.  */
127   APPEND_ADD,
128
129   /* Add it normally and then add a nop.  */
130   APPEND_ADD_WITH_NOP,
131
132   /* Turn an instruction with a delay slot into a "compact" version.  */
133   APPEND_ADD_COMPACT,
134
135   /* Insert the instruction before the last one.  */
136   APPEND_SWAP
137 };
138
139 /* Information about an instruction, including its format, operands
140    and fixups.  */
141 struct mips_cl_insn
142 {
143   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
144   const struct mips_opcode *insn_mo;
145
146   /* True if this is a mips16 instruction and if we want the extended
147      form of INSN_MO.  */
148   bfd_boolean use_extend;
149
150   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
151   unsigned short extend;
152
153   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
154      a copy of INSN_MO->match with the operands filled in.  */
155   unsigned long insn_opcode;
156
157   /* The frag that contains the instruction.  */
158   struct frag *frag;
159
160   /* The offset into FRAG of the first instruction byte.  */
161   long where;
162
163   /* The relocs associated with the instruction, if any.  */
164   fixS *fixp[3];
165
166   /* True if this entry cannot be moved from its current position.  */
167   unsigned int fixed_p : 1;
168
169   /* True if this instruction occurred in a .set noreorder block.  */
170   unsigned int noreorder_p : 1;
171
172   /* True for mips16 instructions that jump to an absolute address.  */
173   unsigned int mips16_absolute_jump_p : 1;
174
175   /* True if this instruction is complete.  */
176   unsigned int complete_p : 1;
177 };
178
179 /* The ABI to use.  */
180 enum mips_abi_level
181 {
182   NO_ABI = 0,
183   O32_ABI,
184   O64_ABI,
185   N32_ABI,
186   N64_ABI,
187   EABI_ABI
188 };
189
190 /* MIPS ABI we are using for this output file.  */
191 static enum mips_abi_level mips_abi = NO_ABI;
192
193 /* Whether or not we have code that can call pic code.  */
194 int mips_abicalls = FALSE;
195
196 /* Whether or not we have code which can be put into a shared
197    library.  */
198 static bfd_boolean mips_in_shared = TRUE;
199
200 /* This is the set of options which may be modified by the .set
201    pseudo-op.  We use a struct so that .set push and .set pop are more
202    reliable.  */
203
204 struct mips_set_options
205 {
206   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
207      if it has not been initialized.  Changed by `.set mipsN', and the
208      -mipsN command line option, and the default CPU.  */
209   int isa;
210   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
211      if they have not been initialized.  Changed by `.set <asename>', by
212      command line options, and based on the default architecture.  */
213   int ase_mips3d;
214   int ase_mdmx;
215   int ase_smartmips;
216   int ase_dsp;
217   int ase_dspr2;
218   int ase_mt;
219   /* Whether we are assembling for the mips16 processor.  0 if we are
220      not, 1 if we are, and -1 if the value has not been initialized.
221      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
222      -nomips16 command line options, and the default CPU.  */
223   int mips16;
224   /* Non-zero if we should not reorder instructions.  Changed by `.set
225      reorder' and `.set noreorder'.  */
226   int noreorder;
227   /* Non-zero if we should not permit the register designated "assembler
228      temporary" to be used in instructions.  The value is the register
229      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
230      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
231   unsigned int at;
232   /* Non-zero if we should warn when a macro instruction expands into
233      more than one machine instruction.  Changed by `.set nomacro' and
234      `.set macro'.  */
235   int warn_about_macros;
236   /* Non-zero if we should not move instructions.  Changed by `.set
237      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
238   int nomove;
239   /* Non-zero if we should not optimize branches by moving the target
240      of the branch into the delay slot.  Actually, we don't perform
241      this optimization anyhow.  Changed by `.set bopt' and `.set
242      nobopt'.  */
243   int nobopt;
244   /* Non-zero if we should not autoextend mips16 instructions.
245      Changed by `.set autoextend' and `.set noautoextend'.  */
246   int noautoextend;
247   /* Restrict general purpose registers and floating point registers
248      to 32 bit.  This is initially determined when -mgp32 or -mfp32
249      is passed but can changed if the assembler code uses .set mipsN.  */
250   int gp32;
251   int fp32;
252   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
253      command line option, and the default CPU.  */
254   int arch;
255   /* True if ".set sym32" is in effect.  */
256   bfd_boolean sym32;
257   /* True if floating-point operations are not allowed.  Changed by .set
258      softfloat or .set hardfloat, by command line options -msoft-float or
259      -mhard-float.  The default is false.  */
260   bfd_boolean soft_float;
261
262   /* True if only single-precision floating-point operations are allowed.
263      Changed by .set singlefloat or .set doublefloat, command-line options
264      -msingle-float or -mdouble-float.  The default is false.  */
265   bfd_boolean single_float;
266 };
267
268 /* This is the struct we use to hold the current set of options.  Note
269    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
270    -1 to indicate that they have not been initialized.  */
271
272 /* True if -mgp32 was passed.  */
273 static int file_mips_gp32 = -1;
274
275 /* True if -mfp32 was passed.  */
276 static int file_mips_fp32 = -1;
277
278 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
279 static int file_mips_soft_float = 0;
280
281 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
282 static int file_mips_single_float = 0;
283
284 static struct mips_set_options mips_opts =
285 {
286   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
287   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
288   /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
289   /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
290   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
291   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
292 };
293
294 /* These variables are filled in with the masks of registers used.
295    The object format code reads them and puts them in the appropriate
296    place.  */
297 unsigned long mips_gprmask;
298 unsigned long mips_cprmask[4];
299
300 /* MIPS ISA we are using for this output file.  */
301 static int file_mips_isa = ISA_UNKNOWN;
302
303 /* True if any MIPS16 code was produced.  */
304 static int file_ase_mips16;
305
306 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
307                               || mips_opts.isa == ISA_MIPS32R2          \
308                               || mips_opts.isa == ISA_MIPS64            \
309                               || mips_opts.isa == ISA_MIPS64R2)
310
311 /* True if we want to create R_MIPS_JALR for jalr $25.  */
312 #ifdef TE_IRIX
313 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
314 #else
315 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
316    because there's no place for any addend, the only acceptable
317    expression is a bare symbol.  */
318 #define MIPS_JALR_HINT_P(EXPR) \
319   (!HAVE_IN_PLACE_ADDENDS \
320    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
321 #endif
322
323 /* True if -mips3d was passed or implied by arguments passed on the
324    command line (e.g., by -march).  */
325 static int file_ase_mips3d;
326
327 /* True if -mdmx was passed or implied by arguments passed on the
328    command line (e.g., by -march).  */
329 static int file_ase_mdmx;
330
331 /* True if -msmartmips was passed or implied by arguments passed on the
332    command line (e.g., by -march).  */
333 static int file_ase_smartmips;
334
335 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
336                                 || mips_opts.isa == ISA_MIPS32R2)
337
338 /* True if -mdsp was passed or implied by arguments passed on the
339    command line (e.g., by -march).  */
340 static int file_ase_dsp;
341
342 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
343                               || mips_opts.isa == ISA_MIPS64R2)
344
345 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
346
347 /* True if -mdspr2 was passed or implied by arguments passed on the
348    command line (e.g., by -march).  */
349 static int file_ase_dspr2;
350
351 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
352                                 || mips_opts.isa == ISA_MIPS64R2)
353
354 /* True if -mmt was passed or implied by arguments passed on the
355    command line (e.g., by -march).  */
356 static int file_ase_mt;
357
358 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
359                              || mips_opts.isa == ISA_MIPS64R2)
360
361 /* The argument of the -march= flag.  The architecture we are assembling.  */
362 static int file_mips_arch = CPU_UNKNOWN;
363 static const char *mips_arch_string;
364
365 /* The argument of the -mtune= flag.  The architecture for which we
366    are optimizing.  */
367 static int mips_tune = CPU_UNKNOWN;
368 static const char *mips_tune_string;
369
370 /* True when generating 32-bit code for a 64-bit processor.  */
371 static int mips_32bitmode = 0;
372
373 /* True if the given ABI requires 32-bit registers.  */
374 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
375
376 /* Likewise 64-bit registers.  */
377 #define ABI_NEEDS_64BIT_REGS(ABI)       \
378   ((ABI) == N32_ABI                     \
379    || (ABI) == N64_ABI                  \
380    || (ABI) == O64_ABI)
381
382 /*  Return true if ISA supports 64 bit wide gp registers.  */
383 #define ISA_HAS_64BIT_REGS(ISA)         \
384   ((ISA) == ISA_MIPS3                   \
385    || (ISA) == ISA_MIPS4                \
386    || (ISA) == ISA_MIPS5                \
387    || (ISA) == ISA_MIPS64               \
388    || (ISA) == ISA_MIPS64R2)
389
390 /*  Return true if ISA supports 64 bit wide float registers.  */
391 #define ISA_HAS_64BIT_FPRS(ISA)         \
392   ((ISA) == ISA_MIPS3                   \
393    || (ISA) == ISA_MIPS4                \
394    || (ISA) == ISA_MIPS5                \
395    || (ISA) == ISA_MIPS32R2             \
396    || (ISA) == ISA_MIPS64               \
397    || (ISA) == ISA_MIPS64R2)
398
399 /* Return true if ISA supports 64-bit right rotate (dror et al.)
400    instructions.  */
401 #define ISA_HAS_DROR(ISA)               \
402   ((ISA) == ISA_MIPS64R2)
403
404 /* Return true if ISA supports 32-bit right rotate (ror et al.)
405    instructions.  */
406 #define ISA_HAS_ROR(ISA)                \
407   ((ISA) == ISA_MIPS32R2                \
408    || (ISA) == ISA_MIPS64R2             \
409    || mips_opts.ase_smartmips)
410
411 /* Return true if ISA supports single-precision floats in odd registers.  */
412 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
413   ((ISA) == ISA_MIPS32                  \
414    || (ISA) == ISA_MIPS32R2             \
415    || (ISA) == ISA_MIPS64               \
416    || (ISA) == ISA_MIPS64R2)
417
418 /* Return true if ISA supports move to/from high part of a 64-bit
419    floating-point register. */
420 #define ISA_HAS_MXHC1(ISA)              \
421   ((ISA) == ISA_MIPS32R2                \
422    || (ISA) == ISA_MIPS64R2)
423
424 #define HAVE_32BIT_GPRS                            \
425     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
426
427 #define HAVE_32BIT_FPRS                            \
428     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
429
430 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
431 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
432
433 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
434
435 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
436
437 /* True if relocations are stored in-place.  */
438 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
439
440 /* The ABI-derived address size.  */
441 #define HAVE_64BIT_ADDRESSES \
442   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
443 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
444
445 /* The size of symbolic constants (i.e., expressions of the form
446    "SYMBOL" or "SYMBOL + OFFSET").  */
447 #define HAVE_32BIT_SYMBOLS \
448   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
449 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
450
451 /* Addresses are loaded in different ways, depending on the address size
452    in use.  The n32 ABI Documentation also mandates the use of additions
453    with overflow checking, but existing implementations don't follow it.  */
454 #define ADDRESS_ADD_INSN                                                \
455    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
456
457 #define ADDRESS_ADDI_INSN                                               \
458    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
459
460 #define ADDRESS_LOAD_INSN                                               \
461    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
462
463 #define ADDRESS_STORE_INSN                                              \
464    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
465
466 /* Return true if the given CPU supports the MIPS16 ASE.  */
467 #define CPU_HAS_MIPS16(cpu)                                             \
468    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
469     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
470
471 /* True if CPU has a dror instruction.  */
472 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
473
474 /* True if CPU has a ror instruction.  */
475 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
476
477 /* True if CPU has seq/sne and seqi/snei instructions.  */
478 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
479
480 /* True if CPU does not implement the all the coprocessor insns.  For these
481    CPUs only those COP insns are accepted that are explicitly marked to be
482    available on the CPU.  ISA membership for COP insns is ignored.  */
483 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
484
485 /* True if mflo and mfhi can be immediately followed by instructions
486    which write to the HI and LO registers.
487
488    According to MIPS specifications, MIPS ISAs I, II, and III need
489    (at least) two instructions between the reads of HI/LO and
490    instructions which write them, and later ISAs do not.  Contradicting
491    the MIPS specifications, some MIPS IV processor user manuals (e.g.
492    the UM for the NEC Vr5000) document needing the instructions between
493    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
494    MIPS64 and later ISAs to have the interlocks, plus any specific
495    earlier-ISA CPUs for which CPU documentation declares that the
496    instructions are really interlocked.  */
497 #define hilo_interlocks \
498   (mips_opts.isa == ISA_MIPS32                        \
499    || mips_opts.isa == ISA_MIPS32R2                   \
500    || mips_opts.isa == ISA_MIPS64                     \
501    || mips_opts.isa == ISA_MIPS64R2                   \
502    || mips_opts.arch == CPU_R4010                     \
503    || mips_opts.arch == CPU_R10000                    \
504    || mips_opts.arch == CPU_R12000                    \
505    || mips_opts.arch == CPU_R14000                    \
506    || mips_opts.arch == CPU_R16000                    \
507    || mips_opts.arch == CPU_RM7000                    \
508    || mips_opts.arch == CPU_VR5500                    \
509    )
510
511 /* Whether the processor uses hardware interlocks to protect reads
512    from the GPRs after they are loaded from memory, and thus does not
513    require nops to be inserted.  This applies to instructions marked
514    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
515    level I.  */
516 #define gpr_interlocks \
517   (mips_opts.isa != ISA_MIPS1  \
518    || mips_opts.arch == CPU_R3900)
519
520 /* Whether the processor uses hardware interlocks to avoid delays
521    required by coprocessor instructions, and thus does not require
522    nops to be inserted.  This applies to instructions marked
523    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
524    between instructions marked INSN_WRITE_COND_CODE and ones marked
525    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
526    levels I, II, and III.  */
527 /* Itbl support may require additional care here.  */
528 #define cop_interlocks                                \
529   ((mips_opts.isa != ISA_MIPS1                        \
530     && mips_opts.isa != ISA_MIPS2                     \
531     && mips_opts.isa != ISA_MIPS3)                    \
532    || mips_opts.arch == CPU_R4300                     \
533    )
534
535 /* Whether the processor uses hardware interlocks to protect reads
536    from coprocessor registers after they are loaded from memory, and
537    thus does not require nops to be inserted.  This applies to
538    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
539    requires at MIPS ISA level I.  */
540 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
541
542 /* Is this a mfhi or mflo instruction?  */
543 #define MF_HILO_INSN(PINFO) \
544   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
545
546 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
547    or writing the condition code is only possible on the coprocessors and
548    these insns are not marked with INSN_COP.  Thus for these insns use the
549    condition-code flags.  */
550 #define COP_INSN(PINFO)                                                 \
551   (PINFO != INSN_MACRO                                                  \
552    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
553    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
554
555 /* MIPS PIC level.  */
556
557 enum mips_pic_level mips_pic;
558
559 /* 1 if we should generate 32 bit offsets from the $gp register in
560    SVR4_PIC mode.  Currently has no meaning in other modes.  */
561 static int mips_big_got = 0;
562
563 /* 1 if trap instructions should used for overflow rather than break
564    instructions.  */
565 static int mips_trap = 0;
566
567 /* 1 if double width floating point constants should not be constructed
568    by assembling two single width halves into two single width floating
569    point registers which just happen to alias the double width destination
570    register.  On some architectures this aliasing can be disabled by a bit
571    in the status register, and the setting of this bit cannot be determined
572    automatically at assemble time.  */
573 static int mips_disable_float_construction;
574
575 /* Non-zero if any .set noreorder directives were used.  */
576
577 static int mips_any_noreorder;
578
579 /* Non-zero if nops should be inserted when the register referenced in
580    an mfhi/mflo instruction is read in the next two instructions.  */
581 static int mips_7000_hilo_fix;
582
583 /* The size of objects in the small data section.  */
584 static unsigned int g_switch_value = 8;
585 /* Whether the -G option was used.  */
586 static int g_switch_seen = 0;
587
588 #define N_RMASK 0xc4
589 #define N_VFP   0xd4
590
591 /* If we can determine in advance that GP optimization won't be
592    possible, we can skip the relaxation stuff that tries to produce
593    GP-relative references.  This makes delay slot optimization work
594    better.
595
596    This function can only provide a guess, but it seems to work for
597    gcc output.  It needs to guess right for gcc, otherwise gcc
598    will put what it thinks is a GP-relative instruction in a branch
599    delay slot.
600
601    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
602    fixed it for the non-PIC mode.  KR 95/04/07  */
603 static int nopic_need_relax (symbolS *, int);
604
605 /* handle of the OPCODE hash table */
606 static struct hash_control *op_hash = NULL;
607
608 /* The opcode hash table we use for the mips16.  */
609 static struct hash_control *mips16_op_hash = NULL;
610
611 /* This array holds the chars that always start a comment.  If the
612     pre-processor is disabled, these aren't very useful */
613 const char comment_chars[] = "#";
614
615 /* This array holds the chars that only start a comment at the beginning of
616    a line.  If the line seems to have the form '# 123 filename'
617    .line and .file directives will appear in the pre-processed output */
618 /* Note that input_file.c hand checks for '#' at the beginning of the
619    first line of the input file.  This is because the compiler outputs
620    #NO_APP at the beginning of its output.  */
621 /* Also note that C style comments are always supported.  */
622 const char line_comment_chars[] = "#";
623
624 /* This array holds machine specific line separator characters.  */
625 const char line_separator_chars[] = ";";
626
627 /* Chars that can be used to separate mant from exp in floating point nums */
628 const char EXP_CHARS[] = "eE";
629
630 /* Chars that mean this number is a floating point constant */
631 /* As in 0f12.456 */
632 /* or    0d1.2345e12 */
633 const char FLT_CHARS[] = "rRsSfFdDxXpP";
634
635 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
636    changed in read.c .  Ideally it shouldn't have to know about it at all,
637    but nothing is ideal around here.
638  */
639
640 static char *insn_error;
641
642 static int auto_align = 1;
643
644 /* When outputting SVR4 PIC code, the assembler needs to know the
645    offset in the stack frame from which to restore the $gp register.
646    This is set by the .cprestore pseudo-op, and saved in this
647    variable.  */
648 static offsetT mips_cprestore_offset = -1;
649
650 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
651    more optimizations, it can use a register value instead of a memory-saved
652    offset and even an other register than $gp as global pointer.  */
653 static offsetT mips_cpreturn_offset = -1;
654 static int mips_cpreturn_register = -1;
655 static int mips_gp_register = GP;
656 static int mips_gprel_offset = 0;
657
658 /* Whether mips_cprestore_offset has been set in the current function
659    (or whether it has already been warned about, if not).  */
660 static int mips_cprestore_valid = 0;
661
662 /* This is the register which holds the stack frame, as set by the
663    .frame pseudo-op.  This is needed to implement .cprestore.  */
664 static int mips_frame_reg = SP;
665
666 /* Whether mips_frame_reg has been set in the current function
667    (or whether it has already been warned about, if not).  */
668 static int mips_frame_reg_valid = 0;
669
670 /* To output NOP instructions correctly, we need to keep information
671    about the previous two instructions.  */
672
673 /* Whether we are optimizing.  The default value of 2 means to remove
674    unneeded NOPs and swap branch instructions when possible.  A value
675    of 1 means to not swap branches.  A value of 0 means to always
676    insert NOPs.  */
677 static int mips_optimize = 2;
678
679 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
680    equivalent to seeing no -g option at all.  */
681 static int mips_debug = 0;
682
683 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
684 #define MAX_VR4130_NOPS 4
685
686 /* The maximum number of NOPs needed to fill delay slots.  */
687 #define MAX_DELAY_NOPS 2
688
689 /* The maximum number of NOPs needed for any purpose.  */
690 #define MAX_NOPS 4
691
692 /* A list of previous instructions, with index 0 being the most recent.
693    We need to look back MAX_NOPS instructions when filling delay slots
694    or working around processor errata.  We need to look back one
695    instruction further if we're thinking about using history[0] to
696    fill a branch delay slot.  */
697 static struct mips_cl_insn history[1 + MAX_NOPS];
698
699 /* Nop instructions used by emit_nop.  */
700 static struct mips_cl_insn nop_insn, mips16_nop_insn;
701
702 /* The appropriate nop for the current mode.  */
703 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
704
705 /* If this is set, it points to a frag holding nop instructions which
706    were inserted before the start of a noreorder section.  If those
707    nops turn out to be unnecessary, the size of the frag can be
708    decreased.  */
709 static fragS *prev_nop_frag;
710
711 /* The number of nop instructions we created in prev_nop_frag.  */
712 static int prev_nop_frag_holds;
713
714 /* The number of nop instructions that we know we need in
715    prev_nop_frag.  */
716 static int prev_nop_frag_required;
717
718 /* The number of instructions we've seen since prev_nop_frag.  */
719 static int prev_nop_frag_since;
720
721 /* For ECOFF and ELF, relocations against symbols are done in two
722    parts, with a HI relocation and a LO relocation.  Each relocation
723    has only 16 bits of space to store an addend.  This means that in
724    order for the linker to handle carries correctly, it must be able
725    to locate both the HI and the LO relocation.  This means that the
726    relocations must appear in order in the relocation table.
727
728    In order to implement this, we keep track of each unmatched HI
729    relocation.  We then sort them so that they immediately precede the
730    corresponding LO relocation.  */
731
732 struct mips_hi_fixup
733 {
734   /* Next HI fixup.  */
735   struct mips_hi_fixup *next;
736   /* This fixup.  */
737   fixS *fixp;
738   /* The section this fixup is in.  */
739   segT seg;
740 };
741
742 /* The list of unmatched HI relocs.  */
743
744 static struct mips_hi_fixup *mips_hi_fixup_list;
745
746 /* The frag containing the last explicit relocation operator.
747    Null if explicit relocations have not been used.  */
748
749 static fragS *prev_reloc_op_frag;
750
751 /* Map normal MIPS register numbers to mips16 register numbers.  */
752
753 #define X ILLEGAL_REG
754 static const int mips32_to_16_reg_map[] =
755 {
756   X, X, 2, 3, 4, 5, 6, 7,
757   X, X, X, X, X, X, X, X,
758   0, 1, X, X, X, X, X, X,
759   X, X, X, X, X, X, X, X
760 };
761 #undef X
762
763 /* Map mips16 register numbers to normal MIPS register numbers.  */
764
765 static const unsigned int mips16_to_32_reg_map[] =
766 {
767   16, 17, 2, 3, 4, 5, 6, 7
768 };
769
770 /* Classifies the kind of instructions we're interested in when
771    implementing -mfix-vr4120.  */
772 enum fix_vr4120_class
773 {
774   FIX_VR4120_MACC,
775   FIX_VR4120_DMACC,
776   FIX_VR4120_MULT,
777   FIX_VR4120_DMULT,
778   FIX_VR4120_DIV,
779   FIX_VR4120_MTHILO,
780   NUM_FIX_VR4120_CLASSES
781 };
782
783 /* ...likewise -mfix-loongson2f-jump.  */
784 static bfd_boolean mips_fix_loongson2f_jump;
785
786 /* ...likewise -mfix-loongson2f-nop.  */
787 static bfd_boolean mips_fix_loongson2f_nop;
788
789 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
790 static bfd_boolean mips_fix_loongson2f;
791
792 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
793    there must be at least one other instruction between an instruction
794    of type X and an instruction of type Y.  */
795 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
796
797 /* True if -mfix-vr4120 is in force.  */
798 static int mips_fix_vr4120;
799
800 /* ...likewise -mfix-vr4130.  */
801 static int mips_fix_vr4130;
802
803 /* ...likewise -mfix-24k.  */
804 static int mips_fix_24k;
805
806 /* ...likewise -mfix-cn63xxp1 */
807 static bfd_boolean mips_fix_cn63xxp1;
808
809 /* We don't relax branches by default, since this causes us to expand
810    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
811    fail to compute the offset before expanding the macro to the most
812    efficient expansion.  */
813
814 static int mips_relax_branch;
815 \f
816 /* The expansion of many macros depends on the type of symbol that
817    they refer to.  For example, when generating position-dependent code,
818    a macro that refers to a symbol may have two different expansions,
819    one which uses GP-relative addresses and one which uses absolute
820    addresses.  When generating SVR4-style PIC, a macro may have
821    different expansions for local and global symbols.
822
823    We handle these situations by generating both sequences and putting
824    them in variant frags.  In position-dependent code, the first sequence
825    will be the GP-relative one and the second sequence will be the
826    absolute one.  In SVR4 PIC, the first sequence will be for global
827    symbols and the second will be for local symbols.
828
829    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
830    SECOND are the lengths of the two sequences in bytes.  These fields
831    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
832    the subtype has the following flags:
833
834    RELAX_USE_SECOND
835         Set if it has been decided that we should use the second
836         sequence instead of the first.
837
838    RELAX_SECOND_LONGER
839         Set in the first variant frag if the macro's second implementation
840         is longer than its first.  This refers to the macro as a whole,
841         not an individual relaxation.
842
843    RELAX_NOMACRO
844         Set in the first variant frag if the macro appeared in a .set nomacro
845         block and if one alternative requires a warning but the other does not.
846
847    RELAX_DELAY_SLOT
848         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
849         delay slot.
850
851    The frag's "opcode" points to the first fixup for relaxable code.
852
853    Relaxable macros are generated using a sequence such as:
854
855       relax_start (SYMBOL);
856       ... generate first expansion ...
857       relax_switch ();
858       ... generate second expansion ...
859       relax_end ();
860
861    The code and fixups for the unwanted alternative are discarded
862    by md_convert_frag.  */
863 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
864
865 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
866 #define RELAX_SECOND(X) ((X) & 0xff)
867 #define RELAX_USE_SECOND 0x10000
868 #define RELAX_SECOND_LONGER 0x20000
869 #define RELAX_NOMACRO 0x40000
870 #define RELAX_DELAY_SLOT 0x80000
871
872 /* Branch without likely bit.  If label is out of range, we turn:
873
874         beq reg1, reg2, label
875         delay slot
876
877    into
878
879         bne reg1, reg2, 0f
880         nop
881         j label
882      0: delay slot
883
884    with the following opcode replacements:
885
886         beq <-> bne
887         blez <-> bgtz
888         bltz <-> bgez
889         bc1f <-> bc1t
890
891         bltzal <-> bgezal  (with jal label instead of j label)
892
893    Even though keeping the delay slot instruction in the delay slot of
894    the branch would be more efficient, it would be very tricky to do
895    correctly, because we'd have to introduce a variable frag *after*
896    the delay slot instruction, and expand that instead.  Let's do it
897    the easy way for now, even if the branch-not-taken case now costs
898    one additional instruction.  Out-of-range branches are not supposed
899    to be common, anyway.
900
901    Branch likely.  If label is out of range, we turn:
902
903         beql reg1, reg2, label
904         delay slot (annulled if branch not taken)
905
906    into
907
908         beql reg1, reg2, 1f
909         nop
910         beql $0, $0, 2f
911         nop
912      1: j[al] label
913         delay slot (executed only if branch taken)
914      2:
915
916    It would be possible to generate a shorter sequence by losing the
917    likely bit, generating something like:
918
919         bne reg1, reg2, 0f
920         nop
921         j[al] label
922         delay slot (executed only if branch taken)
923      0:
924
925         beql -> bne
926         bnel -> beq
927         blezl -> bgtz
928         bgtzl -> blez
929         bltzl -> bgez
930         bgezl -> bltz
931         bc1fl -> bc1t
932         bc1tl -> bc1f
933
934         bltzall -> bgezal  (with jal label instead of j label)
935         bgezall -> bltzal  (ditto)
936
937
938    but it's not clear that it would actually improve performance.  */
939 #define RELAX_BRANCH_ENCODE(at, uncond, likely, link, toofar)   \
940   ((relax_substateT)                                            \
941    (0xc0000000                                                  \
942     | ((at) & 0x1f)                                             \
943     | ((toofar) ? 0x20 : 0)                                     \
944     | ((link) ? 0x40 : 0)                                       \
945     | ((likely) ? 0x80 : 0)                                     \
946     | ((uncond) ? 0x100 : 0)))
947 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
948 #define RELAX_BRANCH_UNCOND(i) (((i) & 0x100) != 0)
949 #define RELAX_BRANCH_LIKELY(i) (((i) & 0x80) != 0)
950 #define RELAX_BRANCH_LINK(i) (((i) & 0x40) != 0)
951 #define RELAX_BRANCH_TOOFAR(i) (((i) & 0x20) != 0)
952 #define RELAX_BRANCH_AT(i) ((i) & 0x1f)
953
954 /* For mips16 code, we use an entirely different form of relaxation.
955    mips16 supports two versions of most instructions which take
956    immediate values: a small one which takes some small value, and a
957    larger one which takes a 16 bit value.  Since branches also follow
958    this pattern, relaxing these values is required.
959
960    We can assemble both mips16 and normal MIPS code in a single
961    object.  Therefore, we need to support this type of relaxation at
962    the same time that we support the relaxation described above.  We
963    use the high bit of the subtype field to distinguish these cases.
964
965    The information we store for this type of relaxation is the
966    argument code found in the opcode file for this relocation, whether
967    the user explicitly requested a small or extended form, and whether
968    the relocation is in a jump or jal delay slot.  That tells us the
969    size of the value, and how it should be stored.  We also store
970    whether the fragment is considered to be extended or not.  We also
971    store whether this is known to be a branch to a different section,
972    whether we have tried to relax this frag yet, and whether we have
973    ever extended a PC relative fragment because of a shift count.  */
974 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
975   (0x80000000                                                   \
976    | ((type) & 0xff)                                            \
977    | ((small) ? 0x100 : 0)                                      \
978    | ((ext) ? 0x200 : 0)                                        \
979    | ((dslot) ? 0x400 : 0)                                      \
980    | ((jal_dslot) ? 0x800 : 0))
981 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
982 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
983 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
984 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
985 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
986 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
987 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
988 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
989 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
990 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
991 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
992 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
993
994 /* Is the given value a sign-extended 32-bit value?  */
995 #define IS_SEXT_32BIT_NUM(x)                                            \
996   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
997    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
998
999 /* Is the given value a sign-extended 16-bit value?  */
1000 #define IS_SEXT_16BIT_NUM(x)                                            \
1001   (((x) &~ (offsetT) 0x7fff) == 0                                       \
1002    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
1003
1004 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
1005 #define IS_ZEXT_32BIT_NUM(x)                                            \
1006   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
1007    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
1008
1009 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
1010    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
1011 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
1012   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
1013               | (((VALUE) & (MASK)) << (SHIFT)))
1014
1015 /* Extract bits MASK << SHIFT from STRUCT and shift them right
1016    SHIFT places.  */
1017 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
1018   (((STRUCT) >> (SHIFT)) & (MASK))
1019
1020 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1021    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1022
1023    include/opcode/mips.h specifies operand fields using the macros
1024    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1025    with "MIPS16OP" instead of "OP".  */
1026 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1027   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1028 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1029   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1030                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1031
1032 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1033 #define EXTRACT_OPERAND(FIELD, INSN) \
1034   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1035 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1036   EXTRACT_BITS ((INSN).insn_opcode, \
1037                 MIPS16OP_MASK_##FIELD, \
1038                 MIPS16OP_SH_##FIELD)
1039 \f
1040 /* Global variables used when generating relaxable macros.  See the
1041    comment above RELAX_ENCODE for more details about how relaxation
1042    is used.  */
1043 static struct {
1044   /* 0 if we're not emitting a relaxable macro.
1045      1 if we're emitting the first of the two relaxation alternatives.
1046      2 if we're emitting the second alternative.  */
1047   int sequence;
1048
1049   /* The first relaxable fixup in the current frag.  (In other words,
1050      the first fixup that refers to relaxable code.)  */
1051   fixS *first_fixup;
1052
1053   /* sizes[0] says how many bytes of the first alternative are stored in
1054      the current frag.  Likewise sizes[1] for the second alternative.  */
1055   unsigned int sizes[2];
1056
1057   /* The symbol on which the choice of sequence depends.  */
1058   symbolS *symbol;
1059 } mips_relax;
1060 \f
1061 /* Global variables used to decide whether a macro needs a warning.  */
1062 static struct {
1063   /* True if the macro is in a branch delay slot.  */
1064   bfd_boolean delay_slot_p;
1065
1066   /* For relaxable macros, sizes[0] is the length of the first alternative
1067      in bytes and sizes[1] is the length of the second alternative.
1068      For non-relaxable macros, both elements give the length of the
1069      macro in bytes.  */
1070   unsigned int sizes[2];
1071
1072   /* The first variant frag for this macro.  */
1073   fragS *first_frag;
1074 } mips_macro_warning;
1075 \f
1076 /* Prototypes for static functions.  */
1077
1078 #define internalError()                                                 \
1079     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1080
1081 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1082
1083 static void append_insn
1084   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1085 static void mips_no_prev_insn (void);
1086 static void macro_build (expressionS *, const char *, const char *, ...);
1087 static void mips16_macro_build
1088   (expressionS *, const char *, const char *, va_list *);
1089 static void load_register (int, expressionS *, int);
1090 static void macro_start (void);
1091 static void macro_end (void);
1092 static void macro (struct mips_cl_insn * ip);
1093 static void mips16_macro (struct mips_cl_insn * ip);
1094 static void mips_ip (char *str, struct mips_cl_insn * ip);
1095 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1096 static void mips16_immed
1097   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1098    unsigned long *, bfd_boolean *, unsigned short *);
1099 static size_t my_getSmallExpression
1100   (expressionS *, bfd_reloc_code_real_type *, char *);
1101 static void my_getExpression (expressionS *, char *);
1102 static void s_align (int);
1103 static void s_change_sec (int);
1104 static void s_change_section (int);
1105 static void s_cons (int);
1106 static void s_float_cons (int);
1107 static void s_mips_globl (int);
1108 static void s_option (int);
1109 static void s_mipsset (int);
1110 static void s_abicalls (int);
1111 static void s_cpload (int);
1112 static void s_cpsetup (int);
1113 static void s_cplocal (int);
1114 static void s_cprestore (int);
1115 static void s_cpreturn (int);
1116 static void s_dtprelword (int);
1117 static void s_dtpreldword (int);
1118 static void s_gpvalue (int);
1119 static void s_gpword (int);
1120 static void s_gpdword (int);
1121 static void s_cpadd (int);
1122 static void s_insn (int);
1123 static void md_obj_begin (void);
1124 static void md_obj_end (void);
1125 static void s_mips_ent (int);
1126 static void s_mips_end (int);
1127 static void s_mips_frame (int);
1128 static void s_mips_mask (int reg_type);
1129 static void s_mips_stab (int);
1130 static void s_mips_weakext (int);
1131 static void s_mips_file (int);
1132 static void s_mips_loc (int);
1133 static bfd_boolean pic_need_relax (symbolS *, asection *);
1134 static int relaxed_branch_length (fragS *, asection *, int);
1135 static int validate_mips_insn (const struct mips_opcode *);
1136
1137 /* Table and functions used to map between CPU/ISA names, and
1138    ISA levels, and CPU numbers.  */
1139
1140 struct mips_cpu_info
1141 {
1142   const char *name;           /* CPU or ISA name.  */
1143   int flags;                  /* ASEs available, or ISA flag.  */
1144   int isa;                    /* ISA level.  */
1145   int cpu;                    /* CPU number (default CPU if ISA).  */
1146 };
1147
1148 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1149 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1150 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1151 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1152 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1153 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1154 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1155
1156 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1157 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1158 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1159 \f
1160 /* Pseudo-op table.
1161
1162    The following pseudo-ops from the Kane and Heinrich MIPS book
1163    should be defined here, but are currently unsupported: .alias,
1164    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1165
1166    The following pseudo-ops from the Kane and Heinrich MIPS book are
1167    specific to the type of debugging information being generated, and
1168    should be defined by the object format: .aent, .begin, .bend,
1169    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1170    .vreg.
1171
1172    The following pseudo-ops from the Kane and Heinrich MIPS book are
1173    not MIPS CPU specific, but are also not specific to the object file
1174    format.  This file is probably the best place to define them, but
1175    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1176
1177 static const pseudo_typeS mips_pseudo_table[] =
1178 {
1179   /* MIPS specific pseudo-ops.  */
1180   {"option", s_option, 0},
1181   {"set", s_mipsset, 0},
1182   {"rdata", s_change_sec, 'r'},
1183   {"sdata", s_change_sec, 's'},
1184   {"livereg", s_ignore, 0},
1185   {"abicalls", s_abicalls, 0},
1186   {"cpload", s_cpload, 0},
1187   {"cpsetup", s_cpsetup, 0},
1188   {"cplocal", s_cplocal, 0},
1189   {"cprestore", s_cprestore, 0},
1190   {"cpreturn", s_cpreturn, 0},
1191   {"dtprelword", s_dtprelword, 0},
1192   {"dtpreldword", s_dtpreldword, 0},
1193   {"gpvalue", s_gpvalue, 0},
1194   {"gpword", s_gpword, 0},
1195   {"gpdword", s_gpdword, 0},
1196   {"cpadd", s_cpadd, 0},
1197   {"insn", s_insn, 0},
1198
1199   /* Relatively generic pseudo-ops that happen to be used on MIPS
1200      chips.  */
1201   {"asciiz", stringer, 8 + 1},
1202   {"bss", s_change_sec, 'b'},
1203   {"err", s_err, 0},
1204   {"half", s_cons, 1},
1205   {"dword", s_cons, 3},
1206   {"weakext", s_mips_weakext, 0},
1207   {"origin", s_org, 0},
1208   {"repeat", s_rept, 0},
1209
1210   /* For MIPS this is non-standard, but we define it for consistency.  */
1211   {"sbss", s_change_sec, 'B'},
1212
1213   /* These pseudo-ops are defined in read.c, but must be overridden
1214      here for one reason or another.  */
1215   {"align", s_align, 0},
1216   {"byte", s_cons, 0},
1217   {"data", s_change_sec, 'd'},
1218   {"double", s_float_cons, 'd'},
1219   {"float", s_float_cons, 'f'},
1220   {"globl", s_mips_globl, 0},
1221   {"global", s_mips_globl, 0},
1222   {"hword", s_cons, 1},
1223   {"int", s_cons, 2},
1224   {"long", s_cons, 2},
1225   {"octa", s_cons, 4},
1226   {"quad", s_cons, 3},
1227   {"section", s_change_section, 0},
1228   {"short", s_cons, 1},
1229   {"single", s_float_cons, 'f'},
1230   {"stabn", s_mips_stab, 'n'},
1231   {"text", s_change_sec, 't'},
1232   {"word", s_cons, 2},
1233
1234   { "extern", ecoff_directive_extern, 0},
1235
1236   { NULL, NULL, 0 },
1237 };
1238
1239 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1240 {
1241   /* These pseudo-ops should be defined by the object file format.
1242      However, a.out doesn't support them, so we have versions here.  */
1243   {"aent", s_mips_ent, 1},
1244   {"bgnb", s_ignore, 0},
1245   {"end", s_mips_end, 0},
1246   {"endb", s_ignore, 0},
1247   {"ent", s_mips_ent, 0},
1248   {"file", s_mips_file, 0},
1249   {"fmask", s_mips_mask, 'F'},
1250   {"frame", s_mips_frame, 0},
1251   {"loc", s_mips_loc, 0},
1252   {"mask", s_mips_mask, 'R'},
1253   {"verstamp", s_ignore, 0},
1254   { NULL, NULL, 0 },
1255 };
1256
1257 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
1258    purpose of the `.dc.a' internal pseudo-op.  */
1259
1260 int
1261 mips_address_bytes (void)
1262 {
1263   return HAVE_64BIT_ADDRESSES ? 8 : 4;
1264 }
1265
1266 extern void pop_insert (const pseudo_typeS *);
1267
1268 void
1269 mips_pop_insert (void)
1270 {
1271   pop_insert (mips_pseudo_table);
1272   if (! ECOFF_DEBUGGING)
1273     pop_insert (mips_nonecoff_pseudo_table);
1274 }
1275 \f
1276 /* Symbols labelling the current insn.  */
1277
1278 struct insn_label_list
1279 {
1280   struct insn_label_list *next;
1281   symbolS *label;
1282 };
1283
1284 static struct insn_label_list *free_insn_labels;
1285 #define label_list tc_segment_info_data.labels
1286
1287 static void mips_clear_insn_labels (void);
1288
1289 static inline void
1290 mips_clear_insn_labels (void)
1291 {
1292   register struct insn_label_list **pl;
1293   segment_info_type *si;
1294
1295   if (now_seg)
1296     {
1297       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1298         ;
1299       
1300       si = seg_info (now_seg);
1301       *pl = si->label_list;
1302       si->label_list = NULL;
1303     }
1304 }
1305
1306 \f
1307 static char *expr_end;
1308
1309 /* Expressions which appear in instructions.  These are set by
1310    mips_ip.  */
1311
1312 static expressionS imm_expr;
1313 static expressionS imm2_expr;
1314 static expressionS offset_expr;
1315
1316 /* Relocs associated with imm_expr and offset_expr.  */
1317
1318 static bfd_reloc_code_real_type imm_reloc[3]
1319   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1320 static bfd_reloc_code_real_type offset_reloc[3]
1321   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1322
1323 /* These are set by mips16_ip if an explicit extension is used.  */
1324
1325 static bfd_boolean mips16_small, mips16_ext;
1326
1327 #ifdef OBJ_ELF
1328 /* The pdr segment for per procedure frame/regmask info.  Not used for
1329    ECOFF debugging.  */
1330
1331 static segT pdr_seg;
1332 #endif
1333
1334 /* The default target format to use.  */
1335
1336 #if defined (TE_FreeBSD)
1337 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips-freebsd"
1338 #elif defined (TE_TMIPS)
1339 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX "trad" ENDIAN "mips"
1340 #else
1341 #define ELF_TARGET(PREFIX, ENDIAN) PREFIX ENDIAN "mips"
1342 #endif
1343
1344 const char *
1345 mips_target_format (void)
1346 {
1347   switch (OUTPUT_FLAVOR)
1348     {
1349     case bfd_target_ecoff_flavour:
1350       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1351     case bfd_target_coff_flavour:
1352       return "pe-mips";
1353     case bfd_target_elf_flavour:
1354 #ifdef TE_VXWORKS
1355       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1356         return (target_big_endian
1357                 ? "elf32-bigmips-vxworks"
1358                 : "elf32-littlemips-vxworks");
1359 #endif
1360       return (target_big_endian
1361               ? (HAVE_64BIT_OBJECTS
1362                  ? ELF_TARGET ("elf64-", "big")
1363                  : (HAVE_NEWABI
1364                     ? ELF_TARGET ("elf32-n", "big")
1365                     : ELF_TARGET ("elf32-", "big")))
1366               : (HAVE_64BIT_OBJECTS
1367                  ? ELF_TARGET ("elf64-", "little")
1368                  : (HAVE_NEWABI
1369                     ? ELF_TARGET ("elf32-n", "little")
1370                     : ELF_TARGET ("elf32-", "little"))));
1371     default:
1372       abort ();
1373       return NULL;
1374     }
1375 }
1376
1377 /* Return the length of instruction INSN.  */
1378
1379 static inline unsigned int
1380 insn_length (const struct mips_cl_insn *insn)
1381 {
1382   if (!mips_opts.mips16)
1383     return 4;
1384   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1385 }
1386
1387 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1388
1389 static void
1390 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1391 {
1392   size_t i;
1393
1394   insn->insn_mo = mo;
1395   insn->use_extend = FALSE;
1396   insn->extend = 0;
1397   insn->insn_opcode = mo->match;
1398   insn->frag = NULL;
1399   insn->where = 0;
1400   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1401     insn->fixp[i] = NULL;
1402   insn->fixed_p = (mips_opts.noreorder > 0);
1403   insn->noreorder_p = (mips_opts.noreorder > 0);
1404   insn->mips16_absolute_jump_p = 0;
1405   insn->complete_p = 0;
1406 }
1407
1408 /* Record the current MIPS16 mode in now_seg.  */
1409
1410 static void
1411 mips_record_mips16_mode (void)
1412 {
1413   segment_info_type *si;
1414
1415   si = seg_info (now_seg);
1416   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1417     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1418 }
1419
1420 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1421
1422 static void
1423 install_insn (const struct mips_cl_insn *insn)
1424 {
1425   char *f = insn->frag->fr_literal + insn->where;
1426   if (!mips_opts.mips16)
1427     md_number_to_chars (f, insn->insn_opcode, 4);
1428   else if (insn->mips16_absolute_jump_p)
1429     {
1430       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1431       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1432     }
1433   else
1434     {
1435       if (insn->use_extend)
1436         {
1437           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1438           f += 2;
1439         }
1440       md_number_to_chars (f, insn->insn_opcode, 2);
1441     }
1442   mips_record_mips16_mode ();
1443 }
1444
1445 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1446    and install the opcode in the new location.  */
1447
1448 static void
1449 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1450 {
1451   size_t i;
1452
1453   insn->frag = frag;
1454   insn->where = where;
1455   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1456     if (insn->fixp[i] != NULL)
1457       {
1458         insn->fixp[i]->fx_frag = frag;
1459         insn->fixp[i]->fx_where = where;
1460       }
1461   install_insn (insn);
1462 }
1463
1464 /* Add INSN to the end of the output.  */
1465
1466 static void
1467 add_fixed_insn (struct mips_cl_insn *insn)
1468 {
1469   char *f = frag_more (insn_length (insn));
1470   move_insn (insn, frag_now, f - frag_now->fr_literal);
1471 }
1472
1473 /* Start a variant frag and move INSN to the start of the variant part,
1474    marking it as fixed.  The other arguments are as for frag_var.  */
1475
1476 static void
1477 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1478                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1479 {
1480   frag_grow (max_chars);
1481   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1482   insn->fixed_p = 1;
1483   frag_var (rs_machine_dependent, max_chars, var,
1484             subtype, symbol, offset, NULL);
1485 }
1486
1487 /* Insert N copies of INSN into the history buffer, starting at
1488    position FIRST.  Neither FIRST nor N need to be clipped.  */
1489
1490 static void
1491 insert_into_history (unsigned int first, unsigned int n,
1492                      const struct mips_cl_insn *insn)
1493 {
1494   if (mips_relax.sequence != 2)
1495     {
1496       unsigned int i;
1497
1498       for (i = ARRAY_SIZE (history); i-- > first;)
1499         if (i >= first + n)
1500           history[i] = history[i - n];
1501         else
1502           history[i] = *insn;
1503     }
1504 }
1505
1506 /* Emit a nop instruction, recording it in the history buffer.  */
1507
1508 static void
1509 emit_nop (void)
1510 {
1511   add_fixed_insn (NOP_INSN);
1512   insert_into_history (0, 1, NOP_INSN);
1513 }
1514
1515 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1516    the idea is to make it obvious at a glance that each errata is
1517    included.  */
1518
1519 static void
1520 init_vr4120_conflicts (void)
1521 {
1522 #define CONFLICT(FIRST, SECOND) \
1523     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1524
1525   /* Errata 21 - [D]DIV[U] after [D]MACC */
1526   CONFLICT (MACC, DIV);
1527   CONFLICT (DMACC, DIV);
1528
1529   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1530   CONFLICT (DMULT, DMULT);
1531   CONFLICT (DMULT, DMACC);
1532   CONFLICT (DMACC, DMULT);
1533   CONFLICT (DMACC, DMACC);
1534
1535   /* Errata 24 - MT{LO,HI} after [D]MACC */
1536   CONFLICT (MACC, MTHILO);
1537   CONFLICT (DMACC, MTHILO);
1538
1539   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1540      instruction is executed immediately after a MACC or DMACC
1541      instruction, the result of [either instruction] is incorrect."  */
1542   CONFLICT (MACC, MULT);
1543   CONFLICT (MACC, DMULT);
1544   CONFLICT (DMACC, MULT);
1545   CONFLICT (DMACC, DMULT);
1546
1547   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1548      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1549      DDIV or DDIVU instruction, the result of the MACC or
1550      DMACC instruction is incorrect.".  */
1551   CONFLICT (DMULT, MACC);
1552   CONFLICT (DMULT, DMACC);
1553   CONFLICT (DIV, MACC);
1554   CONFLICT (DIV, DMACC);
1555
1556 #undef CONFLICT
1557 }
1558
1559 struct regname {
1560   const char *name;
1561   unsigned int num;
1562 };
1563
1564 #define RTYPE_MASK      0x1ff00
1565 #define RTYPE_NUM       0x00100
1566 #define RTYPE_FPU       0x00200
1567 #define RTYPE_FCC       0x00400
1568 #define RTYPE_VEC       0x00800
1569 #define RTYPE_GP        0x01000
1570 #define RTYPE_CP0       0x02000
1571 #define RTYPE_PC        0x04000
1572 #define RTYPE_ACC       0x08000
1573 #define RTYPE_CCC       0x10000
1574 #define RNUM_MASK       0x000ff
1575 #define RWARN           0x80000
1576
1577 #define GENERIC_REGISTER_NUMBERS \
1578     {"$0",      RTYPE_NUM | 0},  \
1579     {"$1",      RTYPE_NUM | 1},  \
1580     {"$2",      RTYPE_NUM | 2},  \
1581     {"$3",      RTYPE_NUM | 3},  \
1582     {"$4",      RTYPE_NUM | 4},  \
1583     {"$5",      RTYPE_NUM | 5},  \
1584     {"$6",      RTYPE_NUM | 6},  \
1585     {"$7",      RTYPE_NUM | 7},  \
1586     {"$8",      RTYPE_NUM | 8},  \
1587     {"$9",      RTYPE_NUM | 9},  \
1588     {"$10",     RTYPE_NUM | 10}, \
1589     {"$11",     RTYPE_NUM | 11}, \
1590     {"$12",     RTYPE_NUM | 12}, \
1591     {"$13",     RTYPE_NUM | 13}, \
1592     {"$14",     RTYPE_NUM | 14}, \
1593     {"$15",     RTYPE_NUM | 15}, \
1594     {"$16",     RTYPE_NUM | 16}, \
1595     {"$17",     RTYPE_NUM | 17}, \
1596     {"$18",     RTYPE_NUM | 18}, \
1597     {"$19",     RTYPE_NUM | 19}, \
1598     {"$20",     RTYPE_NUM | 20}, \
1599     {"$21",     RTYPE_NUM | 21}, \
1600     {"$22",     RTYPE_NUM | 22}, \
1601     {"$23",     RTYPE_NUM | 23}, \
1602     {"$24",     RTYPE_NUM | 24}, \
1603     {"$25",     RTYPE_NUM | 25}, \
1604     {"$26",     RTYPE_NUM | 26}, \
1605     {"$27",     RTYPE_NUM | 27}, \
1606     {"$28",     RTYPE_NUM | 28}, \
1607     {"$29",     RTYPE_NUM | 29}, \
1608     {"$30",     RTYPE_NUM | 30}, \
1609     {"$31",     RTYPE_NUM | 31} 
1610
1611 #define FPU_REGISTER_NAMES       \
1612     {"$f0",     RTYPE_FPU | 0},  \
1613     {"$f1",     RTYPE_FPU | 1},  \
1614     {"$f2",     RTYPE_FPU | 2},  \
1615     {"$f3",     RTYPE_FPU | 3},  \
1616     {"$f4",     RTYPE_FPU | 4},  \
1617     {"$f5",     RTYPE_FPU | 5},  \
1618     {"$f6",     RTYPE_FPU | 6},  \
1619     {"$f7",     RTYPE_FPU | 7},  \
1620     {"$f8",     RTYPE_FPU | 8},  \
1621     {"$f9",     RTYPE_FPU | 9},  \
1622     {"$f10",    RTYPE_FPU | 10}, \
1623     {"$f11",    RTYPE_FPU | 11}, \
1624     {"$f12",    RTYPE_FPU | 12}, \
1625     {"$f13",    RTYPE_FPU | 13}, \
1626     {"$f14",    RTYPE_FPU | 14}, \
1627     {"$f15",    RTYPE_FPU | 15}, \
1628     {"$f16",    RTYPE_FPU | 16}, \
1629     {"$f17",    RTYPE_FPU | 17}, \
1630     {"$f18",    RTYPE_FPU | 18}, \
1631     {"$f19",    RTYPE_FPU | 19}, \
1632     {"$f20",    RTYPE_FPU | 20}, \
1633     {"$f21",    RTYPE_FPU | 21}, \
1634     {"$f22",    RTYPE_FPU | 22}, \
1635     {"$f23",    RTYPE_FPU | 23}, \
1636     {"$f24",    RTYPE_FPU | 24}, \
1637     {"$f25",    RTYPE_FPU | 25}, \
1638     {"$f26",    RTYPE_FPU | 26}, \
1639     {"$f27",    RTYPE_FPU | 27}, \
1640     {"$f28",    RTYPE_FPU | 28}, \
1641     {"$f29",    RTYPE_FPU | 29}, \
1642     {"$f30",    RTYPE_FPU | 30}, \
1643     {"$f31",    RTYPE_FPU | 31}
1644
1645 #define FPU_CONDITION_CODE_NAMES \
1646     {"$fcc0",   RTYPE_FCC | 0},  \
1647     {"$fcc1",   RTYPE_FCC | 1},  \
1648     {"$fcc2",   RTYPE_FCC | 2},  \
1649     {"$fcc3",   RTYPE_FCC | 3},  \
1650     {"$fcc4",   RTYPE_FCC | 4},  \
1651     {"$fcc5",   RTYPE_FCC | 5},  \
1652     {"$fcc6",   RTYPE_FCC | 6},  \
1653     {"$fcc7",   RTYPE_FCC | 7}
1654
1655 #define COPROC_CONDITION_CODE_NAMES         \
1656     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1657     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1658     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1659     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1660     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1661     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1662     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1663     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1664
1665 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1666     {"$a4",     RTYPE_GP | 8},  \
1667     {"$a5",     RTYPE_GP | 9},  \
1668     {"$a6",     RTYPE_GP | 10}, \
1669     {"$a7",     RTYPE_GP | 11}, \
1670     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1671     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1672     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1673     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1674     {"$t0",     RTYPE_GP | 12}, \
1675     {"$t1",     RTYPE_GP | 13}, \
1676     {"$t2",     RTYPE_GP | 14}, \
1677     {"$t3",     RTYPE_GP | 15}
1678
1679 #define O32_SYMBOLIC_REGISTER_NAMES \
1680     {"$t0",     RTYPE_GP | 8},  \
1681     {"$t1",     RTYPE_GP | 9},  \
1682     {"$t2",     RTYPE_GP | 10}, \
1683     {"$t3",     RTYPE_GP | 11}, \
1684     {"$t4",     RTYPE_GP | 12}, \
1685     {"$t5",     RTYPE_GP | 13}, \
1686     {"$t6",     RTYPE_GP | 14}, \
1687     {"$t7",     RTYPE_GP | 15}, \
1688     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1689     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1690     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1691     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1692
1693 /* Remaining symbolic register names */
1694 #define SYMBOLIC_REGISTER_NAMES \
1695     {"$zero",   RTYPE_GP | 0},  \
1696     {"$at",     RTYPE_GP | 1},  \
1697     {"$AT",     RTYPE_GP | 1},  \
1698     {"$v0",     RTYPE_GP | 2},  \
1699     {"$v1",     RTYPE_GP | 3},  \
1700     {"$a0",     RTYPE_GP | 4},  \
1701     {"$a1",     RTYPE_GP | 5},  \
1702     {"$a2",     RTYPE_GP | 6},  \
1703     {"$a3",     RTYPE_GP | 7},  \
1704     {"$s0",     RTYPE_GP | 16}, \
1705     {"$s1",     RTYPE_GP | 17}, \
1706     {"$s2",     RTYPE_GP | 18}, \
1707     {"$s3",     RTYPE_GP | 19}, \
1708     {"$s4",     RTYPE_GP | 20}, \
1709     {"$s5",     RTYPE_GP | 21}, \
1710     {"$s6",     RTYPE_GP | 22}, \
1711     {"$s7",     RTYPE_GP | 23}, \
1712     {"$t8",     RTYPE_GP | 24}, \
1713     {"$t9",     RTYPE_GP | 25}, \
1714     {"$k0",     RTYPE_GP | 26}, \
1715     {"$kt0",    RTYPE_GP | 26}, \
1716     {"$k1",     RTYPE_GP | 27}, \
1717     {"$kt1",    RTYPE_GP | 27}, \
1718     {"$gp",     RTYPE_GP | 28}, \
1719     {"$sp",     RTYPE_GP | 29}, \
1720     {"$s8",     RTYPE_GP | 30}, \
1721     {"$fp",     RTYPE_GP | 30}, \
1722     {"$ra",     RTYPE_GP | 31}
1723
1724 #define MIPS16_SPECIAL_REGISTER_NAMES \
1725     {"$pc",     RTYPE_PC | 0}
1726
1727 #define MDMX_VECTOR_REGISTER_NAMES \
1728     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1729     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1730     {"$v2",     RTYPE_VEC | 2},  \
1731     {"$v3",     RTYPE_VEC | 3},  \
1732     {"$v4",     RTYPE_VEC | 4},  \
1733     {"$v5",     RTYPE_VEC | 5},  \
1734     {"$v6",     RTYPE_VEC | 6},  \
1735     {"$v7",     RTYPE_VEC | 7},  \
1736     {"$v8",     RTYPE_VEC | 8},  \
1737     {"$v9",     RTYPE_VEC | 9},  \
1738     {"$v10",    RTYPE_VEC | 10}, \
1739     {"$v11",    RTYPE_VEC | 11}, \
1740     {"$v12",    RTYPE_VEC | 12}, \
1741     {"$v13",    RTYPE_VEC | 13}, \
1742     {"$v14",    RTYPE_VEC | 14}, \
1743     {"$v15",    RTYPE_VEC | 15}, \
1744     {"$v16",    RTYPE_VEC | 16}, \
1745     {"$v17",    RTYPE_VEC | 17}, \
1746     {"$v18",    RTYPE_VEC | 18}, \
1747     {"$v19",    RTYPE_VEC | 19}, \
1748     {"$v20",    RTYPE_VEC | 20}, \
1749     {"$v21",    RTYPE_VEC | 21}, \
1750     {"$v22",    RTYPE_VEC | 22}, \
1751     {"$v23",    RTYPE_VEC | 23}, \
1752     {"$v24",    RTYPE_VEC | 24}, \
1753     {"$v25",    RTYPE_VEC | 25}, \
1754     {"$v26",    RTYPE_VEC | 26}, \
1755     {"$v27",    RTYPE_VEC | 27}, \
1756     {"$v28",    RTYPE_VEC | 28}, \
1757     {"$v29",    RTYPE_VEC | 29}, \
1758     {"$v30",    RTYPE_VEC | 30}, \
1759     {"$v31",    RTYPE_VEC | 31}
1760
1761 #define MIPS_DSP_ACCUMULATOR_NAMES \
1762     {"$ac0",    RTYPE_ACC | 0}, \
1763     {"$ac1",    RTYPE_ACC | 1}, \
1764     {"$ac2",    RTYPE_ACC | 2}, \
1765     {"$ac3",    RTYPE_ACC | 3}
1766
1767 static const struct regname reg_names[] = {
1768   GENERIC_REGISTER_NUMBERS,
1769   FPU_REGISTER_NAMES,
1770   FPU_CONDITION_CODE_NAMES,
1771   COPROC_CONDITION_CODE_NAMES,
1772
1773   /* The $txx registers depends on the abi,
1774      these will be added later into the symbol table from
1775      one of the tables below once mips_abi is set after 
1776      parsing of arguments from the command line. */
1777   SYMBOLIC_REGISTER_NAMES,
1778
1779   MIPS16_SPECIAL_REGISTER_NAMES,
1780   MDMX_VECTOR_REGISTER_NAMES,
1781   MIPS_DSP_ACCUMULATOR_NAMES,
1782   {0, 0}
1783 };
1784
1785 static const struct regname reg_names_o32[] = {
1786   O32_SYMBOLIC_REGISTER_NAMES,
1787   {0, 0}
1788 };
1789
1790 static const struct regname reg_names_n32n64[] = {
1791   N32N64_SYMBOLIC_REGISTER_NAMES,
1792   {0, 0}
1793 };
1794
1795 static int
1796 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1797 {
1798   symbolS *symbolP;
1799   char *e;
1800   char save_c;
1801   int reg = -1;
1802
1803   /* Find end of name.  */
1804   e = *s;
1805   if (is_name_beginner (*e))
1806     ++e;
1807   while (is_part_of_name (*e))
1808     ++e;
1809
1810   /* Terminate name.  */
1811   save_c = *e;
1812   *e = '\0';
1813
1814   /* Look for a register symbol.  */
1815   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1816     {
1817       int r = S_GET_VALUE (symbolP);
1818       if (r & types)
1819         reg = r & RNUM_MASK;
1820       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1821         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1822         reg = (r & RNUM_MASK) - 2;
1823     }
1824   /* Else see if this is a register defined in an itbl entry.  */
1825   else if ((types & RTYPE_GP) && itbl_have_entries)
1826     {
1827       char *n = *s;
1828       unsigned long r;
1829
1830       if (*n == '$')
1831         ++n;
1832       if (itbl_get_reg_val (n, &r))
1833         reg = r & RNUM_MASK;
1834     }
1835
1836   /* Advance to next token if a register was recognised.  */
1837   if (reg >= 0)
1838     *s = e;
1839   else if (types & RWARN)
1840     as_warn (_("Unrecognized register name `%s'"), *s);
1841
1842   *e = save_c;
1843   if (regnop)
1844     *regnop = reg;
1845   return reg >= 0;
1846 }
1847
1848 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1849    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1850
1851 static bfd_boolean
1852 is_opcode_valid (const struct mips_opcode *mo)
1853 {
1854   int isa = mips_opts.isa;
1855   int fp_s, fp_d;
1856
1857   if (mips_opts.ase_mdmx)
1858     isa |= INSN_MDMX;
1859   if (mips_opts.ase_dsp)
1860     isa |= INSN_DSP;
1861   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1862     isa |= INSN_DSP64;
1863   if (mips_opts.ase_dspr2)
1864     isa |= INSN_DSPR2;
1865   if (mips_opts.ase_mt)
1866     isa |= INSN_MT;
1867   if (mips_opts.ase_mips3d)
1868     isa |= INSN_MIPS3D;
1869   if (mips_opts.ase_smartmips)
1870     isa |= INSN_SMARTMIPS;
1871
1872   /* Don't accept instructions based on the ISA if the CPU does not implement
1873      all the coprocessor insns. */
1874   if (NO_ISA_COP (mips_opts.arch)
1875       && COP_INSN (mo->pinfo))
1876     isa = 0;
1877
1878   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1879     return FALSE;
1880
1881   /* Check whether the instruction or macro requires single-precision or
1882      double-precision floating-point support.  Note that this information is
1883      stored differently in the opcode table for insns and macros.  */
1884   if (mo->pinfo == INSN_MACRO)
1885     {
1886       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1887       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1888     }
1889   else
1890     {
1891       fp_s = mo->pinfo & FP_S;
1892       fp_d = mo->pinfo & FP_D;
1893     }
1894
1895   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1896     return FALSE;
1897
1898   if (fp_s && mips_opts.soft_float)
1899     return FALSE;
1900
1901   return TRUE;
1902 }
1903
1904 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1905    selected ISA and architecture.  */
1906
1907 static bfd_boolean
1908 is_opcode_valid_16 (const struct mips_opcode *mo)
1909 {
1910   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1911 }
1912
1913 /* This function is called once, at assembler startup time.  It should set up
1914    all the tables, etc. that the MD part of the assembler will need.  */
1915
1916 void
1917 md_begin (void)
1918 {
1919   const char *retval = NULL;
1920   int i = 0;
1921   int broken = 0;
1922
1923   if (mips_pic != NO_PIC)
1924     {
1925       if (g_switch_seen && g_switch_value != 0)
1926         as_bad (_("-G may not be used in position-independent code"));
1927       g_switch_value = 0;
1928     }
1929
1930   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1931     as_warn (_("Could not set architecture and machine"));
1932
1933   op_hash = hash_new ();
1934
1935   for (i = 0; i < NUMOPCODES;)
1936     {
1937       const char *name = mips_opcodes[i].name;
1938
1939       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1940       if (retval != NULL)
1941         {
1942           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1943                    mips_opcodes[i].name, retval);
1944           /* Probably a memory allocation problem?  Give up now.  */
1945           as_fatal (_("Broken assembler.  No assembly attempted."));
1946         }
1947       do
1948         {
1949           if (mips_opcodes[i].pinfo != INSN_MACRO)
1950             {
1951               if (!validate_mips_insn (&mips_opcodes[i]))
1952                 broken = 1;
1953               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1954                 {
1955                   create_insn (&nop_insn, mips_opcodes + i);
1956                   if (mips_fix_loongson2f_nop)
1957                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1958                   nop_insn.fixed_p = 1;
1959                 }
1960             }
1961           ++i;
1962         }
1963       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1964     }
1965
1966   mips16_op_hash = hash_new ();
1967
1968   i = 0;
1969   while (i < bfd_mips16_num_opcodes)
1970     {
1971       const char *name = mips16_opcodes[i].name;
1972
1973       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1974       if (retval != NULL)
1975         as_fatal (_("internal: can't hash `%s': %s"),
1976                   mips16_opcodes[i].name, retval);
1977       do
1978         {
1979           if (mips16_opcodes[i].pinfo != INSN_MACRO
1980               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1981                   != mips16_opcodes[i].match))
1982             {
1983               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1984                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1985               broken = 1;
1986             }
1987           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1988             {
1989               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1990               mips16_nop_insn.fixed_p = 1;
1991             }
1992           ++i;
1993         }
1994       while (i < bfd_mips16_num_opcodes
1995              && strcmp (mips16_opcodes[i].name, name) == 0);
1996     }
1997
1998   if (broken)
1999     as_fatal (_("Broken assembler.  No assembly attempted."));
2000
2001   /* We add all the general register names to the symbol table.  This
2002      helps us detect invalid uses of them.  */
2003   for (i = 0; reg_names[i].name; i++) 
2004     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
2005                                      reg_names[i].num, /* & RNUM_MASK, */
2006                                      &zero_address_frag));
2007   if (HAVE_NEWABI)
2008     for (i = 0; reg_names_n32n64[i].name; i++) 
2009       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
2010                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
2011                                        &zero_address_frag));
2012   else
2013     for (i = 0; reg_names_o32[i].name; i++) 
2014       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
2015                                        reg_names_o32[i].num, /* & RNUM_MASK, */
2016                                        &zero_address_frag));
2017
2018   mips_no_prev_insn ();
2019
2020   mips_gprmask = 0;
2021   mips_cprmask[0] = 0;
2022   mips_cprmask[1] = 0;
2023   mips_cprmask[2] = 0;
2024   mips_cprmask[3] = 0;
2025
2026   /* set the default alignment for the text section (2**2) */
2027   record_alignment (text_section, 2);
2028
2029   bfd_set_gp_size (stdoutput, g_switch_value);
2030
2031 #ifdef OBJ_ELF
2032   if (IS_ELF)
2033     {
2034       /* On a native system other than VxWorks, sections must be aligned
2035          to 16 byte boundaries.  When configured for an embedded ELF
2036          target, we don't bother.  */
2037       if (strncmp (TARGET_OS, "elf", 3) != 0
2038           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2039         {
2040           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2041           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2042           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2043         }
2044
2045       /* Create a .reginfo section for register masks and a .mdebug
2046          section for debugging information.  */
2047       {
2048         segT seg;
2049         subsegT subseg;
2050         flagword flags;
2051         segT sec;
2052
2053         seg = now_seg;
2054         subseg = now_subseg;
2055
2056         /* The ABI says this section should be loaded so that the
2057            running program can access it.  However, we don't load it
2058            if we are configured for an embedded target */
2059         flags = SEC_READONLY | SEC_DATA;
2060         if (strncmp (TARGET_OS, "elf", 3) != 0)
2061           flags |= SEC_ALLOC | SEC_LOAD;
2062
2063         if (mips_abi != N64_ABI)
2064           {
2065             sec = subseg_new (".reginfo", (subsegT) 0);
2066
2067             bfd_set_section_flags (stdoutput, sec, flags);
2068             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2069
2070             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2071           }
2072         else
2073           {
2074             /* The 64-bit ABI uses a .MIPS.options section rather than
2075                .reginfo section.  */
2076             sec = subseg_new (".MIPS.options", (subsegT) 0);
2077             bfd_set_section_flags (stdoutput, sec, flags);
2078             bfd_set_section_alignment (stdoutput, sec, 3);
2079
2080             /* Set up the option header.  */
2081             {
2082               Elf_Internal_Options opthdr;
2083               char *f;
2084
2085               opthdr.kind = ODK_REGINFO;
2086               opthdr.size = (sizeof (Elf_External_Options)
2087                              + sizeof (Elf64_External_RegInfo));
2088               opthdr.section = 0;
2089               opthdr.info = 0;
2090               f = frag_more (sizeof (Elf_External_Options));
2091               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2092                                              (Elf_External_Options *) f);
2093
2094               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2095             }
2096           }
2097
2098         if (ECOFF_DEBUGGING)
2099           {
2100             sec = subseg_new (".mdebug", (subsegT) 0);
2101             (void) bfd_set_section_flags (stdoutput, sec,
2102                                           SEC_HAS_CONTENTS | SEC_READONLY);
2103             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2104           }
2105         else if (mips_flag_pdr)
2106           {
2107             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2108             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2109                                           SEC_READONLY | SEC_RELOC
2110                                           | SEC_DEBUGGING);
2111             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2112           }
2113
2114         subseg_set (seg, subseg);
2115       }
2116     }
2117 #endif /* OBJ_ELF */
2118
2119   if (! ECOFF_DEBUGGING)
2120     md_obj_begin ();
2121
2122   if (mips_fix_vr4120)
2123     init_vr4120_conflicts ();
2124 }
2125
2126 void
2127 md_mips_end (void)
2128 {
2129   mips_emit_delays ();
2130   if (! ECOFF_DEBUGGING)
2131     md_obj_end ();
2132 }
2133
2134 void
2135 md_assemble (char *str)
2136 {
2137   struct mips_cl_insn insn;
2138   bfd_reloc_code_real_type unused_reloc[3]
2139     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2140
2141   imm_expr.X_op = O_absent;
2142   imm2_expr.X_op = O_absent;
2143   offset_expr.X_op = O_absent;
2144   imm_reloc[0] = BFD_RELOC_UNUSED;
2145   imm_reloc[1] = BFD_RELOC_UNUSED;
2146   imm_reloc[2] = BFD_RELOC_UNUSED;
2147   offset_reloc[0] = BFD_RELOC_UNUSED;
2148   offset_reloc[1] = BFD_RELOC_UNUSED;
2149   offset_reloc[2] = BFD_RELOC_UNUSED;
2150
2151   if (mips_opts.mips16)
2152     mips16_ip (str, &insn);
2153   else
2154     {
2155       mips_ip (str, &insn);
2156       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2157             str, insn.insn_opcode));
2158     }
2159
2160   if (insn_error)
2161     {
2162       as_bad ("%s `%s'", insn_error, str);
2163       return;
2164     }
2165
2166   if (insn.insn_mo->pinfo == INSN_MACRO)
2167     {
2168       macro_start ();
2169       if (mips_opts.mips16)
2170         mips16_macro (&insn);
2171       else
2172         macro (&insn);
2173       macro_end ();
2174     }
2175   else
2176     {
2177       if (imm_expr.X_op != O_absent)
2178         append_insn (&insn, &imm_expr, imm_reloc);
2179       else if (offset_expr.X_op != O_absent)
2180         append_insn (&insn, &offset_expr, offset_reloc);
2181       else
2182         append_insn (&insn, NULL, unused_reloc);
2183     }
2184 }
2185
2186 /* Convenience functions for abstracting away the differences between
2187    MIPS16 and non-MIPS16 relocations.  */
2188
2189 static inline bfd_boolean
2190 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2191 {
2192   switch (reloc)
2193     {
2194     case BFD_RELOC_MIPS16_JMP:
2195     case BFD_RELOC_MIPS16_GPREL:
2196     case BFD_RELOC_MIPS16_GOT16:
2197     case BFD_RELOC_MIPS16_CALL16:
2198     case BFD_RELOC_MIPS16_HI16_S:
2199     case BFD_RELOC_MIPS16_HI16:
2200     case BFD_RELOC_MIPS16_LO16:
2201       return TRUE;
2202
2203     default:
2204       return FALSE;
2205     }
2206 }
2207
2208 static inline bfd_boolean
2209 got16_reloc_p (bfd_reloc_code_real_type reloc)
2210 {
2211   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2212 }
2213
2214 static inline bfd_boolean
2215 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2216 {
2217   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2218 }
2219
2220 static inline bfd_boolean
2221 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2222 {
2223   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2224 }
2225
2226 /* Return true if the given relocation might need a matching %lo().
2227    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2228    need a matching %lo() when applied to local symbols.  */
2229
2230 static inline bfd_boolean
2231 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2232 {
2233   return (HAVE_IN_PLACE_ADDENDS
2234           && (hi16_reloc_p (reloc)
2235               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2236                  all GOT16 relocations evaluate to "G".  */
2237               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2238 }
2239
2240 /* Return the type of %lo() reloc needed by RELOC, given that
2241    reloc_needs_lo_p.  */
2242
2243 static inline bfd_reloc_code_real_type
2244 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2245 {
2246   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2247 }
2248
2249 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2250    relocation.  */
2251
2252 static inline bfd_boolean
2253 fixup_has_matching_lo_p (fixS *fixp)
2254 {
2255   return (fixp->fx_next != NULL
2256           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2257           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2258           && fixp->fx_offset == fixp->fx_next->fx_offset);
2259 }
2260
2261 /* This function returns true if modifying a register requires a
2262    delay.  */
2263
2264 static int
2265 reg_needs_delay (unsigned int reg)
2266 {
2267   unsigned long prev_pinfo;
2268
2269   prev_pinfo = history[0].insn_mo->pinfo;
2270   if (! mips_opts.noreorder
2271       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2272            && ! gpr_interlocks)
2273           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2274               && ! cop_interlocks)))
2275     {
2276       /* A load from a coprocessor or from memory.  All load delays
2277          delay the use of general register rt for one instruction.  */
2278       /* Itbl support may require additional care here.  */
2279       know (prev_pinfo & INSN_WRITE_GPR_T);
2280       if (reg == EXTRACT_OPERAND (RT, history[0]))
2281         return 1;
2282     }
2283
2284   return 0;
2285 }
2286
2287 /* Move all labels in insn_labels to the current insertion point.  */
2288
2289 static void
2290 mips_move_labels (void)
2291 {
2292   segment_info_type *si = seg_info (now_seg);
2293   struct insn_label_list *l;
2294   valueT val;
2295
2296   for (l = si->label_list; l != NULL; l = l->next)
2297     {
2298       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2299       symbol_set_frag (l->label, frag_now);
2300       val = (valueT) frag_now_fix ();
2301       /* mips16 text labels are stored as odd.  */
2302       if (mips_opts.mips16)
2303         ++val;
2304       S_SET_VALUE (l->label, val);
2305     }
2306 }
2307
2308 static bfd_boolean
2309 s_is_linkonce (symbolS *sym, segT from_seg)
2310 {
2311   bfd_boolean linkonce = FALSE;
2312   segT symseg = S_GET_SEGMENT (sym);
2313
2314   if (symseg != from_seg && !S_IS_LOCAL (sym))
2315     {
2316       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2317         linkonce = TRUE;
2318 #ifdef OBJ_ELF
2319       /* The GNU toolchain uses an extension for ELF: a section
2320          beginning with the magic string .gnu.linkonce is a
2321          linkonce section.  */
2322       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2323                    sizeof ".gnu.linkonce" - 1) == 0)
2324         linkonce = TRUE;
2325 #endif
2326     }
2327   return linkonce;
2328 }
2329
2330 /* Mark instruction labels in mips16 mode.  This permits the linker to
2331    handle them specially, such as generating jalx instructions when
2332    needed.  We also make them odd for the duration of the assembly, in
2333    order to generate the right sort of code.  We will make them even
2334    in the adjust_symtab routine, while leaving them marked.  This is
2335    convenient for the debugger and the disassembler.  The linker knows
2336    to make them odd again.  */
2337
2338 static void
2339 mips16_mark_labels (void)
2340 {
2341   segment_info_type *si = seg_info (now_seg);
2342   struct insn_label_list *l;
2343
2344   if (!mips_opts.mips16)
2345     return;
2346
2347   for (l = si->label_list; l != NULL; l = l->next)
2348    {
2349       symbolS *label = l->label;
2350
2351 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2352       if (IS_ELF)
2353         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2354 #endif
2355       if ((S_GET_VALUE (label) & 1) == 0
2356         /* Don't adjust the address if the label is global or weak, or
2357            in a link-once section, since we'll be emitting symbol reloc
2358            references to it which will be patched up by the linker, and
2359            the final value of the symbol may or may not be MIPS16.  */
2360           && ! S_IS_WEAK (label)
2361           && ! S_IS_EXTERNAL (label)
2362           && ! s_is_linkonce (label, now_seg))
2363         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2364     }
2365 }
2366
2367 /* End the current frag.  Make it a variant frag and record the
2368    relaxation info.  */
2369
2370 static void
2371 relax_close_frag (void)
2372 {
2373   mips_macro_warning.first_frag = frag_now;
2374   frag_var (rs_machine_dependent, 0, 0,
2375             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2376             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2377
2378   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2379   mips_relax.first_fixup = 0;
2380 }
2381
2382 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2383    See the comment above RELAX_ENCODE for more details.  */
2384
2385 static void
2386 relax_start (symbolS *symbol)
2387 {
2388   gas_assert (mips_relax.sequence == 0);
2389   mips_relax.sequence = 1;
2390   mips_relax.symbol = symbol;
2391 }
2392
2393 /* Start generating the second version of a relaxable sequence.
2394    See the comment above RELAX_ENCODE for more details.  */
2395
2396 static void
2397 relax_switch (void)
2398 {
2399   gas_assert (mips_relax.sequence == 1);
2400   mips_relax.sequence = 2;
2401 }
2402
2403 /* End the current relaxable sequence.  */
2404
2405 static void
2406 relax_end (void)
2407 {
2408   gas_assert (mips_relax.sequence == 2);
2409   relax_close_frag ();
2410   mips_relax.sequence = 0;
2411 }
2412
2413 /* Return the mask of core registers that IP reads.  */
2414
2415 static unsigned int
2416 gpr_read_mask (const struct mips_cl_insn *ip)
2417 {
2418   unsigned long pinfo, pinfo2;
2419   unsigned int mask;
2420
2421   mask = 0;
2422   pinfo = ip->insn_mo->pinfo;
2423   pinfo2 = ip->insn_mo->pinfo2;
2424   if (mips_opts.mips16)
2425     {
2426       if (pinfo & MIPS16_INSN_READ_X)
2427         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
2428       if (pinfo & MIPS16_INSN_READ_Y)
2429         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
2430       if (pinfo & MIPS16_INSN_READ_T)
2431         mask |= 1 << TREG;
2432       if (pinfo & MIPS16_INSN_READ_SP)
2433         mask |= 1 << SP;
2434       if (pinfo & MIPS16_INSN_READ_31)
2435         mask |= 1 << RA;
2436       if (pinfo & MIPS16_INSN_READ_Z)
2437         mask |= 1 << (mips16_to_32_reg_map
2438                       [MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]);
2439       if (pinfo & MIPS16_INSN_READ_GPR_X)
2440         mask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
2441     }
2442   else
2443     {
2444       if (pinfo2 & INSN2_READ_GPR_D)
2445         mask |= 1 << EXTRACT_OPERAND (RD, *ip);
2446       if (pinfo & INSN_READ_GPR_T)
2447         mask |= 1 << EXTRACT_OPERAND (RT, *ip);
2448       if (pinfo & INSN_READ_GPR_S)
2449         mask |= 1 << EXTRACT_OPERAND (RS, *ip);
2450       if (pinfo2 & INSN2_READ_GPR_Z)
2451         mask |= 1 << EXTRACT_OPERAND (RZ, *ip);
2452     }
2453   /* Don't include register 0.  */
2454   return mask & ~1;
2455 }
2456
2457 /* Return the mask of core registers that IP writes.  */
2458
2459 static unsigned int
2460 gpr_write_mask (const struct mips_cl_insn *ip)
2461 {
2462   unsigned long pinfo, pinfo2;
2463   unsigned int mask;
2464
2465   mask = 0;
2466   pinfo = ip->insn_mo->pinfo;
2467   pinfo2 = ip->insn_mo->pinfo2;
2468   if (mips_opts.mips16)
2469     {
2470       if (pinfo & MIPS16_INSN_WRITE_X)
2471         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)];
2472       if (pinfo & MIPS16_INSN_WRITE_Y)
2473         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)];
2474       if (pinfo & MIPS16_INSN_WRITE_Z)
2475         mask |= 1 << mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RZ, *ip)];
2476       if (pinfo & MIPS16_INSN_WRITE_T)
2477         mask |= 1 << TREG;
2478       if (pinfo & MIPS16_INSN_WRITE_SP)
2479         mask |= 1 << SP;
2480       if (pinfo & MIPS16_INSN_WRITE_31)
2481         mask |= 1 << RA;
2482       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
2483         mask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
2484     }
2485   else
2486     {
2487       if (pinfo & INSN_WRITE_GPR_D)
2488         mask |= 1 << EXTRACT_OPERAND (RD, *ip);
2489       if (pinfo & INSN_WRITE_GPR_T)
2490         mask |= 1 << EXTRACT_OPERAND (RT, *ip);
2491       if (pinfo & INSN_WRITE_GPR_31)
2492         mask |= 1 << RA;
2493       if (pinfo2 & INSN2_WRITE_GPR_Z)
2494         mask |= 1 << EXTRACT_OPERAND (RZ, *ip);
2495     }
2496   /* Don't include register 0.  */
2497   return mask & ~1;
2498 }
2499
2500 /* Return the mask of floating-point registers that IP reads.  */
2501
2502 static unsigned int
2503 fpr_read_mask (const struct mips_cl_insn *ip)
2504 {
2505   unsigned long pinfo, pinfo2;
2506   unsigned int mask;
2507
2508   mask = 0;
2509   pinfo = ip->insn_mo->pinfo;
2510   pinfo2 = ip->insn_mo->pinfo2;
2511   if (!mips_opts.mips16)
2512     {
2513       if (pinfo & INSN_READ_FPR_S)
2514         mask |= 1 << EXTRACT_OPERAND (FS, *ip);
2515       if (pinfo & INSN_READ_FPR_T)
2516         mask |= 1 << EXTRACT_OPERAND (FT, *ip);
2517       if (pinfo & INSN_READ_FPR_R)
2518         mask |= 1 << EXTRACT_OPERAND (FR, *ip);
2519       if (pinfo2 & INSN2_READ_FPR_Z)
2520         mask |= 1 << EXTRACT_OPERAND (FZ, *ip);
2521     }
2522   /* Conservatively treat all operands to an FP_D instruction are doubles.
2523      (This is overly pessimistic for things like cvt.d.s.)  */
2524   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
2525     mask |= mask << 1;
2526   return mask;
2527 }
2528
2529 /* Return the mask of floating-point registers that IP writes.  */
2530
2531 static unsigned int
2532 fpr_write_mask (const struct mips_cl_insn *ip)
2533 {
2534   unsigned long pinfo, pinfo2;
2535   unsigned int mask;
2536
2537   mask = 0;
2538   pinfo = ip->insn_mo->pinfo;
2539   pinfo2 = ip->insn_mo->pinfo2;
2540   if (!mips_opts.mips16)
2541     {
2542       if (pinfo & INSN_WRITE_FPR_D)
2543         mask |= 1 << EXTRACT_OPERAND (FD, *ip);
2544       if (pinfo & INSN_WRITE_FPR_S)
2545         mask |= 1 << EXTRACT_OPERAND (FS, *ip);
2546       if (pinfo & INSN_WRITE_FPR_T)
2547         mask |= 1 << EXTRACT_OPERAND (FT, *ip);
2548       if (pinfo2 & INSN2_WRITE_FPR_Z)
2549         mask |= 1 << EXTRACT_OPERAND (FZ, *ip);
2550     }
2551   /* Conservatively treat all operands to an FP_D instruction are doubles.
2552      (This is overly pessimistic for things like cvt.s.d.)  */
2553   if (HAVE_32BIT_FPRS && (pinfo & FP_D))
2554     mask |= mask << 1;
2555   return mask;
2556 }
2557
2558 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2559    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2560    by VR4120 errata.  */
2561
2562 static unsigned int
2563 classify_vr4120_insn (const char *name)
2564 {
2565   if (strncmp (name, "macc", 4) == 0)
2566     return FIX_VR4120_MACC;
2567   if (strncmp (name, "dmacc", 5) == 0)
2568     return FIX_VR4120_DMACC;
2569   if (strncmp (name, "mult", 4) == 0)
2570     return FIX_VR4120_MULT;
2571   if (strncmp (name, "dmult", 5) == 0)
2572     return FIX_VR4120_DMULT;
2573   if (strstr (name, "div"))
2574     return FIX_VR4120_DIV;
2575   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2576     return FIX_VR4120_MTHILO;
2577   return NUM_FIX_VR4120_CLASSES;
2578 }
2579
2580 #define INSN_ERET  0x42000018
2581 #define INSN_DERET 0x4200001f
2582
2583 /* Return the number of instructions that must separate INSN1 and INSN2,
2584    where INSN1 is the earlier instruction.  Return the worst-case value
2585    for any INSN2 if INSN2 is null.  */
2586
2587 static unsigned int
2588 insns_between (const struct mips_cl_insn *insn1,
2589                const struct mips_cl_insn *insn2)
2590 {
2591   unsigned long pinfo1, pinfo2;
2592   unsigned int mask;
2593
2594   /* This function needs to know which pinfo flags are set for INSN2
2595      and which registers INSN2 uses.  The former is stored in PINFO2 and
2596      the latter is tested via INSN2_USES_GPR.  If INSN2 is null, PINFO2
2597      will have every flag set and INSN2_USES_GPR will always return true.  */
2598   pinfo1 = insn1->insn_mo->pinfo;
2599   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2600
2601 #define INSN2_USES_GPR(REG) \
2602   (insn2 == NULL || (gpr_read_mask (insn2) & (1U << (REG))) != 0)
2603
2604   /* For most targets, write-after-read dependencies on the HI and LO
2605      registers must be separated by at least two instructions.  */
2606   if (!hilo_interlocks)
2607     {
2608       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2609         return 2;
2610       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2611         return 2;
2612     }
2613
2614   /* If we're working around r7000 errata, there must be two instructions
2615      between an mfhi or mflo and any instruction that uses the result.  */
2616   if (mips_7000_hilo_fix
2617       && MF_HILO_INSN (pinfo1)
2618       && INSN2_USES_GPR (EXTRACT_OPERAND (RD, *insn1)))
2619     return 2;
2620
2621   /* If we're working around 24K errata, one instruction is required
2622      if an ERET or DERET is followed by a branch instruction.  */
2623   if (mips_fix_24k)
2624     {
2625       if (insn1->insn_opcode == INSN_ERET
2626           || insn1->insn_opcode == INSN_DERET)
2627         {
2628           if (insn2 == NULL
2629               || insn2->insn_opcode == INSN_ERET
2630               || insn2->insn_opcode == INSN_DERET
2631               || (insn2->insn_mo->pinfo
2632                   & (INSN_UNCOND_BRANCH_DELAY
2633                      | INSN_COND_BRANCH_DELAY
2634                      | INSN_COND_BRANCH_LIKELY)) != 0)
2635             return 1;
2636         }
2637     }
2638
2639   /* If working around VR4120 errata, check for combinations that need
2640      a single intervening instruction.  */
2641   if (mips_fix_vr4120)
2642     {
2643       unsigned int class1, class2;
2644
2645       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2646       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2647         {
2648           if (insn2 == NULL)
2649             return 1;
2650           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2651           if (vr4120_conflicts[class1] & (1 << class2))
2652             return 1;
2653         }
2654     }
2655
2656   if (!mips_opts.mips16)
2657     {
2658       /* Check for GPR or coprocessor load delays.  All such delays
2659          are on the RT register.  */
2660       /* Itbl support may require additional care here.  */
2661       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2662           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2663         {
2664           know (pinfo1 & INSN_WRITE_GPR_T);
2665           if (INSN2_USES_GPR (EXTRACT_OPERAND (RT, *insn1)))
2666             return 1;
2667         }
2668
2669       /* Check for generic coprocessor hazards.
2670
2671          This case is not handled very well.  There is no special
2672          knowledge of CP0 handling, and the coprocessors other than
2673          the floating point unit are not distinguished at all.  */
2674       /* Itbl support may require additional care here. FIXME!
2675          Need to modify this to include knowledge about
2676          user specified delays!  */
2677       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2678                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2679         {
2680           /* Handle cases where INSN1 writes to a known general coprocessor
2681              register.  There must be a one instruction delay before INSN2
2682              if INSN2 reads that register, otherwise no delay is needed.  */
2683           mask = fpr_write_mask (insn1);
2684           if (mask != 0)
2685             {
2686               if (!insn2 || (mask & fpr_read_mask (insn2)) != 0)
2687                 return 1;
2688             }
2689           else
2690             {
2691               /* Read-after-write dependencies on the control registers
2692                  require a two-instruction gap.  */
2693               if ((pinfo1 & INSN_WRITE_COND_CODE)
2694                   && (pinfo2 & INSN_READ_COND_CODE))
2695                 return 2;
2696
2697               /* We don't know exactly what INSN1 does.  If INSN2 is
2698                  also a coprocessor instruction, assume there must be
2699                  a one instruction gap.  */
2700               if (pinfo2 & INSN_COP)
2701                 return 1;
2702             }
2703         }
2704
2705       /* Check for read-after-write dependencies on the coprocessor
2706          control registers in cases where INSN1 does not need a general
2707          coprocessor delay.  This means that INSN1 is a floating point
2708          comparison instruction.  */
2709       /* Itbl support may require additional care here.  */
2710       else if (!cop_interlocks
2711                && (pinfo1 & INSN_WRITE_COND_CODE)
2712                && (pinfo2 & INSN_READ_COND_CODE))
2713         return 1;
2714     }
2715
2716 #undef INSN2_USES_GPR
2717
2718   return 0;
2719 }
2720
2721 /* Return the number of nops that would be needed to work around the
2722    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2723    the MAX_VR4130_NOPS instructions described by HIST.  Ignore hazards
2724    that are contained within the first IGNORE instructions of HIST.  */
2725
2726 static int
2727 nops_for_vr4130 (int ignore, const struct mips_cl_insn *hist,
2728                  const struct mips_cl_insn *insn)
2729 {
2730   int i, j;
2731   unsigned int mask;
2732
2733   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2734      are not affected by the errata.  */
2735   if (insn != 0
2736       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2737           || strcmp (insn->insn_mo->name, "mtlo") == 0
2738           || strcmp (insn->insn_mo->name, "mthi") == 0))
2739     return 0;
2740
2741   /* Search for the first MFLO or MFHI.  */
2742   for (i = 0; i < MAX_VR4130_NOPS; i++)
2743     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2744       {
2745         /* Extract the destination register.  */
2746         mask = gpr_write_mask (&hist[i]);
2747
2748         /* No nops are needed if INSN reads that register.  */
2749         if (insn != NULL && (gpr_read_mask (insn) & mask) != 0)
2750           return 0;
2751
2752         /* ...or if any of the intervening instructions do.  */
2753         for (j = 0; j < i; j++)
2754           if (gpr_read_mask (&hist[j]) & mask)
2755             return 0;
2756
2757         if (i >= ignore)
2758           return MAX_VR4130_NOPS - i;
2759       }
2760   return 0;
2761 }
2762
2763 #define BASE_REG_EQ(INSN1, INSN2)       \
2764   ((((INSN1) >> OP_SH_RS) & OP_MASK_RS) \
2765       == (((INSN2) >> OP_SH_RS) & OP_MASK_RS))
2766
2767 /* Return the minimum alignment for this store instruction.  */
2768
2769 static int
2770 fix_24k_align_to (const struct mips_opcode *mo)
2771 {
2772   if (strcmp (mo->name, "sh") == 0)
2773     return 2;
2774
2775   if (strcmp (mo->name, "swc1") == 0
2776       || strcmp (mo->name, "swc2") == 0
2777       || strcmp (mo->name, "sw") == 0
2778       || strcmp (mo->name, "sc") == 0
2779       || strcmp (mo->name, "s.s") == 0)
2780     return 4;
2781
2782   if (strcmp (mo->name, "sdc1") == 0
2783       || strcmp (mo->name, "sdc2") == 0
2784       || strcmp (mo->name, "s.d") == 0)
2785     return 8;
2786
2787   /* sb, swl, swr */
2788   return 1;
2789 }
2790
2791 struct fix_24k_store_info
2792   {
2793     /* Immediate offset, if any, for this store instruction.  */
2794     short off;
2795     /* Alignment required by this store instruction.  */
2796     int align_to;
2797     /* True for register offsets.  */
2798     int register_offset;
2799   };
2800
2801 /* Comparison function used by qsort.  */
2802
2803 static int
2804 fix_24k_sort (const void *a, const void *b)
2805 {
2806   const struct fix_24k_store_info *pos1 = a;
2807   const struct fix_24k_store_info *pos2 = b;
2808
2809   return (pos1->off - pos2->off);
2810 }
2811
2812 /* INSN is a store instruction.  Try to record the store information
2813    in STINFO.  Return false if the information isn't known.  */
2814
2815 static bfd_boolean
2816 fix_24k_record_store_info (struct fix_24k_store_info *stinfo,
2817                            const struct mips_cl_insn *insn)
2818 {
2819   /* The instruction must have a known offset.  */
2820   if (!insn->complete_p || !strstr (insn->insn_mo->args, "o("))
2821     return FALSE;
2822
2823   stinfo->off = (insn->insn_opcode >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE;
2824   stinfo->align_to = fix_24k_align_to (insn->insn_mo);
2825   return TRUE;
2826 }
2827
2828 /* Return the number of nops that would be needed to work around the 24k
2829    "lost data on stores during refill" errata if instruction INSN
2830    immediately followed the 2 instructions described by HIST.
2831    Ignore hazards that are contained within the first IGNORE
2832    instructions of HIST.
2833
2834    Problem: The FSB (fetch store buffer) acts as an intermediate buffer
2835    for the data cache refills and store data. The following describes
2836    the scenario where the store data could be lost.
2837
2838    * A data cache miss, due to either a load or a store, causing fill
2839      data to be supplied by the memory subsystem
2840    * The first three doublewords of fill data are returned and written
2841      into the cache
2842    * A sequence of four stores occurs in consecutive cycles around the
2843      final doubleword of the fill:
2844    * Store A
2845    * Store B
2846    * Store C
2847    * Zero, One or more instructions
2848    * Store D
2849
2850    The four stores A-D must be to different doublewords of the line that
2851    is being filled. The fourth instruction in the sequence above permits
2852    the fill of the final doubleword to be transferred from the FSB into
2853    the cache. In the sequence above, the stores may be either integer
2854    (sb, sh, sw, swr, swl, sc) or coprocessor (swc1/swc2, sdc1/sdc2,
2855    swxc1, sdxc1, suxc1) stores, as long as the four stores are to
2856    different doublewords on the line. If the floating point unit is
2857    running in 1:2 mode, it is not possible to create the sequence above
2858    using only floating point store instructions.
2859
2860    In this case, the cache line being filled is incorrectly marked
2861    invalid, thereby losing the data from any store to the line that
2862    occurs between the original miss and the completion of the five
2863    cycle sequence shown above.
2864
2865    The workarounds are:
2866
2867    * Run the data cache in write-through mode.
2868    * Insert a non-store instruction between
2869      Store A and Store B or Store B and Store C.  */
2870   
2871 static int
2872 nops_for_24k (int ignore, const struct mips_cl_insn *hist,
2873               const struct mips_cl_insn *insn)
2874 {
2875   struct fix_24k_store_info pos[3];
2876   int align, i, base_offset;
2877
2878   if (ignore >= 2)
2879     return 0;
2880
2881   /* If the previous instruction wasn't a store, there's nothing to
2882      worry about.  */
2883   if ((hist[0].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2884     return 0;
2885
2886   /* If the instructions after the previous one are unknown, we have
2887      to assume the worst.  */
2888   if (!insn)
2889     return 1;
2890
2891   /* Check whether we are dealing with three consecutive stores.  */
2892   if ((insn->insn_mo->pinfo & INSN_STORE_MEMORY) == 0
2893       || (hist[1].insn_mo->pinfo & INSN_STORE_MEMORY) == 0)
2894     return 0;
2895
2896   /* If we don't know the relationship between the store addresses,
2897      assume the worst.  */
2898   if (!BASE_REG_EQ (insn->insn_opcode, hist[0].insn_opcode)
2899       || !BASE_REG_EQ (insn->insn_opcode, hist[1].insn_opcode))
2900     return 1;
2901
2902   if (!fix_24k_record_store_info (&pos[0], insn)
2903       || !fix_24k_record_store_info (&pos[1], &hist[0])
2904       || !fix_24k_record_store_info (&pos[2], &hist[1]))
2905     return 1;
2906
2907   qsort (&pos, 3, sizeof (struct fix_24k_store_info), fix_24k_sort);
2908
2909   /* Pick a value of ALIGN and X such that all offsets are adjusted by
2910      X bytes and such that the base register + X is known to be aligned
2911      to align bytes.  */
2912
2913   if (((insn->insn_opcode >> OP_SH_RS) & OP_MASK_RS) == SP)
2914     align = 8;
2915   else
2916     {
2917       align = pos[0].align_to;
2918       base_offset = pos[0].off;
2919       for (i = 1; i < 3; i++)
2920         if (align < pos[i].align_to)
2921           {
2922             align = pos[i].align_to;
2923             base_offset = pos[i].off;
2924           }
2925       for (i = 0; i < 3; i++)
2926         pos[i].off -= base_offset;
2927     }
2928
2929   pos[0].off &= ~align + 1;
2930   pos[1].off &= ~align + 1;
2931   pos[2].off &= ~align + 1;
2932
2933   /* If any two stores write to the same chunk, they also write to the
2934      same doubleword.  The offsets are still sorted at this point.  */
2935   if (pos[0].off == pos[1].off || pos[1].off == pos[2].off)
2936     return 0;
2937
2938   /* A range of at least 9 bytes is needed for the stores to be in
2939      non-overlapping doublewords.  */
2940   if (pos[2].off - pos[0].off <= 8)
2941     return 0;
2942
2943   if (pos[2].off - pos[1].off >= 24
2944       || pos[1].off - pos[0].off >= 24
2945       || pos[2].off - pos[0].off >= 32)
2946     return 0;
2947
2948   return 1;
2949 }
2950
2951 /* Return the number of nops that would be needed if instruction INSN
2952    immediately followed the MAX_NOPS instructions given by HIST,
2953    where HIST[0] is the most recent instruction.  Ignore hazards
2954    between INSN and the first IGNORE instructions in HIST.
2955
2956    If INSN is null, return the worse-case number of nops for any
2957    instruction.  */
2958
2959 static int
2960 nops_for_insn (int ignore, const struct mips_cl_insn *hist,
2961                const struct mips_cl_insn *insn)
2962 {
2963   int i, nops, tmp_nops;
2964
2965   nops = 0;
2966   for (i = ignore; i < MAX_DELAY_NOPS; i++)
2967     {
2968       tmp_nops = insns_between (hist + i, insn) - i;
2969       if (tmp_nops > nops)
2970         nops = tmp_nops;
2971     }
2972
2973   if (mips_fix_vr4130)
2974     {
2975       tmp_nops = nops_for_vr4130 (ignore, hist, insn);
2976       if (tmp_nops > nops)
2977         nops = tmp_nops;
2978     }
2979
2980   if (mips_fix_24k)
2981     {
2982       tmp_nops = nops_for_24k (ignore, hist, insn);
2983       if (tmp_nops > nops)
2984         nops = tmp_nops;
2985     }
2986
2987   return nops;
2988 }
2989
2990 /* The variable arguments provide NUM_INSNS extra instructions that
2991    might be added to HIST.  Return the largest number of nops that
2992    would be needed after the extended sequence, ignoring hazards
2993    in the first IGNORE instructions.  */
2994
2995 static int
2996 nops_for_sequence (int num_insns, int ignore,
2997                    const struct mips_cl_insn *hist, ...)
2998 {
2999   va_list args;
3000   struct mips_cl_insn buffer[MAX_NOPS];
3001   struct mips_cl_insn *cursor;
3002   int nops;
3003
3004   va_start (args, hist);
3005   cursor = buffer + num_insns;
3006   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
3007   while (cursor > buffer)
3008     *--cursor = *va_arg (args, const struct mips_cl_insn *);
3009
3010   nops = nops_for_insn (ignore, buffer, NULL);
3011   va_end (args);
3012   return nops;
3013 }
3014
3015 /* Like nops_for_insn, but if INSN is a branch, take into account the
3016    worst-case delay for the branch target.  */
3017
3018 static int
3019 nops_for_insn_or_target (int ignore, const struct mips_cl_insn *hist,
3020                          const struct mips_cl_insn *insn)
3021 {
3022   int nops, tmp_nops;
3023
3024   nops = nops_for_insn (ignore, hist, insn);
3025   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
3026                               | INSN_COND_BRANCH_DELAY
3027                               | INSN_COND_BRANCH_LIKELY))
3028     {
3029       tmp_nops = nops_for_sequence (2, ignore ? ignore + 2 : 0,
3030                                     hist, insn, NOP_INSN);
3031       if (tmp_nops > nops)
3032         nops = tmp_nops;
3033     }
3034   else if (mips_opts.mips16
3035            && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
3036                                        | MIPS16_INSN_COND_BRANCH)))
3037     {
3038       tmp_nops = nops_for_sequence (1, ignore ? ignore + 1 : 0, hist, insn);
3039       if (tmp_nops > nops)
3040         nops = tmp_nops;
3041     }
3042   return nops;
3043 }
3044
3045 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
3046
3047 static void
3048 fix_loongson2f_nop (struct mips_cl_insn * ip)
3049 {
3050   if (strcmp (ip->insn_mo->name, "nop") == 0)
3051     ip->insn_opcode = LOONGSON2F_NOP_INSN;
3052 }
3053
3054 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
3055                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
3056
3057 static void
3058 fix_loongson2f_jump (struct mips_cl_insn * ip)
3059 {
3060   if (strcmp (ip->insn_mo->name, "j") == 0
3061       || strcmp (ip->insn_mo->name, "jr") == 0
3062       || strcmp (ip->insn_mo->name, "jalr") == 0)
3063     {
3064       int sreg;
3065       expressionS ep;
3066
3067       if (! mips_opts.at)
3068         return;
3069
3070       sreg = EXTRACT_OPERAND (RS, *ip);
3071       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
3072         return;
3073
3074       ep.X_op = O_constant;
3075       ep.X_add_number = 0xcfff0000;
3076       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
3077       ep.X_add_number = 0xffff;
3078       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
3079       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
3080     }
3081 }
3082
3083 static void
3084 fix_loongson2f (struct mips_cl_insn * ip)
3085 {
3086   if (mips_fix_loongson2f_nop)
3087     fix_loongson2f_nop (ip);
3088
3089   if (mips_fix_loongson2f_jump)
3090     fix_loongson2f_jump (ip);
3091 }
3092
3093 /* IP is a branch that has a delay slot, and we need to fill it
3094    automatically.   Return true if we can do that by swapping IP
3095    with the previous instruction.  */
3096
3097 static bfd_boolean
3098 can_swap_branch_p (struct mips_cl_insn *ip)
3099 {
3100   unsigned long pinfo, prev_pinfo;
3101   unsigned int gpr_read, gpr_write, prev_gpr_read, prev_gpr_write;
3102
3103   /* -O2 and above is required for this optimization.  */
3104   if (mips_optimize < 2)
3105     return FALSE;
3106
3107   /* If we have seen .set volatile or .set nomove, don't optimize.  */
3108   if (mips_opts.nomove)
3109     return FALSE;
3110
3111   /* We can't swap if the previous instruction's position is fixed.  */
3112   if (history[0].fixed_p)
3113     return FALSE;
3114
3115   /* If the previous previous insn was in a .set noreorder, we can't
3116      swap.  Actually, the MIPS assembler will swap in this situation.
3117      However, gcc configured -with-gnu-as will generate code like
3118
3119         .set    noreorder
3120         lw      $4,XXX
3121         .set    reorder
3122         INSN
3123         bne     $4,$0,foo
3124
3125      in which we can not swap the bne and INSN.  If gcc is not configured
3126      -with-gnu-as, it does not output the .set pseudo-ops.  */
3127   if (history[1].noreorder_p)
3128     return FALSE;
3129
3130   /* If the previous instruction had a fixup in mips16 mode, we can not
3131      swap.  This normally means that the previous instruction was a 4
3132      byte branch anyhow.  */
3133   if (mips_opts.mips16 && history[0].fixp[0])
3134     return FALSE;
3135
3136   /* If the branch is itself the target of a branch, we can not swap.
3137      We cheat on this; all we check for is whether there is a label on
3138      this instruction.  If there are any branches to anything other than
3139      a label, users must use .set noreorder.  */
3140   if (seg_info (now_seg)->label_list)
3141     return FALSE;
3142
3143   /* If the previous instruction is in a variant frag other than this
3144      branch's one, we cannot do the swap.  This does not apply to the
3145      mips16, which uses variant frags for different purposes.  */
3146   if (!mips_opts.mips16
3147       && history[0].frag
3148       && history[0].frag->fr_type == rs_machine_dependent)
3149     return FALSE;
3150
3151   /* We do not swap with a trap instruction, since it complicates trap
3152      handlers to have the trap instruction be in a delay slot.  */
3153   prev_pinfo = history[0].insn_mo->pinfo;
3154   if (prev_pinfo & INSN_TRAP)
3155     return FALSE;
3156
3157   /* If the previous instruction is a sync, sync.l, or sync.p, we can
3158      not swap.  */
3159   if (prev_pinfo & INSN_SYNC)
3160     return FALSE;
3161
3162   /* If the previous instruction is an ERET or DERET, avoid the swap.  */
3163   if (history[0].insn_opcode == INSN_ERET)
3164     return FALSE;
3165   if (history[0].insn_opcode == INSN_DERET)
3166     return FALSE;
3167
3168   /* Check for conflicts between the branch and the instructions
3169      before the candidate delay slot.  */
3170   if (nops_for_insn (0, history + 1, ip) > 0)
3171     return FALSE;
3172
3173   /* Check for conflicts between the swapped sequence and the
3174      target of the branch.  */
3175   if (nops_for_sequence (2, 0, history + 1, ip, history) > 0)
3176     return FALSE;
3177
3178   /* If the branch reads a register that the previous
3179      instruction sets, we can not swap.  */
3180   gpr_read = gpr_read_mask (ip);
3181   prev_gpr_write = gpr_write_mask (&history[0]);
3182   if (gpr_read & prev_gpr_write)
3183     return FALSE;
3184
3185   /* If the branch writes a register that the previous
3186      instruction sets, we can not swap.  */
3187   gpr_write = gpr_write_mask (ip);
3188   if (gpr_write & prev_gpr_write)
3189     return FALSE;
3190
3191   /* If the branch writes a register that the previous
3192      instruction reads, we can not swap.  */
3193   prev_gpr_read = gpr_read_mask (&history[0]);
3194   if (gpr_write & prev_gpr_read)
3195     return FALSE;
3196
3197   /* If one instruction sets a condition code and the
3198      other one uses a condition code, we can not swap.  */
3199   pinfo = ip->insn_mo->pinfo;
3200   if ((pinfo & INSN_READ_COND_CODE)
3201       && (prev_pinfo & INSN_WRITE_COND_CODE))
3202     return FALSE;
3203   if ((pinfo & INSN_WRITE_COND_CODE)
3204       && (prev_pinfo & INSN_READ_COND_CODE))
3205     return FALSE;
3206
3207   /* If the previous instruction uses the PC, we can not swap.  */
3208   if (mips_opts.mips16 && (prev_pinfo & MIPS16_INSN_READ_PC))
3209     return FALSE;
3210
3211   return TRUE;
3212 }
3213
3214 /* Decide how we should add IP to the instruction stream.  */
3215
3216 static enum append_method
3217 get_append_method (struct mips_cl_insn *ip)
3218 {
3219   unsigned long pinfo;
3220
3221   /* The relaxed version of a macro sequence must be inherently
3222      hazard-free.  */
3223   if (mips_relax.sequence == 2)
3224     return APPEND_ADD;
3225
3226   /* We must not dabble with instructions in a ".set norerorder" block.  */
3227   if (mips_opts.noreorder)
3228     return APPEND_ADD;
3229
3230   /* Otherwise, it's our responsibility to fill branch delay slots.  */
3231   pinfo = ip->insn_mo->pinfo;
3232   if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3233       || (pinfo & INSN_COND_BRANCH_DELAY))
3234     {
3235       if (can_swap_branch_p (ip))
3236         return APPEND_SWAP;
3237
3238       if (mips_opts.mips16
3239           && ISA_SUPPORTS_MIPS16E
3240           && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3241           && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31)))
3242         return APPEND_ADD_COMPACT;
3243
3244       return APPEND_ADD_WITH_NOP;
3245     }
3246
3247   /* We don't bother trying to track the target of branches, so there's
3248      nothing we can use to fill a branch-likely slot.  */
3249   if (pinfo & INSN_COND_BRANCH_LIKELY)
3250     return APPEND_ADD_WITH_NOP;
3251
3252   return APPEND_ADD;
3253 }
3254
3255 /* IP is a MIPS16 instruction whose opcode we have just changed.
3256    Point IP->insn_mo to the new opcode's definition.  */
3257
3258 static void
3259 find_altered_mips16_opcode (struct mips_cl_insn *ip)
3260 {
3261   const struct mips_opcode *mo, *end;
3262
3263   end = &mips16_opcodes[bfd_mips16_num_opcodes];
3264   for (mo = ip->insn_mo; mo < end; mo++)
3265     if ((ip->insn_opcode & mo->mask) == mo->match)
3266       {
3267         ip->insn_mo = mo;
3268         return;
3269       }
3270   abort ();
3271 }
3272
3273 /* Output an instruction.  IP is the instruction information.
3274    ADDRESS_EXPR is an operand of the instruction to be used with
3275    RELOC_TYPE.  */
3276
3277 static void
3278 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
3279              bfd_reloc_code_real_type *reloc_type)
3280 {
3281   unsigned long prev_pinfo, pinfo;
3282   bfd_boolean relaxed_branch = FALSE;
3283   enum append_method method;
3284
3285   if (mips_fix_loongson2f)
3286     fix_loongson2f (ip);
3287
3288   /* Mark instruction labels in mips16 mode.  */
3289   mips16_mark_labels ();
3290
3291   file_ase_mips16 |= mips_opts.mips16;
3292
3293   prev_pinfo = history[0].insn_mo->pinfo;
3294   pinfo = ip->insn_mo->pinfo;
3295
3296   if (address_expr == NULL)
3297     ip->complete_p = 1;
3298   else if (*reloc_type <= BFD_RELOC_UNUSED
3299            && address_expr->X_op == O_constant)
3300     {
3301       unsigned int tmp;
3302
3303       ip->complete_p = 1;
3304       switch (*reloc_type)
3305         {
3306         case BFD_RELOC_32:
3307           ip->insn_opcode |= address_expr->X_add_number;
3308           break;
3309
3310         case BFD_RELOC_MIPS_HIGHEST:
3311           tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3312           ip->insn_opcode |= tmp & 0xffff;
3313           break;
3314
3315         case BFD_RELOC_MIPS_HIGHER:
3316           tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3317           ip->insn_opcode |= tmp & 0xffff;
3318           break;
3319
3320         case BFD_RELOC_HI16_S:
3321           tmp = (address_expr->X_add_number + 0x8000) >> 16;
3322           ip->insn_opcode |= tmp & 0xffff;
3323           break;
3324
3325         case BFD_RELOC_HI16:
3326           ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3327           break;
3328
3329         case BFD_RELOC_UNUSED:
3330         case BFD_RELOC_LO16:
3331         case BFD_RELOC_MIPS_GOT_DISP:
3332           ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3333           break;
3334
3335         case BFD_RELOC_MIPS_JMP:
3336           if ((address_expr->X_add_number & 3) != 0)
3337             as_bad (_("jump to misaligned address (0x%lx)"),
3338                     (unsigned long) address_expr->X_add_number);
3339           ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3340           ip->complete_p = 0;
3341           break;
3342
3343         case BFD_RELOC_MIPS16_JMP:
3344           if ((address_expr->X_add_number & 3) != 0)
3345             as_bad (_("jump to misaligned address (0x%lx)"),
3346                     (unsigned long) address_expr->X_add_number);
3347           ip->insn_opcode |=
3348             (((address_expr->X_add_number & 0x7c0000) << 3)
3349                | ((address_expr->X_add_number & 0xf800000) >> 7)
3350                | ((address_expr->X_add_number & 0x3fffc) >> 2));
3351           ip->complete_p = 0;
3352           break;
3353
3354         case BFD_RELOC_16_PCREL_S2:
3355           if ((address_expr->X_add_number & 3) != 0)
3356             as_bad (_("branch to misaligned address (0x%lx)"),
3357                     (unsigned long) address_expr->X_add_number);
3358           if (!mips_relax_branch)
3359             {
3360               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3361                 as_bad (_("branch address range overflow (0x%lx)"),
3362                         (unsigned long) address_expr->X_add_number);
3363               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3364             }
3365           ip->complete_p = 0;
3366           break;
3367
3368         default:
3369           internalError ();
3370         }       
3371     }
3372
3373   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3374     {
3375       /* There are a lot of optimizations we could do that we don't.
3376          In particular, we do not, in general, reorder instructions.
3377          If you use gcc with optimization, it will reorder
3378          instructions and generally do much more optimization then we
3379          do here; repeating all that work in the assembler would only
3380          benefit hand written assembly code, and does not seem worth
3381          it.  */
3382       int nops = (mips_optimize == 0
3383                   ? nops_for_insn (0, history, NULL)
3384                   : nops_for_insn_or_target (0, history, ip));
3385       if (nops > 0)
3386         {
3387           fragS *old_frag;
3388           unsigned long old_frag_offset;
3389           int i;
3390
3391           old_frag = frag_now;
3392           old_frag_offset = frag_now_fix ();
3393
3394           for (i = 0; i < nops; i++)
3395             emit_nop ();
3396
3397           if (listing)
3398             {
3399               listing_prev_line ();
3400               /* We may be at the start of a variant frag.  In case we
3401                  are, make sure there is enough space for the frag
3402                  after the frags created by listing_prev_line.  The
3403                  argument to frag_grow here must be at least as large
3404                  as the argument to all other calls to frag_grow in
3405                  this file.  We don't have to worry about being in the
3406                  middle of a variant frag, because the variants insert
3407                  all needed nop instructions themselves.  */
3408               frag_grow (40);
3409             }
3410
3411           mips_move_labels ();
3412
3413 #ifndef NO_ECOFF_DEBUGGING
3414           if (ECOFF_DEBUGGING)
3415             ecoff_fix_loc (old_frag, old_frag_offset);
3416 #endif
3417         }
3418     }
3419   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
3420     {
3421       int nops;
3422
3423       /* Work out how many nops in prev_nop_frag are needed by IP,
3424          ignoring hazards generated by the first prev_nop_frag_since
3425          instructions.  */
3426       nops = nops_for_insn_or_target (prev_nop_frag_since, history, ip);
3427       gas_assert (nops <= prev_nop_frag_holds);
3428
3429       /* Enforce NOPS as a minimum.  */
3430       if (nops > prev_nop_frag_required)
3431         prev_nop_frag_required = nops;
3432
3433       if (prev_nop_frag_holds == prev_nop_frag_required)
3434         {
3435           /* Settle for the current number of nops.  Update the history
3436              accordingly (for the benefit of any future .set reorder code).  */
3437           prev_nop_frag = NULL;
3438           insert_into_history (prev_nop_frag_since,
3439                                prev_nop_frag_holds, NOP_INSN);
3440         }
3441       else
3442         {
3443           /* Allow this instruction to replace one of the nops that was
3444              tentatively added to prev_nop_frag.  */
3445           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
3446           prev_nop_frag_holds--;
3447           prev_nop_frag_since++;
3448         }
3449     }
3450
3451   method = get_append_method (ip);
3452
3453 #ifdef OBJ_ELF
3454   /* The value passed to dwarf2_emit_insn is the distance between
3455      the beginning of the current instruction and the address that
3456      should be recorded in the debug tables.  This is normally the
3457      current address.
3458
3459      For MIPS16 debug info we want to use ISA-encoded addresses,
3460      so we use -1 for an address higher by one than the current one.
3461
3462      If the instruction produced is a branch that we will swap with
3463      the preceding instruction, then we add the displacement by which
3464      the branch will be moved backwards.  This is more appropriate
3465      and for MIPS16 code also prevents a debugger from placing a
3466      breakpoint in the middle of the branch (and corrupting code if
3467      software breakpoints are used).  */
3468   dwarf2_emit_insn ((mips_opts.mips16 ? -1 : 0)
3469                     + (method == APPEND_SWAP ? insn_length (history) : 0));
3470 #endif
3471
3472   if (address_expr
3473       && *reloc_type == BFD_RELOC_16_PCREL_S2
3474       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
3475           || pinfo & INSN_COND_BRANCH_LIKELY)
3476       && mips_relax_branch
3477       /* Don't try branch relaxation within .set nomacro, or within
3478          .set noat if we use $at for PIC computations.  If it turns
3479          out that the branch was out-of-range, we'll get an error.  */
3480       && !mips_opts.warn_about_macros
3481       && (mips_opts.at || mips_pic == NO_PIC)
3482       /* Don't relax BPOSGE32/64 as they have no complementing branches.  */
3483       && !(ip->insn_mo->membership & (INSN_DSP64 | INSN_DSP))
3484       && !mips_opts.mips16)
3485     {
3486       relaxed_branch = TRUE;
3487       add_relaxed_insn (ip, (relaxed_branch_length
3488                              (NULL, NULL,
3489                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
3490                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
3491                               : 0)), 4,
3492                         RELAX_BRANCH_ENCODE
3493                         (AT,
3494                          pinfo & INSN_UNCOND_BRANCH_DELAY,
3495                          pinfo & INSN_COND_BRANCH_LIKELY,
3496                          pinfo & INSN_WRITE_GPR_31,
3497                          0),
3498                         address_expr->X_add_symbol,
3499                         address_expr->X_add_number);
3500       *reloc_type = BFD_RELOC_UNUSED;
3501     }
3502   else if (*reloc_type > BFD_RELOC_UNUSED)
3503     {
3504       /* We need to set up a variant frag.  */
3505       gas_assert (mips_opts.mips16 && address_expr != NULL);
3506       add_relaxed_insn (ip, 4, 0,
3507                         RELAX_MIPS16_ENCODE
3508                         (*reloc_type - BFD_RELOC_UNUSED,
3509                          mips16_small, mips16_ext,
3510                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
3511                          history[0].mips16_absolute_jump_p),
3512                         make_expr_symbol (address_expr), 0);
3513     }
3514   else if (mips_opts.mips16
3515            && ! ip->use_extend
3516            && *reloc_type != BFD_RELOC_MIPS16_JMP)
3517     {
3518       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
3519         /* Make sure there is enough room to swap this instruction with
3520            a following jump instruction.  */
3521         frag_grow (6);
3522       add_fixed_insn (ip);
3523     }
3524   else
3525     {
3526       if (mips_opts.mips16
3527           && mips_opts.noreorder
3528           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
3529         as_warn (_("extended instruction in delay slot"));
3530
3531       if (mips_relax.sequence)
3532         {
3533           /* If we've reached the end of this frag, turn it into a variant
3534              frag and record the information for the instructions we've
3535              written so far.  */
3536           if (frag_room () < 4)
3537             relax_close_frag ();
3538           mips_relax.sizes[mips_relax.sequence - 1] += 4;
3539         }
3540
3541       if (mips_relax.sequence != 2)
3542         mips_macro_warning.sizes[0] += 4;
3543       if (mips_relax.sequence != 1)
3544         mips_macro_warning.sizes[1] += 4;
3545
3546       if (mips_opts.mips16)
3547         {
3548           ip->fixed_p = 1;
3549           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
3550         }
3551       add_fixed_insn (ip);
3552     }
3553
3554   if (!ip->complete_p && *reloc_type < BFD_RELOC_UNUSED)
3555     {
3556       reloc_howto_type *howto;
3557       int i;
3558
3559       /* In a compound relocation, it is the final (outermost)
3560          operator that determines the relocated field.  */
3561       for (i = 1; i < 3; i++)
3562         if (reloc_type[i] == BFD_RELOC_UNUSED)
3563           break;
3564
3565       howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3566       if (howto == NULL)
3567         {
3568           /* To reproduce this failure try assembling gas/testsuites/
3569              gas/mips/mips16-intermix.s with a mips-ecoff targeted
3570              assembler.  */
3571           as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3572           howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3573         }
3574           
3575       ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3576                                  bfd_get_reloc_size (howto),
3577                                  address_expr,
3578                                  reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3579                                  reloc_type[0]);
3580
3581       /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3582       if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3583           && ip->fixp[0]->fx_addsy)
3584         *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3585
3586       /* These relocations can have an addend that won't fit in
3587          4 octets for 64bit assembly.  */
3588       if (HAVE_64BIT_GPRS
3589           && ! howto->partial_inplace
3590           && (reloc_type[0] == BFD_RELOC_16
3591               || reloc_type[0] == BFD_RELOC_32
3592               || reloc_type[0] == BFD_RELOC_MIPS_JMP
3593               || reloc_type[0] == BFD_RELOC_GPREL16
3594               || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3595               || reloc_type[0] == BFD_RELOC_GPREL32
3596               || reloc_type[0] == BFD_RELOC_64
3597               || reloc_type[0] == BFD_RELOC_CTOR
3598               || reloc_type[0] == BFD_RELOC_MIPS_SUB
3599               || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3600               || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3601               || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3602               || reloc_type[0] == BFD_RELOC_MIPS_REL16
3603               || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3604               || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3605               || hi16_reloc_p (reloc_type[0])
3606               || lo16_reloc_p (reloc_type[0])))
3607         ip->fixp[0]->fx_no_overflow = 1;
3608
3609       if (mips_relax.sequence)
3610         {
3611           if (mips_relax.first_fixup == 0)
3612             mips_relax.first_fixup = ip->fixp[0];
3613         }
3614       else if (reloc_needs_lo_p (*reloc_type))
3615         {
3616           struct mips_hi_fixup *hi_fixup;
3617
3618           /* Reuse the last entry if it already has a matching %lo.  */
3619           hi_fixup = mips_hi_fixup_list;
3620           if (hi_fixup == 0
3621               || !fixup_has_matching_lo_p (hi_fixup->fixp))
3622             {
3623               hi_fixup = ((struct mips_hi_fixup *)
3624                           xmalloc (sizeof (struct mips_hi_fixup)));
3625               hi_fixup->next = mips_hi_fixup_list;
3626               mips_hi_fixup_list = hi_fixup;
3627             }
3628           hi_fixup->fixp = ip->fixp[0];
3629           hi_fixup->seg = now_seg;
3630         }
3631
3632       /* Add fixups for the second and third relocations, if given.
3633          Note that the ABI allows the second relocation to be
3634          against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3635          moment we only use RSS_UNDEF, but we could add support
3636          for the others if it ever becomes necessary.  */
3637       for (i = 1; i < 3; i++)
3638         if (reloc_type[i] != BFD_RELOC_UNUSED)
3639           {
3640             ip->fixp[i] = fix_new (ip->frag, ip->where,
3641                                    ip->fixp[0]->fx_size, NULL, 0,
3642                                    FALSE, reloc_type[i]);
3643
3644             /* Use fx_tcbit to mark compound relocs.  */
3645             ip->fixp[0]->fx_tcbit = 1;
3646             ip->fixp[i]->fx_tcbit = 1;
3647           }
3648     }
3649   install_insn (ip);
3650
3651   /* Update the register mask information.  */
3652   mips_gprmask |= gpr_read_mask (ip) | gpr_write_mask (ip);
3653   mips_cprmask[1] |= fpr_read_mask (ip) | fpr_write_mask (ip);
3654
3655   switch (method)
3656     {
3657     case APPEND_ADD:
3658       insert_into_history (0, 1, ip);
3659       break;
3660
3661     case APPEND_ADD_WITH_NOP:
3662       insert_into_history (0, 1, ip);
3663       emit_nop ();
3664       if (mips_relax.sequence)
3665         mips_relax.sizes[mips_relax.sequence - 1] += 4;
3666       break;
3667
3668     case APPEND_ADD_COMPACT:
3669       /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3670       gas_assert (mips_opts.mips16);
3671       ip->insn_opcode |= 0x0080;
3672       find_altered_mips16_opcode (ip);
3673       install_insn (ip);
3674       insert_into_history (0, 1, ip);
3675       break;
3676
3677     case APPEND_SWAP:
3678       {
3679         struct mips_cl_insn delay = history[0];
3680         if (mips_opts.mips16)
3681           {
3682             know (delay.frag == ip->frag);
3683             move_insn (ip, delay.frag, delay.where);
3684             move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3685           }
3686         else if (relaxed_branch)
3687           {
3688             /* Add the delay slot instruction to the end of the
3689                current frag and shrink the fixed part of the
3690                original frag.  If the branch occupies the tail of
3691                the latter, move it backwards to cover the gap.  */
3692             delay.frag->fr_fix -= 4;
3693             if (delay.frag == ip->frag)
3694               move_insn (ip, ip->frag, ip->where - 4);
3695             add_fixed_insn (&delay);
3696           }
3697         else
3698           {
3699             move_insn (&delay, ip->frag, ip->where);
3700             move_insn (ip, history[0].frag, history[0].where);
3701           }
3702         history[0] = *ip;
3703         delay.fixed_p = 1;
3704         insert_into_history (0, 1, &delay);
3705       }
3706       break;
3707     }
3708
3709   /* If we have just completed an unconditional branch, clear the history.  */
3710   if ((history[1].insn_mo->pinfo & INSN_UNCOND_BRANCH_DELAY)
3711       || (mips_opts.mips16
3712           && (history[0].insn_mo->pinfo & MIPS16_INSN_UNCOND_BRANCH)))
3713     mips_no_prev_insn ();
3714
3715   /* We just output an insn, so the next one doesn't have a label.  */
3716   mips_clear_insn_labels ();
3717 }
3718
3719 /* Forget that there was any previous instruction or label.  */
3720
3721 static void
3722 mips_no_prev_insn (void)
3723 {
3724   prev_nop_frag = NULL;
3725   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3726   mips_clear_insn_labels ();
3727 }
3728
3729 /* This function must be called before we emit something other than
3730    instructions.  It is like mips_no_prev_insn except that it inserts
3731    any NOPS that might be needed by previous instructions.  */
3732
3733 void
3734 mips_emit_delays (void)
3735 {
3736   if (! mips_opts.noreorder)
3737     {
3738       int nops = nops_for_insn (0, history, NULL);
3739       if (nops > 0)
3740         {
3741           while (nops-- > 0)
3742             add_fixed_insn (NOP_INSN);
3743           mips_move_labels ();
3744         }
3745     }
3746   mips_no_prev_insn ();
3747 }
3748
3749 /* Start a (possibly nested) noreorder block.  */
3750
3751 static void
3752 start_noreorder (void)
3753 {
3754   if (mips_opts.noreorder == 0)
3755     {
3756       unsigned int i;
3757       int nops;
3758
3759       /* None of the instructions before the .set noreorder can be moved.  */
3760       for (i = 0; i < ARRAY_SIZE (history); i++)
3761         history[i].fixed_p = 1;
3762
3763       /* Insert any nops that might be needed between the .set noreorder
3764          block and the previous instructions.  We will later remove any
3765          nops that turn out not to be needed.  */
3766       nops = nops_for_insn (0, history, NULL);
3767       if (nops > 0)
3768         {
3769           if (mips_optimize != 0)
3770             {
3771               /* Record the frag which holds the nop instructions, so
3772                  that we can remove them if we don't need them.  */
3773               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3774               prev_nop_frag = frag_now;
3775               prev_nop_frag_holds = nops;
3776               prev_nop_frag_required = 0;
3777               prev_nop_frag_since = 0;
3778             }
3779
3780           for (; nops > 0; --nops)
3781             add_fixed_insn (NOP_INSN);
3782
3783           /* Move on to a new frag, so that it is safe to simply
3784              decrease the size of prev_nop_frag.  */
3785           frag_wane (frag_now);
3786           frag_new (0);
3787           mips_move_labels ();
3788         }
3789       mips16_mark_labels ();
3790       mips_clear_insn_labels ();
3791     }
3792   mips_opts.noreorder++;
3793   mips_any_noreorder = 1;
3794 }
3795
3796 /* End a nested noreorder block.  */
3797
3798 static void
3799 end_noreorder (void)
3800 {
3801
3802   mips_opts.noreorder--;
3803   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3804     {
3805       /* Commit to inserting prev_nop_frag_required nops and go back to
3806          handling nop insertion the .set reorder way.  */
3807       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3808                                 * (mips_opts.mips16 ? 2 : 4));
3809       insert_into_history (prev_nop_frag_since,
3810                            prev_nop_frag_required, NOP_INSN);
3811       prev_nop_frag = NULL;
3812     }
3813 }
3814
3815 /* Set up global variables for the start of a new macro.  */
3816
3817 static void
3818 macro_start (void)
3819 {
3820   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3821   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3822                                      && (history[0].insn_mo->pinfo
3823                                          & (INSN_UNCOND_BRANCH_DELAY
3824                                             | INSN_COND_BRANCH_DELAY
3825                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3826 }
3827
3828 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3829    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3830    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3831
3832 static const char *
3833 macro_warning (relax_substateT subtype)
3834 {
3835   if (subtype & RELAX_DELAY_SLOT)
3836     return _("Macro instruction expanded into multiple instructions"
3837              " in a branch delay slot");
3838   else if (subtype & RELAX_NOMACRO)
3839     return _("Macro instruction expanded into multiple instructions");
3840   else
3841     return 0;
3842 }
3843
3844 /* Finish up a macro.  Emit warnings as appropriate.  */
3845
3846 static void
3847 macro_end (void)
3848 {
3849   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3850     {
3851       relax_substateT subtype;
3852
3853       /* Set up the relaxation warning flags.  */
3854       subtype = 0;
3855       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3856         subtype |= RELAX_SECOND_LONGER;
3857       if (mips_opts.warn_about_macros)
3858         subtype |= RELAX_NOMACRO;
3859       if (mips_macro_warning.delay_slot_p)
3860         subtype |= RELAX_DELAY_SLOT;
3861
3862       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3863         {
3864           /* Either the macro has a single implementation or both
3865              implementations are longer than 4 bytes.  Emit the
3866              warning now.  */
3867           const char *msg = macro_warning (subtype);
3868           if (msg != 0)
3869             as_warn ("%s", msg);
3870         }
3871       else
3872         {
3873           /* One implementation might need a warning but the other
3874              definitely doesn't.  */
3875           mips_macro_warning.first_frag->fr_subtype |= subtype;
3876         }
3877     }
3878 }
3879
3880 /* Read a macro's relocation codes from *ARGS and store them in *R.
3881    The first argument in *ARGS will be either the code for a single
3882    relocation or -1 followed by the three codes that make up a
3883    composite relocation.  */
3884
3885 static void
3886 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3887 {
3888   int i, next;
3889
3890   next = va_arg (*args, int);
3891   if (next >= 0)
3892     r[0] = (bfd_reloc_code_real_type) next;
3893   else
3894     for (i = 0; i < 3; i++)
3895       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3896 }
3897
3898 /* Build an instruction created by a macro expansion.  This is passed
3899    a pointer to the count of instructions created so far, an
3900    expression, the name of the instruction to build, an operand format
3901    string, and corresponding arguments.  */
3902
3903 static void
3904 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3905 {
3906   const struct mips_opcode *mo;
3907   struct mips_cl_insn insn;
3908   bfd_reloc_code_real_type r[3];
3909   va_list args;
3910
3911   va_start (args, fmt);
3912
3913   if (mips_opts.mips16)
3914     {
3915       mips16_macro_build (ep, name, fmt, &args);
3916       va_end (args);
3917       return;
3918     }
3919
3920   r[0] = BFD_RELOC_UNUSED;
3921   r[1] = BFD_RELOC_UNUSED;
3922   r[2] = BFD_RELOC_UNUSED;
3923   mo = (struct mips_opcode *) hash_find (op_hash, name);
3924   gas_assert (mo);
3925   gas_assert (strcmp (name, mo->name) == 0);
3926
3927   while (1)
3928     {
3929       /* Search until we get a match for NAME.  It is assumed here that
3930          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3931       if (strcmp (fmt, mo->args) == 0
3932           && mo->pinfo != INSN_MACRO
3933           && is_opcode_valid (mo))
3934         break;
3935
3936       ++mo;
3937       gas_assert (mo->name);
3938       gas_assert (strcmp (name, mo->name) == 0);
3939     }
3940
3941   create_insn (&insn, mo);
3942   for (;;)
3943     {
3944       switch (*fmt++)
3945         {
3946         case '\0':
3947           break;
3948
3949         case ',':
3950         case '(':
3951         case ')':
3952           continue;
3953
3954         case '+':
3955           switch (*fmt++)
3956             {
3957             case 'A':
3958             case 'E':
3959               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3960               continue;
3961
3962             case 'B':
3963             case 'F':
3964               /* Note that in the macro case, these arguments are already
3965                  in MSB form.  (When handling the instruction in the
3966                  non-macro case, these arguments are sizes from which
3967                  MSB values must be calculated.)  */
3968               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3969               continue;
3970
3971             case 'C':
3972             case 'G':
3973             case 'H':
3974               /* Note that in the macro case, these arguments are already
3975                  in MSBD form.  (When handling the instruction in the
3976                  non-macro case, these arguments are sizes from which
3977                  MSBD values must be calculated.)  */
3978               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3979               continue;
3980
3981             case 'Q':
3982               INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3983               continue;
3984
3985             default:
3986               internalError ();
3987             }
3988           continue;
3989
3990         case '2':
3991           INSERT_OPERAND (BP, insn, va_arg (args, int));
3992           continue;
3993
3994         case 't':
3995         case 'w':
3996         case 'E':
3997           INSERT_OPERAND (RT, insn, va_arg (args, int));
3998           continue;
3999
4000         case 'c':
4001           INSERT_OPERAND (CODE, insn, va_arg (args, int));
4002           continue;
4003
4004         case 'T':
4005         case 'W':
4006           INSERT_OPERAND (FT, insn, va_arg (args, int));
4007           continue;
4008
4009         case 'd':
4010         case 'G':
4011         case 'K':
4012           INSERT_OPERAND (RD, insn, va_arg (args, int));
4013           continue;
4014
4015         case 'U':
4016           {
4017             int tmp = va_arg (args, int);
4018
4019             INSERT_OPERAND (RT, insn, tmp);
4020             INSERT_OPERAND (RD, insn, tmp);
4021             continue;
4022           }
4023
4024         case 'V':
4025         case 'S':
4026           INSERT_OPERAND (FS, insn, va_arg (args, int));
4027           continue;
4028
4029         case 'z':
4030           continue;
4031
4032         case '<':
4033           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
4034           continue;
4035
4036         case 'D':
4037           INSERT_OPERAND (FD, insn, va_arg (args, int));
4038           continue;
4039
4040         case 'B':
4041           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
4042           continue;
4043
4044         case 'J':
4045           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
4046           continue;
4047
4048         case 'q':
4049           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
4050           continue;
4051
4052         case 'b':
4053         case 's':
4054         case 'r':
4055         case 'v':
4056           INSERT_OPERAND (RS, insn, va_arg (args, int));
4057           continue;
4058
4059         case 'i':
4060         case 'j':
4061           macro_read_relocs (&args, r);
4062           gas_assert (*r == BFD_RELOC_GPREL16
4063                       || *r == BFD_RELOC_MIPS_HIGHER
4064                       || *r == BFD_RELOC_HI16_S
4065                       || *r == BFD_RELOC_LO16
4066                       || *r == BFD_RELOC_MIPS_GOT_OFST);
4067           continue;
4068
4069         case 'o':
4070           macro_read_relocs (&args, r);
4071           continue;
4072
4073         case 'u':
4074           macro_read_relocs (&args, r);
4075           gas_assert (ep != NULL
4076                       && (ep->X_op == O_constant
4077                           || (ep->X_op == O_symbol
4078                               && (*r == BFD_RELOC_MIPS_HIGHEST
4079                                   || *r == BFD_RELOC_HI16_S
4080                                   || *r == BFD_RELOC_HI16
4081                                   || *r == BFD_RELOC_GPREL16
4082                                   || *r == BFD_RELOC_MIPS_GOT_HI16
4083                                   || *r == BFD_RELOC_MIPS_CALL_HI16))));
4084           continue;
4085
4086         case 'p':
4087           gas_assert (ep != NULL);
4088
4089           /*
4090            * This allows macro() to pass an immediate expression for
4091            * creating short branches without creating a symbol.
4092            *
4093            * We don't allow branch relaxation for these branches, as
4094            * they should only appear in ".set nomacro" anyway.
4095            */
4096           if (ep->X_op == O_constant)
4097             {
4098               if ((ep->X_add_number & 3) != 0)
4099                 as_bad (_("branch to misaligned address (0x%lx)"),
4100                         (unsigned long) ep->X_add_number);
4101               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
4102                 as_bad (_("branch address range overflow (0x%lx)"),
4103                         (unsigned long) ep->X_add_number);
4104               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
4105               ep = NULL;
4106             }
4107           else
4108             *r = BFD_RELOC_16_PCREL_S2;
4109           continue;
4110
4111         case 'a':
4112           gas_assert (ep != NULL);
4113           *r = BFD_RELOC_MIPS_JMP;
4114           continue;
4115
4116         case 'C':
4117           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
4118           continue;
4119
4120         case 'k':
4121           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
4122           continue;
4123
4124         default:
4125           internalError ();
4126         }
4127       break;
4128     }
4129   va_end (args);
4130   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4131
4132   append_insn (&insn, ep, r);
4133 }
4134
4135 static void
4136 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
4137                     va_list *args)
4138 {
4139   struct mips_opcode *mo;
4140   struct mips_cl_insn insn;
4141   bfd_reloc_code_real_type r[3]
4142     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4143
4144   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
4145   gas_assert (mo);
4146   gas_assert (strcmp (name, mo->name) == 0);
4147
4148   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
4149     {
4150       ++mo;
4151       gas_assert (mo->name);
4152       gas_assert (strcmp (name, mo->name) == 0);
4153     }
4154
4155   create_insn (&insn, mo);
4156   for (;;)
4157     {
4158       int c;
4159
4160       c = *fmt++;
4161       switch (c)
4162         {
4163         case '\0':
4164           break;
4165
4166         case ',':
4167         case '(':
4168         case ')':
4169           continue;
4170
4171         case 'y':
4172         case 'w':
4173           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
4174           continue;
4175
4176         case 'x':
4177         case 'v':
4178           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
4179           continue;
4180
4181         case 'z':
4182           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
4183           continue;
4184
4185         case 'Z':
4186           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
4187           continue;
4188
4189         case '0':
4190         case 'S':
4191         case 'P':
4192         case 'R':
4193           continue;
4194
4195         case 'X':
4196           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
4197           continue;
4198
4199         case 'Y':
4200           {
4201             int regno;
4202
4203             regno = va_arg (*args, int);
4204             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
4205             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
4206           }
4207           continue;
4208
4209         case '<':
4210         case '>':
4211         case '4':
4212         case '5':
4213         case 'H':
4214         case 'W':
4215         case 'D':
4216         case 'j':
4217         case '8':
4218         case 'V':
4219         case 'C':
4220         case 'U':
4221         case 'k':
4222         case 'K':
4223         case 'p':
4224         case 'q':
4225           {
4226             gas_assert (ep != NULL);
4227
4228             if (ep->X_op != O_constant)
4229               *r = (int) BFD_RELOC_UNUSED + c;
4230             else
4231               {
4232                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
4233                               FALSE, &insn.insn_opcode, &insn.use_extend,
4234                               &insn.extend);
4235                 ep = NULL;
4236                 *r = BFD_RELOC_UNUSED;
4237               }
4238           }
4239           continue;
4240
4241         case '6':
4242           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
4243           continue;
4244         }
4245
4246       break;
4247     }
4248
4249   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
4250
4251   append_insn (&insn, ep, r);
4252 }
4253
4254 /*
4255  * Sign-extend 32-bit mode constants that have bit 31 set and all
4256  * higher bits unset.
4257  */
4258 static void
4259 normalize_constant_expr (expressionS *ex)
4260 {
4261   if (ex->X_op == O_constant
4262       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4263     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4264                         - 0x80000000);
4265 }
4266
4267 /*
4268  * Sign-extend 32-bit mode address offsets that have bit 31 set and
4269  * all higher bits unset.
4270  */
4271 static void
4272 normalize_address_expr (expressionS *ex)
4273 {
4274   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
4275         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
4276       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
4277     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
4278                         - 0x80000000);
4279 }
4280
4281 /*
4282  * Generate a "jalr" instruction with a relocation hint to the called
4283  * function.  This occurs in NewABI PIC code.
4284  */
4285 static void
4286 macro_build_jalr (expressionS *ep)
4287 {
4288   char *f = NULL;
4289
4290   if (MIPS_JALR_HINT_P (ep))
4291     {
4292       frag_grow (8);
4293       f = frag_more (0);
4294     }
4295   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4296   if (MIPS_JALR_HINT_P (ep))
4297     fix_new_exp (frag_now, f - frag_now->fr_literal,
4298                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4299 }
4300
4301 /*
4302  * Generate a "lui" instruction.
4303  */
4304 static void
4305 macro_build_lui (expressionS *ep, int regnum)
4306 {
4307   expressionS high_expr;
4308   const struct mips_opcode *mo;
4309   struct mips_cl_insn insn;
4310   bfd_reloc_code_real_type r[3]
4311     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4312   const char *name = "lui";
4313   const char *fmt = "t,u";
4314
4315   gas_assert (! mips_opts.mips16);
4316
4317   high_expr = *ep;
4318
4319   if (high_expr.X_op == O_constant)
4320     {
4321       /* We can compute the instruction now without a relocation entry.  */
4322       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4323                                 >> 16) & 0xffff;
4324       *r = BFD_RELOC_UNUSED;
4325     }
4326   else
4327     {
4328       gas_assert (ep->X_op == O_symbol);
4329       /* _gp_disp is a special case, used from s_cpload.
4330          __gnu_local_gp is used if mips_no_shared.  */
4331       gas_assert (mips_pic == NO_PIC
4332               || (! HAVE_NEWABI
4333                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4334               || (! mips_in_shared
4335                   && strcmp (S_GET_NAME (ep->X_add_symbol),
4336                              "__gnu_local_gp") == 0));
4337       *r = BFD_RELOC_HI16_S;
4338     }
4339
4340   mo = hash_find (op_hash, name);
4341   gas_assert (strcmp (name, mo->name) == 0);
4342   gas_assert (strcmp (fmt, mo->args) == 0);
4343   create_insn (&insn, mo);
4344
4345   insn.insn_opcode = insn.insn_mo->match;
4346   INSERT_OPERAND (RT, insn, regnum);
4347   if (*r == BFD_RELOC_UNUSED)
4348     {
4349       insn.insn_opcode |= high_expr.X_add_number;
4350       append_insn (&insn, NULL, r);
4351     }
4352   else
4353     append_insn (&insn, &high_expr, r);
4354 }
4355
4356 /* Generate a sequence of instructions to do a load or store from a constant
4357    offset off of a base register (breg) into/from a target register (treg),
4358    using AT if necessary.  */
4359 static void
4360 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4361                               int treg, int breg, int dbl)
4362 {
4363   gas_assert (ep->X_op == O_constant);
4364
4365   /* Sign-extending 32-bit constants makes their handling easier.  */
4366   if (!dbl)
4367     normalize_constant_expr (ep);
4368
4369   /* Right now, this routine can only handle signed 32-bit constants.  */
4370   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4371     as_warn (_("operand overflow"));
4372
4373   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4374     {
4375       /* Signed 16-bit offset will fit in the op.  Easy!  */
4376       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4377     }
4378   else
4379     {
4380       /* 32-bit offset, need multiple instructions and AT, like:
4381            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4382            addu     $tempreg,$tempreg,$breg
4383            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4384          to handle the complete offset.  */
4385       macro_build_lui (ep, AT);
4386       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4387       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4388
4389       if (!mips_opts.at)
4390         as_bad (_("Macro used $at after \".set noat\""));
4391     }
4392 }
4393
4394 /*                      set_at()
4395  * Generates code to set the $at register to true (one)
4396  * if reg is less than the immediate expression.
4397  */
4398 static void
4399 set_at (int reg, int unsignedp)
4400 {
4401   if (imm_expr.X_op == O_constant
4402       && imm_expr.X_add_number >= -0x8000
4403       && imm_expr.X_add_number < 0x8000)
4404     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4405                  AT, reg, BFD_RELOC_LO16);
4406   else
4407     {
4408       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4409       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4410     }
4411 }
4412
4413 /* Warn if an expression is not a constant.  */
4414
4415 static void
4416 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4417 {
4418   if (ex->X_op == O_big)
4419     as_bad (_("unsupported large constant"));
4420   else if (ex->X_op != O_constant)
4421     as_bad (_("Instruction %s requires absolute expression"),
4422             ip->insn_mo->name);
4423
4424   if (HAVE_32BIT_GPRS)
4425     normalize_constant_expr (ex);
4426 }
4427
4428 /* Count the leading zeroes by performing a binary chop. This is a
4429    bulky bit of source, but performance is a LOT better for the
4430    majority of values than a simple loop to count the bits:
4431        for (lcnt = 0; (lcnt < 32); lcnt++)
4432          if ((v) & (1 << (31 - lcnt)))
4433            break;
4434   However it is not code size friendly, and the gain will drop a bit
4435   on certain cached systems.
4436 */
4437 #define COUNT_TOP_ZEROES(v)             \
4438   (((v) & ~0xffff) == 0                 \
4439    ? ((v) & ~0xff) == 0                 \
4440      ? ((v) & ~0xf) == 0                \
4441        ? ((v) & ~0x3) == 0              \
4442          ? ((v) & ~0x1) == 0            \
4443            ? !(v)                       \
4444              ? 32                       \
4445              : 31                       \
4446            : 30                         \
4447          : ((v) & ~0x7) == 0            \
4448            ? 29                         \
4449            : 28                         \
4450        : ((v) & ~0x3f) == 0             \
4451          ? ((v) & ~0x1f) == 0           \
4452            ? 27                         \
4453            : 26                         \
4454          : ((v) & ~0x7f) == 0           \
4455            ? 25                         \
4456            : 24                         \
4457      : ((v) & ~0xfff) == 0              \
4458        ? ((v) & ~0x3ff) == 0            \
4459          ? ((v) & ~0x1ff) == 0          \
4460            ? 23                         \
4461            : 22                         \
4462          : ((v) & ~0x7ff) == 0          \
4463            ? 21                         \
4464            : 20                         \
4465        : ((v) & ~0x3fff) == 0           \
4466          ? ((v) & ~0x1fff) == 0         \
4467            ? 19                         \
4468            : 18                         \
4469          : ((v) & ~0x7fff) == 0         \
4470            ? 17                         \
4471            : 16                         \
4472    : ((v) & ~0xffffff) == 0             \
4473      ? ((v) & ~0xfffff) == 0            \
4474        ? ((v) & ~0x3ffff) == 0          \
4475          ? ((v) & ~0x1ffff) == 0        \
4476            ? 15                         \
4477            : 14                         \
4478          : ((v) & ~0x7ffff) == 0        \
4479            ? 13                         \
4480            : 12                         \
4481        : ((v) & ~0x3fffff) == 0         \
4482          ? ((v) & ~0x1fffff) == 0       \
4483            ? 11                         \
4484            : 10                         \
4485          : ((v) & ~0x7fffff) == 0       \
4486            ? 9                          \
4487            : 8                          \
4488      : ((v) & ~0xfffffff) == 0          \
4489        ? ((v) & ~0x3ffffff) == 0        \
4490          ? ((v) & ~0x1ffffff) == 0      \
4491            ? 7                          \
4492            : 6                          \
4493          : ((v) & ~0x7ffffff) == 0      \
4494            ? 5                          \
4495            : 4                          \
4496        : ((v) & ~0x3fffffff) == 0       \
4497          ? ((v) & ~0x1fffffff) == 0     \
4498            ? 3                          \
4499            : 2                          \
4500          : ((v) & ~0x7fffffff) == 0     \
4501            ? 1                          \
4502            : 0)
4503
4504 /*                      load_register()
4505  *  This routine generates the least number of instructions necessary to load
4506  *  an absolute expression value into a register.
4507  */
4508 static void
4509 load_register (int reg, expressionS *ep, int dbl)
4510 {
4511   int freg;
4512   expressionS hi32, lo32;
4513
4514   if (ep->X_op != O_big)
4515     {
4516       gas_assert (ep->X_op == O_constant);
4517
4518       /* Sign-extending 32-bit constants makes their handling easier.  */
4519       if (!dbl)
4520         normalize_constant_expr (ep);
4521
4522       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4523         {
4524           /* We can handle 16 bit signed values with an addiu to
4525              $zero.  No need to ever use daddiu here, since $zero and
4526              the result are always correct in 32 bit mode.  */
4527           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4528           return;
4529         }
4530       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4531         {
4532           /* We can handle 16 bit unsigned values with an ori to
4533              $zero.  */
4534           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4535           return;
4536         }
4537       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4538         {
4539           /* 32 bit values require an lui.  */
4540           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4541           if ((ep->X_add_number & 0xffff) != 0)
4542             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4543           return;
4544         }
4545     }
4546
4547   /* The value is larger than 32 bits.  */
4548
4549   if (!dbl || HAVE_32BIT_GPRS)
4550     {
4551       char value[32];
4552
4553       sprintf_vma (value, ep->X_add_number);
4554       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4555       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4556       return;
4557     }
4558
4559   if (ep->X_op != O_big)
4560     {
4561       hi32 = *ep;
4562       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4563       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4564       hi32.X_add_number &= 0xffffffff;
4565       lo32 = *ep;
4566       lo32.X_add_number &= 0xffffffff;
4567     }
4568   else
4569     {
4570       gas_assert (ep->X_add_number > 2);
4571       if (ep->X_add_number == 3)
4572         generic_bignum[3] = 0;
4573       else if (ep->X_add_number > 4)
4574         as_bad (_("Number larger than 64 bits"));
4575       lo32.X_op = O_constant;
4576       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4577       hi32.X_op = O_constant;
4578       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4579     }
4580
4581   if (hi32.X_add_number == 0)
4582     freg = 0;
4583   else
4584     {
4585       int shift, bit;
4586       unsigned long hi, lo;
4587
4588       if (hi32.X_add_number == (offsetT) 0xffffffff)
4589         {
4590           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4591             {
4592               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4593               return;
4594             }
4595           if (lo32.X_add_number & 0x80000000)
4596             {
4597               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4598               if (lo32.X_add_number & 0xffff)
4599                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4600               return;
4601             }
4602         }
4603
4604       /* Check for 16bit shifted constant.  We know that hi32 is
4605          non-zero, so start the mask on the first bit of the hi32
4606          value.  */
4607       shift = 17;
4608       do
4609         {
4610           unsigned long himask, lomask;
4611
4612           if (shift < 32)
4613             {
4614               himask = 0xffff >> (32 - shift);
4615               lomask = (0xffff << shift) & 0xffffffff;
4616             }
4617           else
4618             {
4619               himask = 0xffff << (shift - 32);
4620               lomask = 0;
4621             }
4622           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4623               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4624             {
4625               expressionS tmp;
4626
4627               tmp.X_op = O_constant;
4628               if (shift < 32)
4629                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4630                                     | (lo32.X_add_number >> shift));
4631               else
4632                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4633               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4634               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4635                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4636               return;
4637             }
4638           ++shift;
4639         }
4640       while (shift <= (64 - 16));
4641
4642       /* Find the bit number of the lowest one bit, and store the
4643          shifted value in hi/lo.  */
4644       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4645       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4646       if (lo != 0)
4647         {
4648           bit = 0;
4649           while ((lo & 1) == 0)
4650             {
4651               lo >>= 1;
4652               ++bit;
4653             }
4654           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4655           hi >>= bit;
4656         }
4657       else
4658         {
4659           bit = 32;
4660           while ((hi & 1) == 0)
4661             {
4662               hi >>= 1;
4663               ++bit;
4664             }
4665           lo = hi;
4666           hi = 0;
4667         }
4668
4669       /* Optimize if the shifted value is a (power of 2) - 1.  */
4670       if ((hi == 0 && ((lo + 1) & lo) == 0)
4671           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4672         {
4673           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4674           if (shift != 0)
4675             {
4676               expressionS tmp;
4677
4678               /* This instruction will set the register to be all
4679                  ones.  */
4680               tmp.X_op = O_constant;
4681               tmp.X_add_number = (offsetT) -1;
4682               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4683               if (bit != 0)
4684                 {
4685                   bit += shift;
4686                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4687                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4688                 }
4689               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4690                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4691               return;
4692             }
4693         }
4694
4695       /* Sign extend hi32 before calling load_register, because we can
4696          generally get better code when we load a sign extended value.  */
4697       if ((hi32.X_add_number & 0x80000000) != 0)
4698         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4699       load_register (reg, &hi32, 0);
4700       freg = reg;
4701     }
4702   if ((lo32.X_add_number & 0xffff0000) == 0)
4703     {
4704       if (freg != 0)
4705         {
4706           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4707           freg = reg;
4708         }
4709     }
4710   else
4711     {
4712       expressionS mid16;
4713
4714       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4715         {
4716           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4717           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4718           return;
4719         }
4720
4721       if (freg != 0)
4722         {
4723           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4724           freg = reg;
4725         }
4726       mid16 = lo32;
4727       mid16.X_add_number >>= 16;
4728       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4729       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4730       freg = reg;
4731     }
4732   if ((lo32.X_add_number & 0xffff) != 0)
4733     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4734 }
4735
4736 static inline void
4737 load_delay_nop (void)
4738 {
4739   if (!gpr_interlocks)
4740     macro_build (NULL, "nop", "");
4741 }
4742
4743 /* Load an address into a register.  */
4744
4745 static void
4746 load_address (int reg, expressionS *ep, int *used_at)
4747 {
4748   if (ep->X_op != O_constant
4749       && ep->X_op != O_symbol)
4750     {
4751       as_bad (_("expression too complex"));
4752       ep->X_op = O_constant;
4753     }
4754
4755   if (ep->X_op == O_constant)
4756     {
4757       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4758       return;
4759     }
4760
4761   if (mips_pic == NO_PIC)
4762     {
4763       /* If this is a reference to a GP relative symbol, we want
4764            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4765          Otherwise we want
4766            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4767            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4768          If we have an addend, we always use the latter form.
4769
4770          With 64bit address space and a usable $at we want
4771            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4772            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4773            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4774            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4775            dsll32       $reg,0
4776            daddu        $reg,$reg,$at
4777
4778          If $at is already in use, we use a path which is suboptimal
4779          on superscalar processors.
4780            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4781            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4782            dsll         $reg,16
4783            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4784            dsll         $reg,16
4785            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4786
4787          For GP relative symbols in 64bit address space we can use
4788          the same sequence as in 32bit address space.  */
4789       if (HAVE_64BIT_SYMBOLS)
4790         {
4791           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4792               && !nopic_need_relax (ep->X_add_symbol, 1))
4793             {
4794               relax_start (ep->X_add_symbol);
4795               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4796                            mips_gp_register, BFD_RELOC_GPREL16);
4797               relax_switch ();
4798             }
4799
4800           if (*used_at == 0 && mips_opts.at)
4801             {
4802               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4803               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4804               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4805                            BFD_RELOC_MIPS_HIGHER);
4806               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4807               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4808               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4809               *used_at = 1;
4810             }
4811           else
4812             {
4813               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4814               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4815                            BFD_RELOC_MIPS_HIGHER);
4816               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4817               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4818               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4819               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4820             }
4821
4822           if (mips_relax.sequence)
4823             relax_end ();
4824         }
4825       else
4826         {
4827           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4828               && !nopic_need_relax (ep->X_add_symbol, 1))
4829             {
4830               relax_start (ep->X_add_symbol);
4831               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4832                            mips_gp_register, BFD_RELOC_GPREL16);
4833               relax_switch ();
4834             }
4835           macro_build_lui (ep, reg);
4836           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4837                        reg, reg, BFD_RELOC_LO16);
4838           if (mips_relax.sequence)
4839             relax_end ();
4840         }
4841     }
4842   else if (!mips_big_got)
4843     {
4844       expressionS ex;
4845
4846       /* If this is a reference to an external symbol, we want
4847            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4848          Otherwise we want
4849            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4850            nop
4851            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4852          If there is a constant, it must be added in after.
4853
4854          If we have NewABI, we want
4855            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4856          unless we're referencing a global symbol with a non-zero
4857          offset, in which case cst must be added separately.  */
4858       if (HAVE_NEWABI)
4859         {
4860           if (ep->X_add_number)
4861             {
4862               ex.X_add_number = ep->X_add_number;
4863               ep->X_add_number = 0;
4864               relax_start (ep->X_add_symbol);
4865               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4866                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4867               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4868                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4869               ex.X_op = O_constant;
4870               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4871                            reg, reg, BFD_RELOC_LO16);
4872               ep->X_add_number = ex.X_add_number;
4873               relax_switch ();
4874             }
4875           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4876                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4877           if (mips_relax.sequence)
4878             relax_end ();
4879         }
4880       else
4881         {
4882           ex.X_add_number = ep->X_add_number;
4883           ep->X_add_number = 0;
4884           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4885                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4886           load_delay_nop ();
4887           relax_start (ep->X_add_symbol);
4888           relax_switch ();
4889           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4890                        BFD_RELOC_LO16);
4891           relax_end ();
4892
4893           if (ex.X_add_number != 0)
4894             {
4895               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4896                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4897               ex.X_op = O_constant;
4898               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4899                            reg, reg, BFD_RELOC_LO16);
4900             }
4901         }
4902     }
4903   else if (mips_big_got)
4904     {
4905       expressionS ex;
4906
4907       /* This is the large GOT case.  If this is a reference to an
4908          external symbol, we want
4909            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4910            addu         $reg,$reg,$gp
4911            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4912
4913          Otherwise, for a reference to a local symbol in old ABI, we want
4914            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4915            nop
4916            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4917          If there is a constant, it must be added in after.
4918
4919          In the NewABI, for local symbols, with or without offsets, we want:
4920            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4921            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4922       */
4923       if (HAVE_NEWABI)
4924         {
4925           ex.X_add_number = ep->X_add_number;
4926           ep->X_add_number = 0;
4927           relax_start (ep->X_add_symbol);
4928           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4929           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4930                        reg, reg, mips_gp_register);
4931           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4932                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4933           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4934             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4935           else if (ex.X_add_number)
4936             {
4937               ex.X_op = O_constant;
4938               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4939                            BFD_RELOC_LO16);
4940             }
4941
4942           ep->X_add_number = ex.X_add_number;
4943           relax_switch ();
4944           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4945                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4946           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4947                        BFD_RELOC_MIPS_GOT_OFST);
4948           relax_end ();
4949         }
4950       else
4951         {
4952           ex.X_add_number = ep->X_add_number;
4953           ep->X_add_number = 0;
4954           relax_start (ep->X_add_symbol);
4955           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4956           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4957                        reg, reg, mips_gp_register);
4958           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4959                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4960           relax_switch ();
4961           if (reg_needs_delay (mips_gp_register))
4962             {
4963               /* We need a nop before loading from $gp.  This special
4964                  check is required because the lui which starts the main
4965                  instruction stream does not refer to $gp, and so will not
4966                  insert the nop which may be required.  */
4967               macro_build (NULL, "nop", "");
4968             }
4969           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4970                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4971           load_delay_nop ();
4972           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4973                        BFD_RELOC_LO16);
4974           relax_end ();
4975
4976           if (ex.X_add_number != 0)
4977             {
4978               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4979                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4980               ex.X_op = O_constant;
4981               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4982                            BFD_RELOC_LO16);
4983             }
4984         }
4985     }
4986   else
4987     abort ();
4988
4989   if (!mips_opts.at && *used_at == 1)
4990     as_bad (_("Macro used $at after \".set noat\""));
4991 }
4992
4993 /* Move the contents of register SOURCE into register DEST.  */
4994
4995 static void
4996 move_register (int dest, int source)
4997 {
4998   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4999                dest, source, 0);
5000 }
5001
5002 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
5003    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
5004    The two alternatives are:
5005
5006    Global symbol                Local sybmol
5007    -------------                ------------
5008    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
5009    ...                          ...
5010    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
5011
5012    load_got_offset emits the first instruction and add_got_offset
5013    emits the second for a 16-bit offset or add_got_offset_hilo emits
5014    a sequence to add a 32-bit offset using a scratch register.  */
5015
5016 static void
5017 load_got_offset (int dest, expressionS *local)
5018 {
5019   expressionS global;
5020
5021   global = *local;
5022   global.X_add_number = 0;
5023
5024   relax_start (local->X_add_symbol);
5025   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5026                BFD_RELOC_MIPS_GOT16, mips_gp_register);
5027   relax_switch ();
5028   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
5029                BFD_RELOC_MIPS_GOT16, mips_gp_register);
5030   relax_end ();
5031 }
5032
5033 static void
5034 add_got_offset (int dest, expressionS *local)
5035 {
5036   expressionS global;
5037
5038   global.X_op = O_constant;
5039   global.X_op_symbol = NULL;
5040   global.X_add_symbol = NULL;
5041   global.X_add_number = local->X_add_number;
5042
5043   relax_start (local->X_add_symbol);
5044   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
5045                dest, dest, BFD_RELOC_LO16);
5046   relax_switch ();
5047   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
5048   relax_end ();
5049 }
5050
5051 static void
5052 add_got_offset_hilo (int dest, expressionS *local, int tmp)
5053 {
5054   expressionS global;
5055   int hold_mips_optimize;
5056
5057   global.X_op = O_constant;
5058   global.X_op_symbol = NULL;
5059   global.X_add_symbol = NULL;
5060   global.X_add_number = local->X_add_number;
5061
5062   relax_start (local->X_add_symbol);
5063   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
5064   relax_switch ();
5065   /* Set mips_optimize around the lui instruction to avoid
5066      inserting an unnecessary nop after the lw.  */
5067   hold_mips_optimize = mips_optimize;
5068   mips_optimize = 2;
5069   macro_build_lui (&global, tmp);
5070   mips_optimize = hold_mips_optimize;
5071   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
5072   relax_end ();
5073
5074   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
5075 }
5076
5077 /*
5078  *                      Build macros
5079  *   This routine implements the seemingly endless macro or synthesized
5080  * instructions and addressing modes in the mips assembly language. Many
5081  * of these macros are simple and are similar to each other. These could
5082  * probably be handled by some kind of table or grammar approach instead of
5083  * this verbose method. Others are not simple macros but are more like
5084  * optimizing code generation.
5085  *   One interesting optimization is when several store macros appear
5086  * consecutively that would load AT with the upper half of the same address.
5087  * The ensuing load upper instructions are ommited. This implies some kind
5088  * of global optimization. We currently only optimize within a single macro.
5089  *   For many of the load and store macros if the address is specified as a
5090  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
5091  * first load register 'at' with zero and use it as the base register. The
5092  * mips assembler simply uses register $zero. Just one tiny optimization
5093  * we're missing.
5094  */
5095 static void
5096 macro (struct mips_cl_insn *ip)
5097 {
5098   unsigned int treg, sreg, dreg, breg;
5099   unsigned int tempreg;
5100   int mask;
5101   int used_at = 0;
5102   expressionS expr1;
5103   const char *s;
5104   const char *s2;
5105   const char *fmt;
5106   int likely = 0;
5107   int dbl = 0;
5108   int coproc = 0;
5109   int lr = 0;
5110   int imm = 0;
5111   int call = 0;
5112   int off;
5113   offsetT maxnum;
5114   bfd_reloc_code_real_type r;
5115   int hold_mips_optimize;
5116
5117   gas_assert (! mips_opts.mips16);
5118
5119   treg = EXTRACT_OPERAND (RT, *ip);
5120   dreg = EXTRACT_OPERAND (RD, *ip);
5121   sreg = breg = EXTRACT_OPERAND (RS, *ip);
5122   mask = ip->insn_mo->mask;
5123
5124   expr1.X_op = O_constant;
5125   expr1.X_op_symbol = NULL;
5126   expr1.X_add_symbol = NULL;
5127   expr1.X_add_number = 1;
5128
5129   switch (mask)
5130     {
5131     case M_DABS:
5132       dbl = 1;
5133     case M_ABS:
5134       /* bgez $a0,.+12
5135          move v0,$a0
5136          sub v0,$zero,$a0
5137          */
5138
5139       start_noreorder ();
5140
5141       expr1.X_add_number = 8;
5142       macro_build (&expr1, "bgez", "s,p", sreg);
5143       if (dreg == sreg)
5144         macro_build (NULL, "nop", "");
5145       else
5146         move_register (dreg, sreg);
5147       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
5148
5149       end_noreorder ();
5150       break;
5151
5152     case M_ADD_I:
5153       s = "addi";
5154       s2 = "add";
5155       goto do_addi;
5156     case M_ADDU_I:
5157       s = "addiu";
5158       s2 = "addu";
5159       goto do_addi;
5160     case M_DADD_I:
5161       dbl = 1;
5162       s = "daddi";
5163       s2 = "dadd";
5164       goto do_addi;
5165     case M_DADDU_I:
5166       dbl = 1;
5167       s = "daddiu";
5168       s2 = "daddu";
5169     do_addi:
5170       if (imm_expr.X_op == O_constant
5171           && imm_expr.X_add_number >= -0x8000
5172           && imm_expr.X_add_number < 0x8000)
5173         {
5174           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
5175           break;
5176         }
5177       used_at = 1;
5178       load_register (AT, &imm_expr, dbl);
5179       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5180       break;
5181
5182     case M_AND_I:
5183       s = "andi";
5184       s2 = "and";
5185       goto do_bit;
5186     case M_OR_I:
5187       s = "ori";
5188       s2 = "or";
5189       goto do_bit;
5190     case M_NOR_I:
5191       s = "";
5192       s2 = "nor";
5193       goto do_bit;
5194     case M_XOR_I:
5195       s = "xori";
5196       s2 = "xor";
5197     do_bit:
5198       if (imm_expr.X_op == O_constant
5199           && imm_expr.X_add_number >= 0
5200           && imm_expr.X_add_number < 0x10000)
5201         {
5202           if (mask != M_NOR_I)
5203             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
5204           else
5205             {
5206               macro_build (&imm_expr, "ori", "t,r,i",
5207                            treg, sreg, BFD_RELOC_LO16);
5208               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
5209             }
5210           break;
5211         }
5212
5213       used_at = 1;
5214       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5215       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
5216       break;
5217
5218     case M_BALIGN:
5219       switch (imm_expr.X_add_number)
5220         {
5221         case 0:
5222           macro_build (NULL, "nop", "");
5223           break;
5224         case 2:
5225           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
5226           break;
5227         default:
5228           macro_build (NULL, "balign", "t,s,2", treg, sreg,
5229                        (int) imm_expr.X_add_number);
5230           break;
5231         }
5232       break;
5233
5234     case M_BEQ_I:
5235       s = "beq";
5236       goto beq_i;
5237     case M_BEQL_I:
5238       s = "beql";
5239       likely = 1;
5240       goto beq_i;
5241     case M_BNE_I:
5242       s = "bne";
5243       goto beq_i;
5244     case M_BNEL_I:
5245       s = "bnel";
5246       likely = 1;
5247     beq_i:
5248       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5249         {
5250           macro_build (&offset_expr, s, "s,t,p", sreg, ZERO);
5251           break;
5252         }
5253       used_at = 1;
5254       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
5255       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
5256       break;
5257
5258     case M_BGEL:
5259       likely = 1;
5260     case M_BGE:
5261       if (treg == 0)
5262         {
5263           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5264           break;
5265         }
5266       if (sreg == 0)
5267         {
5268           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
5269           break;
5270         }
5271       used_at = 1;
5272       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5273       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5274       break;
5275
5276     case M_BGTL_I:
5277       likely = 1;
5278     case M_BGT_I:
5279       /* Check for > max integer.  */
5280       maxnum = 0x7fffffff;
5281       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5282         {
5283           maxnum <<= 16;
5284           maxnum |= 0xffff;
5285           maxnum <<= 16;
5286           maxnum |= 0xffff;
5287         }
5288       if (imm_expr.X_op == O_constant
5289           && imm_expr.X_add_number >= maxnum
5290           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5291         {
5292         do_false:
5293           /* Result is always false.  */
5294           if (! likely)
5295             macro_build (NULL, "nop", "");
5296           else
5297             macro_build (&offset_expr, "bnel", "s,t,p", ZERO, ZERO);
5298           break;
5299         }
5300       if (imm_expr.X_op != O_constant)
5301         as_bad (_("Unsupported large constant"));
5302       ++imm_expr.X_add_number;
5303       /* FALLTHROUGH */
5304     case M_BGE_I:
5305     case M_BGEL_I:
5306       if (mask == M_BGEL_I)
5307         likely = 1;
5308       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5309         {
5310           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5311           break;
5312         }
5313       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5314         {
5315           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5316           break;
5317         }
5318       maxnum = 0x7fffffff;
5319       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5320         {
5321           maxnum <<= 16;
5322           maxnum |= 0xffff;
5323           maxnum <<= 16;
5324           maxnum |= 0xffff;
5325         }
5326       maxnum = - maxnum - 1;
5327       if (imm_expr.X_op == O_constant
5328           && imm_expr.X_add_number <= maxnum
5329           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5330         {
5331         do_true:
5332           /* result is always true */
5333           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5334           macro_build (&offset_expr, "b", "p");
5335           break;
5336         }
5337       used_at = 1;
5338       set_at (sreg, 0);
5339       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5340       break;
5341
5342     case M_BGEUL:
5343       likely = 1;
5344     case M_BGEU:
5345       if (treg == 0)
5346         goto do_true;
5347       if (sreg == 0)
5348         {
5349           macro_build (&offset_expr, likely ? "beql" : "beq",
5350                        "s,t,p", ZERO, treg);
5351           break;
5352         }
5353       used_at = 1;
5354       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5355       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5356       break;
5357
5358     case M_BGTUL_I:
5359       likely = 1;
5360     case M_BGTU_I:
5361       if (sreg == 0
5362           || (HAVE_32BIT_GPRS
5363               && imm_expr.X_op == O_constant
5364               && imm_expr.X_add_number == -1))
5365         goto do_false;
5366       if (imm_expr.X_op != O_constant)
5367         as_bad (_("Unsupported large constant"));
5368       ++imm_expr.X_add_number;
5369       /* FALLTHROUGH */
5370     case M_BGEU_I:
5371     case M_BGEUL_I:
5372       if (mask == M_BGEUL_I)
5373         likely = 1;
5374       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5375         goto do_true;
5376       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5377         {
5378           macro_build (&offset_expr, likely ? "bnel" : "bne",
5379                        "s,t,p", sreg, ZERO);
5380           break;
5381         }
5382       used_at = 1;
5383       set_at (sreg, 1);
5384       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5385       break;
5386
5387     case M_BGTL:
5388       likely = 1;
5389     case M_BGT:
5390       if (treg == 0)
5391         {
5392           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5393           break;
5394         }
5395       if (sreg == 0)
5396         {
5397           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5398           break;
5399         }
5400       used_at = 1;
5401       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5402       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5403       break;
5404
5405     case M_BGTUL:
5406       likely = 1;
5407     case M_BGTU:
5408       if (treg == 0)
5409         {
5410           macro_build (&offset_expr, likely ? "bnel" : "bne",
5411                        "s,t,p", sreg, ZERO);
5412           break;
5413         }
5414       if (sreg == 0)
5415         goto do_false;
5416       used_at = 1;
5417       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5418       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5419       break;
5420
5421     case M_BLEL:
5422       likely = 1;
5423     case M_BLE:
5424       if (treg == 0)
5425         {
5426           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5427           break;
5428         }
5429       if (sreg == 0)
5430         {
5431           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5432           break;
5433         }
5434       used_at = 1;
5435       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5436       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5437       break;
5438
5439     case M_BLEL_I:
5440       likely = 1;
5441     case M_BLE_I:
5442       maxnum = 0x7fffffff;
5443       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5444         {
5445           maxnum <<= 16;
5446           maxnum |= 0xffff;
5447           maxnum <<= 16;
5448           maxnum |= 0xffff;
5449         }
5450       if (imm_expr.X_op == O_constant
5451           && imm_expr.X_add_number >= maxnum
5452           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5453         goto do_true;
5454       if (imm_expr.X_op != O_constant)
5455         as_bad (_("Unsupported large constant"));
5456       ++imm_expr.X_add_number;
5457       /* FALLTHROUGH */
5458     case M_BLT_I:
5459     case M_BLTL_I:
5460       if (mask == M_BLTL_I)
5461         likely = 1;
5462       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5463         {
5464           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5465           break;
5466         }
5467       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5468         {
5469           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5470           break;
5471         }
5472       used_at = 1;
5473       set_at (sreg, 0);
5474       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5475       break;
5476
5477     case M_BLEUL:
5478       likely = 1;
5479     case M_BLEU:
5480       if (treg == 0)
5481         {
5482           macro_build (&offset_expr, likely ? "beql" : "beq",
5483                        "s,t,p", sreg, ZERO);
5484           break;
5485         }
5486       if (sreg == 0)
5487         goto do_true;
5488       used_at = 1;
5489       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5490       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, ZERO);
5491       break;
5492
5493     case M_BLEUL_I:
5494       likely = 1;
5495     case M_BLEU_I:
5496       if (sreg == 0
5497           || (HAVE_32BIT_GPRS
5498               && imm_expr.X_op == O_constant
5499               && imm_expr.X_add_number == -1))
5500         goto do_true;
5501       if (imm_expr.X_op != O_constant)
5502         as_bad (_("Unsupported large constant"));
5503       ++imm_expr.X_add_number;
5504       /* FALLTHROUGH */
5505     case M_BLTU_I:
5506     case M_BLTUL_I:
5507       if (mask == M_BLTUL_I)
5508         likely = 1;
5509       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5510         goto do_false;
5511       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5512         {
5513           macro_build (&offset_expr, likely ? "beql" : "beq",
5514                        "s,t,p", sreg, ZERO);
5515           break;
5516         }
5517       used_at = 1;
5518       set_at (sreg, 1);
5519       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5520       break;
5521
5522     case M_BLTL:
5523       likely = 1;
5524     case M_BLT:
5525       if (treg == 0)
5526         {
5527           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5528           break;
5529         }
5530       if (sreg == 0)
5531         {
5532           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5533           break;
5534         }
5535       used_at = 1;
5536       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5537       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5538       break;
5539
5540     case M_BLTUL:
5541       likely = 1;
5542     case M_BLTU:
5543       if (treg == 0)
5544         goto do_false;
5545       if (sreg == 0)
5546         {
5547           macro_build (&offset_expr, likely ? "bnel" : "bne",
5548                        "s,t,p", ZERO, treg);
5549           break;
5550         }
5551       used_at = 1;
5552       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5553       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, ZERO);
5554       break;
5555
5556     case M_DEXT:
5557       {
5558         /* Use unsigned arithmetic.  */
5559         addressT pos;
5560         addressT size;
5561
5562         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5563           {
5564             as_bad (_("Unsupported large constant"));
5565             pos = size = 1;
5566           }
5567         else
5568           {
5569             pos = imm_expr.X_add_number;
5570             size = imm2_expr.X_add_number;
5571           }
5572
5573         if (pos > 63)
5574           {
5575             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5576             pos = 1;
5577           }
5578         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5579           {
5580             as_bad (_("Improper extract size (%lu, position %lu)"),
5581                     (unsigned long) size, (unsigned long) pos);
5582             size = 1;
5583           }
5584
5585         if (size <= 32 && pos < 32)
5586           {
5587             s = "dext";
5588             fmt = "t,r,+A,+C";
5589           }
5590         else if (size <= 32)
5591           {
5592             s = "dextu";
5593             fmt = "t,r,+E,+H";
5594           }
5595         else
5596           {
5597             s = "dextm";
5598             fmt = "t,r,+A,+G";
5599           }
5600         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5601                      (int) (size - 1));
5602       }
5603       break;
5604
5605     case M_DINS:
5606       {
5607         /* Use unsigned arithmetic.  */
5608         addressT pos;
5609         addressT size;
5610
5611         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5612           {
5613             as_bad (_("Unsupported large constant"));
5614             pos = size = 1;
5615           }
5616         else
5617           {
5618             pos = imm_expr.X_add_number;
5619             size = imm2_expr.X_add_number;
5620           }
5621
5622         if (pos > 63)
5623           {
5624             as_bad (_("Improper position (%lu)"), (unsigned long) pos);
5625             pos = 1;
5626           }
5627         if (size == 0 || size > 64 || (pos + size - 1) > 63)
5628           {
5629             as_bad (_("Improper insert size (%lu, position %lu)"),
5630                     (unsigned long) size, (unsigned long) pos);
5631             size = 1;
5632           }
5633
5634         if (pos < 32 && (pos + size - 1) < 32)
5635           {
5636             s = "dins";
5637             fmt = "t,r,+A,+B";
5638           }
5639         else if (pos >= 32)
5640           {
5641             s = "dinsu";
5642             fmt = "t,r,+E,+F";
5643           }
5644         else
5645           {
5646             s = "dinsm";
5647             fmt = "t,r,+A,+F";
5648           }
5649         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5650                      (int) (pos + size - 1));
5651       }
5652       break;
5653
5654     case M_DDIV_3:
5655       dbl = 1;
5656     case M_DIV_3:
5657       s = "mflo";
5658       goto do_div3;
5659     case M_DREM_3:
5660       dbl = 1;
5661     case M_REM_3:
5662       s = "mfhi";
5663     do_div3:
5664       if (treg == 0)
5665         {
5666           as_warn (_("Divide by zero."));
5667           if (mips_trap)
5668             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5669           else
5670             macro_build (NULL, "break", "c", 7);
5671           break;
5672         }
5673
5674       start_noreorder ();
5675       if (mips_trap)
5676         {
5677           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5678           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5679         }
5680       else
5681         {
5682           expr1.X_add_number = 8;
5683           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5684           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5685           macro_build (NULL, "break", "c", 7);
5686         }
5687       expr1.X_add_number = -1;
5688       used_at = 1;
5689       load_register (AT, &expr1, dbl);
5690       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5691       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5692       if (dbl)
5693         {
5694           expr1.X_add_number = 1;
5695           load_register (AT, &expr1, dbl);
5696           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5697         }
5698       else
5699         {
5700           expr1.X_add_number = 0x80000000;
5701           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5702         }
5703       if (mips_trap)
5704         {
5705           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5706           /* We want to close the noreorder block as soon as possible, so
5707              that later insns are available for delay slot filling.  */
5708           end_noreorder ();
5709         }
5710       else
5711         {
5712           expr1.X_add_number = 8;
5713           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5714           macro_build (NULL, "nop", "");
5715
5716           /* We want to close the noreorder block as soon as possible, so
5717              that later insns are available for delay slot filling.  */
5718           end_noreorder ();
5719
5720           macro_build (NULL, "break", "c", 6);
5721         }
5722       macro_build (NULL, s, "d", dreg);
5723       break;
5724
5725     case M_DIV_3I:
5726       s = "div";
5727       s2 = "mflo";
5728       goto do_divi;
5729     case M_DIVU_3I:
5730       s = "divu";
5731       s2 = "mflo";
5732       goto do_divi;
5733     case M_REM_3I:
5734       s = "div";
5735       s2 = "mfhi";
5736       goto do_divi;
5737     case M_REMU_3I:
5738       s = "divu";
5739       s2 = "mfhi";
5740       goto do_divi;
5741     case M_DDIV_3I:
5742       dbl = 1;
5743       s = "ddiv";
5744       s2 = "mflo";
5745       goto do_divi;
5746     case M_DDIVU_3I:
5747       dbl = 1;
5748       s = "ddivu";
5749       s2 = "mflo";
5750       goto do_divi;
5751     case M_DREM_3I:
5752       dbl = 1;
5753       s = "ddiv";
5754       s2 = "mfhi";
5755       goto do_divi;
5756     case M_DREMU_3I:
5757       dbl = 1;
5758       s = "ddivu";
5759       s2 = "mfhi";
5760     do_divi:
5761       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5762         {
5763           as_warn (_("Divide by zero."));
5764           if (mips_trap)
5765             macro_build (NULL, "teq", "s,t,q", ZERO, ZERO, 7);
5766           else
5767             macro_build (NULL, "break", "c", 7);
5768           break;
5769         }
5770       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5771         {
5772           if (strcmp (s2, "mflo") == 0)
5773             move_register (dreg, sreg);
5774           else
5775             move_register (dreg, ZERO);
5776           break;
5777         }
5778       if (imm_expr.X_op == O_constant
5779           && imm_expr.X_add_number == -1
5780           && s[strlen (s) - 1] != 'u')
5781         {
5782           if (strcmp (s2, "mflo") == 0)
5783             {
5784               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5785             }
5786           else
5787             move_register (dreg, ZERO);
5788           break;
5789         }
5790
5791       used_at = 1;
5792       load_register (AT, &imm_expr, dbl);
5793       macro_build (NULL, s, "z,s,t", sreg, AT);
5794       macro_build (NULL, s2, "d", dreg);
5795       break;
5796
5797     case M_DIVU_3:
5798       s = "divu";
5799       s2 = "mflo";
5800       goto do_divu3;
5801     case M_REMU_3:
5802       s = "divu";
5803       s2 = "mfhi";
5804       goto do_divu3;
5805     case M_DDIVU_3:
5806       s = "ddivu";
5807       s2 = "mflo";
5808       goto do_divu3;
5809     case M_DREMU_3:
5810       s = "ddivu";
5811       s2 = "mfhi";
5812     do_divu3:
5813       start_noreorder ();
5814       if (mips_trap)
5815         {
5816           macro_build (NULL, "teq", "s,t,q", treg, ZERO, 7);
5817           macro_build (NULL, s, "z,s,t", sreg, treg);
5818           /* We want to close the noreorder block as soon as possible, so
5819              that later insns are available for delay slot filling.  */
5820           end_noreorder ();
5821         }
5822       else
5823         {
5824           expr1.X_add_number = 8;
5825           macro_build (&expr1, "bne", "s,t,p", treg, ZERO);
5826           macro_build (NULL, s, "z,s,t", sreg, treg);
5827
5828           /* We want to close the noreorder block as soon as possible, so
5829              that later insns are available for delay slot filling.  */
5830           end_noreorder ();
5831           macro_build (NULL, "break", "c", 7);
5832         }
5833       macro_build (NULL, s2, "d", dreg);
5834       break;
5835
5836     case M_DLCA_AB:
5837       dbl = 1;
5838     case M_LCA_AB:
5839       call = 1;
5840       goto do_la;
5841     case M_DLA_AB:
5842       dbl = 1;
5843     case M_LA_AB:
5844     do_la:
5845       /* Load the address of a symbol into a register.  If breg is not
5846          zero, we then add a base register to it.  */
5847
5848       if (dbl && HAVE_32BIT_GPRS)
5849         as_warn (_("dla used to load 32-bit register"));
5850
5851       if (!dbl && HAVE_64BIT_OBJECTS)
5852         as_warn (_("la used to load 64-bit address"));
5853
5854       if (offset_expr.X_op == O_constant
5855           && offset_expr.X_add_number >= -0x8000
5856           && offset_expr.X_add_number < 0x8000)
5857         {
5858           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5859                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5860           break;
5861         }
5862
5863       if (mips_opts.at && (treg == breg))
5864         {
5865           tempreg = AT;
5866           used_at = 1;
5867         }
5868       else
5869         {
5870           tempreg = treg;
5871         }
5872
5873       if (offset_expr.X_op != O_symbol
5874           && offset_expr.X_op != O_constant)
5875         {
5876           as_bad (_("Expression too complex"));
5877           offset_expr.X_op = O_constant;
5878         }
5879
5880       if (offset_expr.X_op == O_constant)
5881         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5882       else if (mips_pic == NO_PIC)
5883         {
5884           /* If this is a reference to a GP relative symbol, we want
5885                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5886              Otherwise we want
5887                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5888                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5889              If we have a constant, we need two instructions anyhow,
5890              so we may as well always use the latter form.
5891
5892              With 64bit address space and a usable $at we want
5893                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5894                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5895                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5896                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5897                dsll32   $tempreg,0
5898                daddu    $tempreg,$tempreg,$at
5899
5900              If $at is already in use, we use a path which is suboptimal
5901              on superscalar processors.
5902                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5903                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5904                dsll     $tempreg,16
5905                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5906                dsll     $tempreg,16
5907                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5908
5909              For GP relative symbols in 64bit address space we can use
5910              the same sequence as in 32bit address space.  */
5911           if (HAVE_64BIT_SYMBOLS)
5912             {
5913               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5914                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5915                 {
5916                   relax_start (offset_expr.X_add_symbol);
5917                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5918                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5919                   relax_switch ();
5920                 }
5921
5922               if (used_at == 0 && mips_opts.at)
5923                 {
5924                   macro_build (&offset_expr, "lui", "t,u",
5925                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5926                   macro_build (&offset_expr, "lui", "t,u",
5927                                AT, BFD_RELOC_HI16_S);
5928                   macro_build (&offset_expr, "daddiu", "t,r,j",
5929                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5930                   macro_build (&offset_expr, "daddiu", "t,r,j",
5931                                AT, AT, BFD_RELOC_LO16);
5932                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5933                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5934                   used_at = 1;
5935                 }
5936               else
5937                 {
5938                   macro_build (&offset_expr, "lui", "t,u",
5939                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5940                   macro_build (&offset_expr, "daddiu", "t,r,j",
5941                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5942                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5943                   macro_build (&offset_expr, "daddiu", "t,r,j",
5944                                tempreg, tempreg, BFD_RELOC_HI16_S);
5945                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5946                   macro_build (&offset_expr, "daddiu", "t,r,j",
5947                                tempreg, tempreg, BFD_RELOC_LO16);
5948                 }
5949
5950               if (mips_relax.sequence)
5951                 relax_end ();
5952             }
5953           else
5954             {
5955               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5956                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5957                 {
5958                   relax_start (offset_expr.X_add_symbol);
5959                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5960                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5961                   relax_switch ();
5962                 }
5963               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5964                 as_bad (_("Offset too large"));
5965               macro_build_lui (&offset_expr, tempreg);
5966               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5967                            tempreg, tempreg, BFD_RELOC_LO16);
5968               if (mips_relax.sequence)
5969                 relax_end ();
5970             }
5971         }
5972       else if (!mips_big_got && !HAVE_NEWABI)
5973         {
5974           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5975
5976           /* If this is a reference to an external symbol, and there
5977              is no constant, we want
5978                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5979              or for lca or if tempreg is PIC_CALL_REG
5980                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5981              For a local symbol, we want
5982                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5983                nop
5984                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5985
5986              If we have a small constant, and this is a reference to
5987              an external symbol, we want
5988                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5989                nop
5990                addiu    $tempreg,$tempreg,<constant>
5991              For a local symbol, we want the same instruction
5992              sequence, but we output a BFD_RELOC_LO16 reloc on the
5993              addiu instruction.
5994
5995              If we have a large constant, and this is a reference to
5996              an external symbol, we want
5997                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5998                lui      $at,<hiconstant>
5999                addiu    $at,$at,<loconstant>
6000                addu     $tempreg,$tempreg,$at
6001              For a local symbol, we want the same instruction
6002              sequence, but we output a BFD_RELOC_LO16 reloc on the
6003              addiu instruction.
6004            */
6005
6006           if (offset_expr.X_add_number == 0)
6007             {
6008               if (mips_pic == SVR4_PIC
6009                   && breg == 0
6010                   && (call || tempreg == PIC_CALL_REG))
6011                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
6012
6013               relax_start (offset_expr.X_add_symbol);
6014               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6015                            lw_reloc_type, mips_gp_register);
6016               if (breg != 0)
6017                 {
6018                   /* We're going to put in an addu instruction using
6019                      tempreg, so we may as well insert the nop right
6020                      now.  */
6021                   load_delay_nop ();
6022                 }
6023               relax_switch ();
6024               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6025                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
6026               load_delay_nop ();
6027               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6028                            tempreg, tempreg, BFD_RELOC_LO16);
6029               relax_end ();
6030               /* FIXME: If breg == 0, and the next instruction uses
6031                  $tempreg, then if this variant case is used an extra
6032                  nop will be generated.  */
6033             }
6034           else if (offset_expr.X_add_number >= -0x8000
6035                    && offset_expr.X_add_number < 0x8000)
6036             {
6037               load_got_offset (tempreg, &offset_expr);
6038               load_delay_nop ();
6039               add_got_offset (tempreg, &offset_expr);
6040             }
6041           else
6042             {
6043               expr1.X_add_number = offset_expr.X_add_number;
6044               offset_expr.X_add_number =
6045                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
6046               load_got_offset (tempreg, &offset_expr);
6047               offset_expr.X_add_number = expr1.X_add_number;
6048               /* If we are going to add in a base register, and the
6049                  target register and the base register are the same,
6050                  then we are using AT as a temporary register.  Since
6051                  we want to load the constant into AT, we add our
6052                  current AT (from the global offset table) and the
6053                  register into the register now, and pretend we were
6054                  not using a base register.  */
6055               if (breg == treg)
6056                 {
6057                   load_delay_nop ();
6058                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6059                                treg, AT, breg);
6060                   breg = 0;
6061                   tempreg = treg;
6062                 }
6063               add_got_offset_hilo (tempreg, &offset_expr, AT);
6064               used_at = 1;
6065             }
6066         }
6067       else if (!mips_big_got && HAVE_NEWABI)
6068         {
6069           int add_breg_early = 0;
6070
6071           /* If this is a reference to an external, and there is no
6072              constant, or local symbol (*), with or without a
6073              constant, we want
6074                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6075              or for lca or if tempreg is PIC_CALL_REG
6076                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
6077
6078              If we have a small constant, and this is a reference to
6079              an external symbol, we want
6080                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6081                addiu    $tempreg,$tempreg,<constant>
6082
6083              If we have a large constant, and this is a reference to
6084              an external symbol, we want
6085                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
6086                lui      $at,<hiconstant>
6087                addiu    $at,$at,<loconstant>
6088                addu     $tempreg,$tempreg,$at
6089
6090              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
6091              local symbols, even though it introduces an additional
6092              instruction.  */
6093
6094           if (offset_expr.X_add_number)
6095             {
6096               expr1.X_add_number = offset_expr.X_add_number;
6097               offset_expr.X_add_number = 0;
6098
6099               relax_start (offset_expr.X_add_symbol);
6100               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6101                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6102
6103               if (expr1.X_add_number >= -0x8000
6104                   && expr1.X_add_number < 0x8000)
6105                 {
6106                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6107                                tempreg, tempreg, BFD_RELOC_LO16);
6108                 }
6109               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6110                 {
6111                   /* If we are going to add in a base register, and the
6112                      target register and the base register are the same,
6113                      then we are using AT as a temporary register.  Since
6114                      we want to load the constant into AT, we add our
6115                      current AT (from the global offset table) and the
6116                      register into the register now, and pretend we were
6117                      not using a base register.  */
6118                   if (breg != treg)
6119                     dreg = tempreg;
6120                   else
6121                     {
6122                       gas_assert (tempreg == AT);
6123                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6124                                    treg, AT, breg);
6125                       dreg = treg;
6126                       add_breg_early = 1;
6127                     }
6128
6129                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6130                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6131                                dreg, dreg, AT);
6132
6133                   used_at = 1;
6134                 }
6135               else
6136                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6137
6138               relax_switch ();
6139               offset_expr.X_add_number = expr1.X_add_number;
6140
6141               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6142                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6143               if (add_breg_early)
6144                 {
6145                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6146                                treg, tempreg, breg);
6147                   breg = 0;
6148                   tempreg = treg;
6149                 }
6150               relax_end ();
6151             }
6152           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
6153             {
6154               relax_start (offset_expr.X_add_symbol);
6155               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6156                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
6157               relax_switch ();
6158               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6159                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6160               relax_end ();
6161             }
6162           else
6163             {
6164               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6165                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
6166             }
6167         }
6168       else if (mips_big_got && !HAVE_NEWABI)
6169         {
6170           int gpdelay;
6171           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6172           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6173           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6174
6175           /* This is the large GOT case.  If this is a reference to an
6176              external symbol, and there is no constant, we want
6177                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6178                addu     $tempreg,$tempreg,$gp
6179                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6180              or for lca or if tempreg is PIC_CALL_REG
6181                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6182                addu     $tempreg,$tempreg,$gp
6183                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6184              For a local symbol, we want
6185                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6186                nop
6187                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6188
6189              If we have a small constant, and this is a reference to
6190              an external symbol, we want
6191                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6192                addu     $tempreg,$tempreg,$gp
6193                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6194                nop
6195                addiu    $tempreg,$tempreg,<constant>
6196              For a local symbol, we want
6197                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6198                nop
6199                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
6200
6201              If we have a large constant, and this is a reference to
6202              an external symbol, we want
6203                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6204                addu     $tempreg,$tempreg,$gp
6205                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6206                lui      $at,<hiconstant>
6207                addiu    $at,$at,<loconstant>
6208                addu     $tempreg,$tempreg,$at
6209              For a local symbol, we want
6210                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6211                lui      $at,<hiconstant>
6212                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
6213                addu     $tempreg,$tempreg,$at
6214           */
6215
6216           expr1.X_add_number = offset_expr.X_add_number;
6217           offset_expr.X_add_number = 0;
6218           relax_start (offset_expr.X_add_symbol);
6219           gpdelay = reg_needs_delay (mips_gp_register);
6220           if (expr1.X_add_number == 0 && breg == 0
6221               && (call || tempreg == PIC_CALL_REG))
6222             {
6223               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6224               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6225             }
6226           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6227           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6228                        tempreg, tempreg, mips_gp_register);
6229           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6230                        tempreg, lw_reloc_type, tempreg);
6231           if (expr1.X_add_number == 0)
6232             {
6233               if (breg != 0)
6234                 {
6235                   /* We're going to put in an addu instruction using
6236                      tempreg, so we may as well insert the nop right
6237                      now.  */
6238                   load_delay_nop ();
6239                 }
6240             }
6241           else if (expr1.X_add_number >= -0x8000
6242                    && expr1.X_add_number < 0x8000)
6243             {
6244               load_delay_nop ();
6245               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6246                            tempreg, tempreg, BFD_RELOC_LO16);
6247             }
6248           else
6249             {
6250               /* If we are going to add in a base register, and the
6251                  target register and the base register are the same,
6252                  then we are using AT as a temporary register.  Since
6253                  we want to load the constant into AT, we add our
6254                  current AT (from the global offset table) and the
6255                  register into the register now, and pretend we were
6256                  not using a base register.  */
6257               if (breg != treg)
6258                 dreg = tempreg;
6259               else
6260                 {
6261                   gas_assert (tempreg == AT);
6262                   load_delay_nop ();
6263                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6264                                treg, AT, breg);
6265                   dreg = treg;
6266                 }
6267
6268               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6269               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6270
6271               used_at = 1;
6272             }
6273           offset_expr.X_add_number =
6274             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
6275           relax_switch ();
6276
6277           if (gpdelay)
6278             {
6279               /* This is needed because this instruction uses $gp, but
6280                  the first instruction on the main stream does not.  */
6281               macro_build (NULL, "nop", "");
6282             }
6283
6284           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6285                        local_reloc_type, mips_gp_register);
6286           if (expr1.X_add_number >= -0x8000
6287               && expr1.X_add_number < 0x8000)
6288             {
6289               load_delay_nop ();
6290               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6291                            tempreg, tempreg, BFD_RELOC_LO16);
6292               /* FIXME: If add_number is 0, and there was no base
6293                  register, the external symbol case ended with a load,
6294                  so if the symbol turns out to not be external, and
6295                  the next instruction uses tempreg, an unnecessary nop
6296                  will be inserted.  */
6297             }
6298           else
6299             {
6300               if (breg == treg)
6301                 {
6302                   /* We must add in the base register now, as in the
6303                      external symbol case.  */
6304                   gas_assert (tempreg == AT);
6305                   load_delay_nop ();
6306                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6307                                treg, AT, breg);
6308                   tempreg = treg;
6309                   /* We set breg to 0 because we have arranged to add
6310                      it in in both cases.  */
6311                   breg = 0;
6312                 }
6313
6314               macro_build_lui (&expr1, AT);
6315               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6316                            AT, AT, BFD_RELOC_LO16);
6317               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6318                            tempreg, tempreg, AT);
6319               used_at = 1;
6320             }
6321           relax_end ();
6322         }
6323       else if (mips_big_got && HAVE_NEWABI)
6324         {
6325           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6326           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6327           int add_breg_early = 0;
6328
6329           /* This is the large GOT case.  If this is a reference to an
6330              external symbol, and there is no constant, we want
6331                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6332                add      $tempreg,$tempreg,$gp
6333                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6334              or for lca or if tempreg is PIC_CALL_REG
6335                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6336                add      $tempreg,$tempreg,$gp
6337                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6338
6339              If we have a small constant, and this is a reference to
6340              an external symbol, we want
6341                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6342                add      $tempreg,$tempreg,$gp
6343                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6344                addi     $tempreg,$tempreg,<constant>
6345
6346              If we have a large constant, and this is a reference to
6347              an external symbol, we want
6348                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6349                addu     $tempreg,$tempreg,$gp
6350                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6351                lui      $at,<hiconstant>
6352                addi     $at,$at,<loconstant>
6353                add      $tempreg,$tempreg,$at
6354
6355              If we have NewABI, and we know it's a local symbol, we want
6356                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6357                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6358              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6359
6360           relax_start (offset_expr.X_add_symbol);
6361
6362           expr1.X_add_number = offset_expr.X_add_number;
6363           offset_expr.X_add_number = 0;
6364
6365           if (expr1.X_add_number == 0 && breg == 0
6366               && (call || tempreg == PIC_CALL_REG))
6367             {
6368               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6369               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6370             }
6371           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6372           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6373                        tempreg, tempreg, mips_gp_register);
6374           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6375                        tempreg, lw_reloc_type, tempreg);
6376
6377           if (expr1.X_add_number == 0)
6378             ;
6379           else if (expr1.X_add_number >= -0x8000
6380                    && expr1.X_add_number < 0x8000)
6381             {
6382               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6383                            tempreg, tempreg, BFD_RELOC_LO16);
6384             }
6385           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6386             {
6387               /* If we are going to add in a base register, and the
6388                  target register and the base register are the same,
6389                  then we are using AT as a temporary register.  Since
6390                  we want to load the constant into AT, we add our
6391                  current AT (from the global offset table) and the
6392                  register into the register now, and pretend we were
6393                  not using a base register.  */
6394               if (breg != treg)
6395                 dreg = tempreg;
6396               else
6397                 {
6398                   gas_assert (tempreg == AT);
6399                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6400                                treg, AT, breg);
6401                   dreg = treg;
6402                   add_breg_early = 1;
6403                 }
6404
6405               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6406               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6407
6408               used_at = 1;
6409             }
6410           else
6411             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6412
6413           relax_switch ();
6414           offset_expr.X_add_number = expr1.X_add_number;
6415           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6416                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6417           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6418                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
6419           if (add_breg_early)
6420             {
6421               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6422                            treg, tempreg, breg);
6423               breg = 0;
6424               tempreg = treg;
6425             }
6426           relax_end ();
6427         }
6428       else
6429         abort ();
6430
6431       if (breg != 0)
6432         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6433       break;
6434
6435     case M_MSGSND:
6436       {
6437         unsigned long temp = (treg << 16) | (0x01);
6438         macro_build (NULL, "c2", "C", temp);
6439       }
6440       break;
6441
6442     case M_MSGLD:
6443       {
6444         unsigned long temp = (0x02);
6445         macro_build (NULL, "c2", "C", temp);
6446       }
6447       break;
6448
6449     case M_MSGLD_T:
6450       {
6451         unsigned long temp = (treg << 16) | (0x02);
6452         macro_build (NULL, "c2", "C", temp);
6453       }
6454       break;
6455
6456     case M_MSGWAIT:
6457       macro_build (NULL, "c2", "C", 3);
6458       break;
6459
6460     case M_MSGWAIT_T:
6461       {
6462         unsigned long temp = (treg << 16) | 0x03;
6463         macro_build (NULL, "c2", "C", temp);
6464       }
6465       break;
6466
6467     case M_J_A:
6468       /* The j instruction may not be used in PIC code, since it
6469          requires an absolute address.  We convert it to a b
6470          instruction.  */
6471       if (mips_pic == NO_PIC)
6472         macro_build (&offset_expr, "j", "a");
6473       else
6474         macro_build (&offset_expr, "b", "p");
6475       break;
6476
6477       /* The jal instructions must be handled as macros because when
6478          generating PIC code they expand to multi-instruction
6479          sequences.  Normally they are simple instructions.  */
6480     case M_JAL_1:
6481       dreg = RA;
6482       /* Fall through.  */
6483     case M_JAL_2:
6484       if (mips_pic == NO_PIC)
6485         macro_build (NULL, "jalr", "d,s", dreg, sreg);
6486       else
6487         {
6488           if (sreg != PIC_CALL_REG)
6489             as_warn (_("MIPS PIC call to register other than $25"));
6490
6491           macro_build (NULL, "jalr", "d,s", dreg, sreg);
6492           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6493             {
6494               if (mips_cprestore_offset < 0)
6495                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6496               else
6497                 {
6498                   if (!mips_frame_reg_valid)
6499                     {
6500                       as_warn (_("No .frame pseudo-op used in PIC code"));
6501                       /* Quiet this warning.  */
6502                       mips_frame_reg_valid = 1;
6503                     }
6504                   if (!mips_cprestore_valid)
6505                     {
6506                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6507                       /* Quiet this warning.  */
6508                       mips_cprestore_valid = 1;
6509                     }
6510                   if (mips_opts.noreorder)
6511                     macro_build (NULL, "nop", "");
6512                   expr1.X_add_number = mips_cprestore_offset;
6513                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6514                                                 mips_gp_register,
6515                                                 mips_frame_reg,
6516                                                 HAVE_64BIT_ADDRESSES);
6517                 }
6518             }
6519         }
6520
6521       break;
6522
6523     case M_JAL_A:
6524       if (mips_pic == NO_PIC)
6525         macro_build (&offset_expr, "jal", "a");
6526       else if (mips_pic == SVR4_PIC)
6527         {
6528           /* If this is a reference to an external symbol, and we are
6529              using a small GOT, we want
6530                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6531                nop
6532                jalr     $ra,$25
6533                nop
6534                lw       $gp,cprestore($sp)
6535              The cprestore value is set using the .cprestore
6536              pseudo-op.  If we are using a big GOT, we want
6537                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6538                addu     $25,$25,$gp
6539                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6540                nop
6541                jalr     $ra,$25
6542                nop
6543                lw       $gp,cprestore($sp)
6544              If the symbol is not external, we want
6545                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6546                nop
6547                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6548                jalr     $ra,$25
6549                nop
6550                lw $gp,cprestore($sp)
6551
6552              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6553              sequences above, minus nops, unless the symbol is local,
6554              which enables us to use GOT_PAGE/GOT_OFST (big got) or
6555              GOT_DISP.  */
6556           if (HAVE_NEWABI)
6557             {
6558               if (!mips_big_got)
6559                 {
6560                   relax_start (offset_expr.X_add_symbol);
6561                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6562                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6563                                mips_gp_register);
6564                   relax_switch ();
6565                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6566                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6567                                mips_gp_register);
6568                   relax_end ();
6569                 }
6570               else
6571                 {
6572                   relax_start (offset_expr.X_add_symbol);
6573                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6574                                BFD_RELOC_MIPS_CALL_HI16);
6575                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6576                                PIC_CALL_REG, mips_gp_register);
6577                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6578                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6579                                PIC_CALL_REG);
6580                   relax_switch ();
6581                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6582                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6583                                mips_gp_register);
6584                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6585                                PIC_CALL_REG, PIC_CALL_REG,
6586                                BFD_RELOC_MIPS_GOT_OFST);
6587                   relax_end ();
6588                 }
6589
6590               macro_build_jalr (&offset_expr);
6591             }
6592           else
6593             {
6594               relax_start (offset_expr.X_add_symbol);
6595               if (!mips_big_got)
6596                 {
6597                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6598                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6599                                mips_gp_register);
6600                   load_delay_nop ();
6601                   relax_switch ();
6602                 }
6603               else
6604                 {
6605                   int gpdelay;
6606
6607                   gpdelay = reg_needs_delay (mips_gp_register);
6608                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6609                                BFD_RELOC_MIPS_CALL_HI16);
6610                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6611                                PIC_CALL_REG, mips_gp_register);
6612                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6613                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6614                                PIC_CALL_REG);
6615                   load_delay_nop ();
6616                   relax_switch ();
6617                   if (gpdelay)
6618                     macro_build (NULL, "nop", "");
6619                 }
6620               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6621                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6622                            mips_gp_register);
6623               load_delay_nop ();
6624               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6625                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6626               relax_end ();
6627               macro_build_jalr (&offset_expr);
6628
6629               if (mips_cprestore_offset < 0)
6630                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6631               else
6632                 {
6633                   if (!mips_frame_reg_valid)
6634                     {
6635                       as_warn (_("No .frame pseudo-op used in PIC code"));
6636                       /* Quiet this warning.  */
6637                       mips_frame_reg_valid = 1;
6638                     }
6639                   if (!mips_cprestore_valid)
6640                     {
6641                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6642                       /* Quiet this warning.  */
6643                       mips_cprestore_valid = 1;
6644                     }
6645                   if (mips_opts.noreorder)
6646                     macro_build (NULL, "nop", "");
6647                   expr1.X_add_number = mips_cprestore_offset;
6648                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6649                                                 mips_gp_register,
6650                                                 mips_frame_reg,
6651                                                 HAVE_64BIT_ADDRESSES);
6652                 }
6653             }
6654         }
6655       else if (mips_pic == VXWORKS_PIC)
6656         as_bad (_("Non-PIC jump used in PIC library"));
6657       else
6658         abort ();
6659
6660       break;
6661
6662     case M_LB_AB:
6663       s = "lb";
6664       goto ld;
6665     case M_LBU_AB:
6666       s = "lbu";
6667       goto ld;
6668     case M_LH_AB:
6669       s = "lh";
6670       goto ld;
6671     case M_LHU_AB:
6672       s = "lhu";
6673       goto ld;
6674     case M_LW_AB:
6675       s = "lw";
6676       goto ld;
6677     case M_LWC0_AB:
6678       s = "lwc0";
6679       /* Itbl support may require additional care here.  */
6680       coproc = 1;
6681       goto ld;
6682     case M_LWC1_AB:
6683       s = "lwc1";
6684       /* Itbl support may require additional care here.  */
6685       coproc = 1;
6686       goto ld;
6687     case M_LWC2_AB:
6688       s = "lwc2";
6689       /* Itbl support may require additional care here.  */
6690       coproc = 1;
6691       goto ld;
6692     case M_LWC3_AB:
6693       s = "lwc3";
6694       /* Itbl support may require additional care here.  */
6695       coproc = 1;
6696       goto ld;
6697     case M_LWL_AB:
6698       s = "lwl";
6699       lr = 1;
6700       goto ld;
6701     case M_LWR_AB:
6702       s = "lwr";
6703       lr = 1;
6704       goto ld;
6705     case M_LDC1_AB:
6706       s = "ldc1";
6707       /* Itbl support may require additional care here.  */
6708       coproc = 1;
6709       goto ld;
6710     case M_LDC2_AB:
6711       s = "ldc2";
6712       /* Itbl support may require additional care here.  */
6713       coproc = 1;
6714       goto ld;
6715     case M_LDC3_AB:
6716       s = "ldc3";
6717       /* Itbl support may require additional care here.  */
6718       coproc = 1;
6719       goto ld;
6720     case M_LDL_AB:
6721       s = "ldl";
6722       lr = 1;
6723       goto ld;
6724     case M_LDR_AB:
6725       s = "ldr";
6726       lr = 1;
6727       goto ld;
6728     case M_LL_AB:
6729       s = "ll";
6730       goto ld;
6731     case M_LLD_AB:
6732       s = "lld";
6733       goto ld;
6734     case M_LWU_AB:
6735       s = "lwu";
6736     ld:
6737       if (breg == treg || coproc || lr)
6738         {
6739           tempreg = AT;
6740           used_at = 1;
6741         }
6742       else
6743         {
6744           tempreg = treg;
6745         }
6746       goto ld_st;
6747     case M_SB_AB:
6748       s = "sb";
6749       goto st;
6750     case M_SH_AB:
6751       s = "sh";
6752       goto st;
6753     case M_SW_AB:
6754       s = "sw";
6755       goto st;
6756     case M_SWC0_AB:
6757       s = "swc0";
6758       /* Itbl support may require additional care here.  */
6759       coproc = 1;
6760       goto st;
6761     case M_SWC1_AB:
6762       s = "swc1";
6763       /* Itbl support may require additional care here.  */
6764       coproc = 1;
6765       goto st;
6766     case M_SWC2_AB:
6767       s = "swc2";
6768       /* Itbl support may require additional care here.  */
6769       coproc = 1;
6770       goto st;
6771     case M_SWC3_AB:
6772       s = "swc3";
6773       /* Itbl support may require additional care here.  */
6774       coproc = 1;
6775       goto st;
6776     case M_SWL_AB:
6777       s = "swl";
6778       goto st;
6779     case M_SWR_AB:
6780       s = "swr";
6781       goto st;
6782     case M_SC_AB:
6783       s = "sc";
6784       goto st;
6785     case M_SCD_AB:
6786       s = "scd";
6787       goto st;
6788     case M_CACHE_AB:
6789       s = "cache";
6790       goto st;
6791     case M_PREF_AB:
6792       s = "pref";
6793       goto st;
6794     case M_SDC1_AB:
6795       s = "sdc1";
6796       coproc = 1;
6797       /* Itbl support may require additional care here.  */
6798       goto st;
6799     case M_SDC2_AB:
6800       s = "sdc2";
6801       /* Itbl support may require additional care here.  */
6802       coproc = 1;
6803       goto st;
6804     case M_SDC3_AB:
6805       s = "sdc3";
6806       /* Itbl support may require additional care here.  */
6807       coproc = 1;
6808       goto st;
6809     case M_SDL_AB:
6810       s = "sdl";
6811       goto st;
6812     case M_SDR_AB:
6813       s = "sdr";
6814     st:
6815       tempreg = AT;
6816       used_at = 1;
6817     ld_st:
6818       if (coproc
6819           && NO_ISA_COP (mips_opts.arch)
6820           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6821         {
6822           as_bad (_("Opcode not supported on this processor: %s"),
6823                   mips_cpu_info_from_arch (mips_opts.arch)->name);
6824           break;
6825         }
6826
6827       /* Itbl support may require additional care here.  */
6828       if (mask == M_LWC1_AB
6829           || mask == M_SWC1_AB
6830           || mask == M_LDC1_AB
6831           || mask == M_SDC1_AB
6832           || mask == M_L_DAB
6833           || mask == M_S_DAB)
6834         fmt = "T,o(b)";
6835       else if (mask == M_CACHE_AB || mask == M_PREF_AB)
6836         fmt = "k,o(b)";
6837       else if (coproc)
6838         fmt = "E,o(b)";
6839       else
6840         fmt = "t,o(b)";
6841
6842       if (offset_expr.X_op != O_constant
6843           && offset_expr.X_op != O_symbol)
6844         {
6845           as_bad (_("Expression too complex"));
6846           offset_expr.X_op = O_constant;
6847         }
6848
6849       if (HAVE_32BIT_ADDRESSES
6850           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6851         {
6852           char value [32];
6853
6854           sprintf_vma (value, offset_expr.X_add_number);
6855           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6856         }
6857
6858       /* A constant expression in PIC code can be handled just as it
6859          is in non PIC code.  */
6860       if (offset_expr.X_op == O_constant)
6861         {
6862           expr1.X_add_number = offset_expr.X_add_number;
6863           normalize_address_expr (&expr1);
6864           if (!IS_SEXT_16BIT_NUM (expr1.X_add_number))
6865             {
6866               expr1.X_add_number = ((expr1.X_add_number + 0x8000)
6867                                     & ~(bfd_vma) 0xffff);
6868               load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6869               if (breg != 0)
6870                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6871                              tempreg, tempreg, breg);
6872               breg = tempreg;
6873             }
6874           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, breg);
6875         }
6876       else if (mips_pic == NO_PIC)
6877         {
6878           /* If this is a reference to a GP relative symbol, and there
6879              is no base register, we want
6880                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6881              Otherwise, if there is no base register, we want
6882                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6883                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6884              If we have a constant, we need two instructions anyhow,
6885              so we always use the latter form.
6886
6887              If we have a base register, and this is a reference to a
6888              GP relative symbol, we want
6889                addu     $tempreg,$breg,$gp
6890                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6891              Otherwise we want
6892                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6893                addu     $tempreg,$tempreg,$breg
6894                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6895              With a constant we always use the latter case.
6896
6897              With 64bit address space and no base register and $at usable,
6898              we want
6899                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6900                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6901                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6902                dsll32   $tempreg,0
6903                daddu    $tempreg,$at
6904                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6905              If we have a base register, we want
6906                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6907                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6908                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6909                daddu    $at,$breg
6910                dsll32   $tempreg,0
6911                daddu    $tempreg,$at
6912                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6913
6914              Without $at we can't generate the optimal path for superscalar
6915              processors here since this would require two temporary registers.
6916                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6917                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6918                dsll     $tempreg,16
6919                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6920                dsll     $tempreg,16
6921                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6922              If we have a base register, we want
6923                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6924                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6925                dsll     $tempreg,16
6926                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6927                dsll     $tempreg,16
6928                daddu    $tempreg,$tempreg,$breg
6929                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6930
6931              For GP relative symbols in 64bit address space we can use
6932              the same sequence as in 32bit address space.  */
6933           if (HAVE_64BIT_SYMBOLS)
6934             {
6935               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6936                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6937                 {
6938                   relax_start (offset_expr.X_add_symbol);
6939                   if (breg == 0)
6940                     {
6941                       macro_build (&offset_expr, s, fmt, treg,
6942                                    BFD_RELOC_GPREL16, mips_gp_register);
6943                     }
6944                   else
6945                     {
6946                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6947                                    tempreg, breg, mips_gp_register);
6948                       macro_build (&offset_expr, s, fmt, treg,
6949                                    BFD_RELOC_GPREL16, tempreg);
6950                     }
6951                   relax_switch ();
6952                 }
6953
6954               if (used_at == 0 && mips_opts.at)
6955                 {
6956                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6957                                BFD_RELOC_MIPS_HIGHEST);
6958                   macro_build (&offset_expr, "lui", "t,u", AT,
6959                                BFD_RELOC_HI16_S);
6960                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6961                                tempreg, BFD_RELOC_MIPS_HIGHER);
6962                   if (breg != 0)
6963                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6964                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6965                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6966                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6967                                tempreg);
6968                   used_at = 1;
6969                 }
6970               else
6971                 {
6972                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6973                                BFD_RELOC_MIPS_HIGHEST);
6974                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6975                                tempreg, BFD_RELOC_MIPS_HIGHER);
6976                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6977                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6978                                tempreg, BFD_RELOC_HI16_S);
6979                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6980                   if (breg != 0)
6981                     macro_build (NULL, "daddu", "d,v,t",
6982                                  tempreg, tempreg, breg);
6983                   macro_build (&offset_expr, s, fmt, treg,
6984                                BFD_RELOC_LO16, tempreg);
6985                 }
6986
6987               if (mips_relax.sequence)
6988                 relax_end ();
6989               break;
6990             }
6991
6992           if (breg == 0)
6993             {
6994               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6995                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6996                 {
6997                   relax_start (offset_expr.X_add_symbol);
6998                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6999                                mips_gp_register);
7000                   relax_switch ();
7001                 }
7002               macro_build_lui (&offset_expr, tempreg);
7003               macro_build (&offset_expr, s, fmt, treg,
7004                            BFD_RELOC_LO16, tempreg);
7005               if (mips_relax.sequence)
7006                 relax_end ();
7007             }
7008           else
7009             {
7010               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7011                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7012                 {
7013                   relax_start (offset_expr.X_add_symbol);
7014                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7015                                tempreg, breg, mips_gp_register);
7016                   macro_build (&offset_expr, s, fmt, treg,
7017                                BFD_RELOC_GPREL16, tempreg);
7018                   relax_switch ();
7019                 }
7020               macro_build_lui (&offset_expr, tempreg);
7021               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7022                            tempreg, tempreg, breg);
7023               macro_build (&offset_expr, s, fmt, treg,
7024                            BFD_RELOC_LO16, tempreg);
7025               if (mips_relax.sequence)
7026                 relax_end ();
7027             }
7028         }
7029       else if (!mips_big_got)
7030         {
7031           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
7032
7033           /* If this is a reference to an external symbol, we want
7034                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7035                nop
7036                <op>     $treg,0($tempreg)
7037              Otherwise we want
7038                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7039                nop
7040                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7041                <op>     $treg,0($tempreg)
7042
7043              For NewABI, we want
7044                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
7045                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
7046
7047              If there is a base register, we add it to $tempreg before
7048              the <op>.  If there is a constant, we stick it in the
7049              <op> instruction.  We don't handle constants larger than
7050              16 bits, because we have no way to load the upper 16 bits
7051              (actually, we could handle them for the subset of cases
7052              in which we are not using $at).  */
7053           gas_assert (offset_expr.X_op == O_symbol);
7054           if (HAVE_NEWABI)
7055             {
7056               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7057                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7058               if (breg != 0)
7059                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7060                              tempreg, tempreg, breg);
7061               macro_build (&offset_expr, s, fmt, treg,
7062                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
7063               break;
7064             }
7065           expr1.X_add_number = offset_expr.X_add_number;
7066           offset_expr.X_add_number = 0;
7067           if (expr1.X_add_number < -0x8000
7068               || expr1.X_add_number >= 0x8000)
7069             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7070           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7071                        lw_reloc_type, mips_gp_register);
7072           load_delay_nop ();
7073           relax_start (offset_expr.X_add_symbol);
7074           relax_switch ();
7075           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7076                        tempreg, BFD_RELOC_LO16);
7077           relax_end ();
7078           if (breg != 0)
7079             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7080                          tempreg, tempreg, breg);
7081           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7082         }
7083       else if (mips_big_got && !HAVE_NEWABI)
7084         {
7085           int gpdelay;
7086
7087           /* If this is a reference to an external symbol, we want
7088                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7089                addu     $tempreg,$tempreg,$gp
7090                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7091                <op>     $treg,0($tempreg)
7092              Otherwise we want
7093                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
7094                nop
7095                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
7096                <op>     $treg,0($tempreg)
7097              If there is a base register, we add it to $tempreg before
7098              the <op>.  If there is a constant, we stick it in the
7099              <op> instruction.  We don't handle constants larger than
7100              16 bits, because we have no way to load the upper 16 bits
7101              (actually, we could handle them for the subset of cases
7102              in which we are not using $at).  */
7103           gas_assert (offset_expr.X_op == O_symbol);
7104           expr1.X_add_number = offset_expr.X_add_number;
7105           offset_expr.X_add_number = 0;
7106           if (expr1.X_add_number < -0x8000
7107               || expr1.X_add_number >= 0x8000)
7108             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7109           gpdelay = reg_needs_delay (mips_gp_register);
7110           relax_start (offset_expr.X_add_symbol);
7111           macro_build (&offset_expr, "lui", "t,u", tempreg,
7112                        BFD_RELOC_MIPS_GOT_HI16);
7113           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7114                        mips_gp_register);
7115           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7116                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
7117           relax_switch ();
7118           if (gpdelay)
7119             macro_build (NULL, "nop", "");
7120           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7121                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7122           load_delay_nop ();
7123           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
7124                        tempreg, BFD_RELOC_LO16);
7125           relax_end ();
7126
7127           if (breg != 0)
7128             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7129                          tempreg, tempreg, breg);
7130           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7131         }
7132       else if (mips_big_got && HAVE_NEWABI)
7133         {
7134           /* If this is a reference to an external symbol, we want
7135                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
7136                add      $tempreg,$tempreg,$gp
7137                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
7138                <op>     $treg,<ofst>($tempreg)
7139              Otherwise, for local symbols, we want:
7140                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
7141                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
7142           gas_assert (offset_expr.X_op == O_symbol);
7143           expr1.X_add_number = offset_expr.X_add_number;
7144           offset_expr.X_add_number = 0;
7145           if (expr1.X_add_number < -0x8000
7146               || expr1.X_add_number >= 0x8000)
7147             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7148           relax_start (offset_expr.X_add_symbol);
7149           macro_build (&offset_expr, "lui", "t,u", tempreg,
7150                        BFD_RELOC_MIPS_GOT_HI16);
7151           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
7152                        mips_gp_register);
7153           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7154                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
7155           if (breg != 0)
7156             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7157                          tempreg, tempreg, breg);
7158           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
7159
7160           relax_switch ();
7161           offset_expr.X_add_number = expr1.X_add_number;
7162           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
7163                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
7164           if (breg != 0)
7165             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7166                          tempreg, tempreg, breg);
7167           macro_build (&offset_expr, s, fmt, treg,
7168                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
7169           relax_end ();
7170         }
7171       else
7172         abort ();
7173
7174       break;
7175
7176     case M_LI:
7177     case M_LI_S:
7178       load_register (treg, &imm_expr, 0);
7179       break;
7180
7181     case M_DLI:
7182       load_register (treg, &imm_expr, 1);
7183       break;
7184
7185     case M_LI_SS:
7186       if (imm_expr.X_op == O_constant)
7187         {
7188           used_at = 1;
7189           load_register (AT, &imm_expr, 0);
7190           macro_build (NULL, "mtc1", "t,G", AT, treg);
7191           break;
7192         }
7193       else
7194         {
7195           gas_assert (offset_expr.X_op == O_symbol
7196                       && strcmp (segment_name (S_GET_SEGMENT
7197                                                (offset_expr.X_add_symbol)),
7198                                  ".lit4") == 0
7199                       && offset_expr.X_add_number == 0);
7200           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
7201                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7202           break;
7203         }
7204
7205     case M_LI_D:
7206       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
7207          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
7208          order 32 bits of the value and the low order 32 bits are either
7209          zero or in OFFSET_EXPR.  */
7210       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7211         {
7212           if (HAVE_64BIT_GPRS)
7213             load_register (treg, &imm_expr, 1);
7214           else
7215             {
7216               int hreg, lreg;
7217
7218               if (target_big_endian)
7219                 {
7220                   hreg = treg;
7221                   lreg = treg + 1;
7222                 }
7223               else
7224                 {
7225                   hreg = treg + 1;
7226                   lreg = treg;
7227                 }
7228
7229               if (hreg <= 31)
7230                 load_register (hreg, &imm_expr, 0);
7231               if (lreg <= 31)
7232                 {
7233                   if (offset_expr.X_op == O_absent)
7234                     move_register (lreg, 0);
7235                   else
7236                     {
7237                       gas_assert (offset_expr.X_op == O_constant);
7238                       load_register (lreg, &offset_expr, 0);
7239                     }
7240                 }
7241             }
7242           break;
7243         }
7244
7245       /* We know that sym is in the .rdata section.  First we get the
7246          upper 16 bits of the address.  */
7247       if (mips_pic == NO_PIC)
7248         {
7249           macro_build_lui (&offset_expr, AT);
7250           used_at = 1;
7251         }
7252       else
7253         {
7254           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7255                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7256           used_at = 1;
7257         }
7258
7259       /* Now we load the register(s).  */
7260       if (HAVE_64BIT_GPRS)
7261         {
7262           used_at = 1;
7263           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7264         }
7265       else
7266         {
7267           used_at = 1;
7268           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
7269           if (treg != RA)
7270             {
7271               /* FIXME: How in the world do we deal with the possible
7272                  overflow here?  */
7273               offset_expr.X_add_number += 4;
7274               macro_build (&offset_expr, "lw", "t,o(b)",
7275                            treg + 1, BFD_RELOC_LO16, AT);
7276             }
7277         }
7278       break;
7279
7280     case M_LI_DD:
7281       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
7282          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
7283          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
7284          the value and the low order 32 bits are either zero or in
7285          OFFSET_EXPR.  */
7286       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
7287         {
7288           used_at = 1;
7289           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7290           if (HAVE_64BIT_FPRS)
7291             {
7292               gas_assert (HAVE_64BIT_GPRS);
7293               macro_build (NULL, "dmtc1", "t,S", AT, treg);
7294             }
7295           else
7296             {
7297               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7298               if (offset_expr.X_op == O_absent)
7299                 macro_build (NULL, "mtc1", "t,G", 0, treg);
7300               else
7301                 {
7302                   gas_assert (offset_expr.X_op == O_constant);
7303                   load_register (AT, &offset_expr, 0);
7304                   macro_build (NULL, "mtc1", "t,G", AT, treg);
7305                 }
7306             }
7307           break;
7308         }
7309
7310       gas_assert (offset_expr.X_op == O_symbol
7311                   && offset_expr.X_add_number == 0);
7312       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7313       if (strcmp (s, ".lit8") == 0)
7314         {
7315           if (mips_opts.isa != ISA_MIPS1)
7316             {
7317               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7318                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7319               break;
7320             }
7321           breg = mips_gp_register;
7322           r = BFD_RELOC_MIPS_LITERAL;
7323           goto dob;
7324         }
7325       else
7326         {
7327           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7328           used_at = 1;
7329           if (mips_pic != NO_PIC)
7330             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7331                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
7332           else
7333             {
7334               /* FIXME: This won't work for a 64 bit address.  */
7335               macro_build_lui (&offset_expr, AT);
7336             }
7337
7338           if (mips_opts.isa != ISA_MIPS1)
7339             {
7340               macro_build (&offset_expr, "ldc1", "T,o(b)",
7341                            treg, BFD_RELOC_LO16, AT);
7342               break;
7343             }
7344           breg = AT;
7345           r = BFD_RELOC_LO16;
7346           goto dob;
7347         }
7348
7349     case M_L_DOB:
7350       /* Even on a big endian machine $fn comes before $fn+1.  We have
7351          to adjust when loading from memory.  */
7352       r = BFD_RELOC_LO16;
7353     dob:
7354       gas_assert (mips_opts.isa == ISA_MIPS1);
7355       macro_build (&offset_expr, "lwc1", "T,o(b)",
7356                    target_big_endian ? treg + 1 : treg, r, breg);
7357       /* FIXME: A possible overflow which I don't know how to deal
7358          with.  */
7359       offset_expr.X_add_number += 4;
7360       macro_build (&offset_expr, "lwc1", "T,o(b)",
7361                    target_big_endian ? treg : treg + 1, r, breg);
7362       break;
7363
7364     case M_S_DOB:
7365       gas_assert (mips_opts.isa == ISA_MIPS1);
7366       /* Even on a big endian machine $fn comes before $fn+1.  We have
7367          to adjust when storing to memory.  */
7368       macro_build (&offset_expr, "swc1", "T,o(b)",
7369                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7370       offset_expr.X_add_number += 4;
7371       macro_build (&offset_expr, "swc1", "T,o(b)",
7372                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7373       break;
7374
7375     case M_L_DAB:
7376       /*
7377        * The MIPS assembler seems to check for X_add_number not
7378        * being double aligned and generating:
7379        *        lui     at,%hi(foo+1)
7380        *        addu    at,at,v1
7381        *        addiu   at,at,%lo(foo+1)
7382        *        lwc1    f2,0(at)
7383        *        lwc1    f3,4(at)
7384        * But, the resulting address is the same after relocation so why
7385        * generate the extra instruction?
7386        */
7387       /* Itbl support may require additional care here.  */
7388       coproc = 1;
7389       if (mips_opts.isa != ISA_MIPS1)
7390         {
7391           s = "ldc1";
7392           goto ld;
7393         }
7394
7395       s = "lwc1";
7396       fmt = "T,o(b)";
7397       goto ldd_std;
7398
7399     case M_S_DAB:
7400       if (mips_opts.isa != ISA_MIPS1)
7401         {
7402           s = "sdc1";
7403           goto st;
7404         }
7405
7406       s = "swc1";
7407       fmt = "T,o(b)";
7408       /* Itbl support may require additional care here.  */
7409       coproc = 1;
7410       goto ldd_std;
7411
7412     case M_LD_AB:
7413       if (HAVE_64BIT_GPRS)
7414         {
7415           s = "ld";
7416           goto ld;
7417         }
7418
7419       s = "lw";
7420       fmt = "t,o(b)";
7421       goto ldd_std;
7422
7423     case M_SD_AB:
7424       if (HAVE_64BIT_GPRS)
7425         {
7426           s = "sd";
7427           goto st;
7428         }
7429
7430       s = "sw";
7431       fmt = "t,o(b)";
7432
7433     ldd_std:
7434       if (offset_expr.X_op != O_symbol
7435           && offset_expr.X_op != O_constant)
7436         {
7437           as_bad (_("Expression too complex"));
7438           offset_expr.X_op = O_constant;
7439         }
7440
7441       if (HAVE_32BIT_ADDRESSES
7442           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7443         {
7444           char value [32];
7445
7446           sprintf_vma (value, offset_expr.X_add_number);
7447           as_bad (_("Number (0x%s) larger than 32 bits"), value);
7448         }
7449
7450       /* Even on a big endian machine $fn comes before $fn+1.  We have
7451          to adjust when loading from memory.  We set coproc if we must
7452          load $fn+1 first.  */
7453       /* Itbl support may require additional care here.  */
7454       if (!target_big_endian)
7455         coproc = 0;
7456
7457       if (mips_pic == NO_PIC || offset_expr.X_op == O_constant)
7458         {
7459           /* If this is a reference to a GP relative symbol, we want
7460                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7461                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7462              If we have a base register, we use this
7463                addu     $at,$breg,$gp
7464                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7465                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7466              If this is not a GP relative symbol, we want
7467                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7468                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7469                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7470              If there is a base register, we add it to $at after the
7471              lui instruction.  If there is a constant, we always use
7472              the last case.  */
7473           if (offset_expr.X_op == O_symbol
7474               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7475               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7476             {
7477               relax_start (offset_expr.X_add_symbol);
7478               if (breg == 0)
7479                 {
7480                   tempreg = mips_gp_register;
7481                 }
7482               else
7483                 {
7484                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7485                                AT, breg, mips_gp_register);
7486                   tempreg = AT;
7487                   used_at = 1;
7488                 }
7489
7490               /* Itbl support may require additional care here.  */
7491               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7492                            BFD_RELOC_GPREL16, tempreg);
7493               offset_expr.X_add_number += 4;
7494
7495               /* Set mips_optimize to 2 to avoid inserting an
7496                  undesired nop.  */
7497               hold_mips_optimize = mips_optimize;
7498               mips_optimize = 2;
7499               /* Itbl support may require additional care here.  */
7500               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7501                            BFD_RELOC_GPREL16, tempreg);
7502               mips_optimize = hold_mips_optimize;
7503
7504               relax_switch ();
7505
7506               offset_expr.X_add_number -= 4;
7507             }
7508           used_at = 1;
7509           macro_build_lui (&offset_expr, AT);
7510           if (breg != 0)
7511             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7512           /* Itbl support may require additional care here.  */
7513           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7514                        BFD_RELOC_LO16, AT);
7515           /* FIXME: How do we handle overflow here?  */
7516           offset_expr.X_add_number += 4;
7517           /* Itbl support may require additional care here.  */
7518           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7519                        BFD_RELOC_LO16, AT);
7520           if (mips_relax.sequence)
7521             relax_end ();
7522         }
7523       else if (!mips_big_got)
7524         {
7525           /* If this is a reference to an external symbol, we want
7526                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7527                nop
7528                <op>     $treg,0($at)
7529                <op>     $treg+1,4($at)
7530              Otherwise we want
7531                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7532                nop
7533                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7534                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7535              If there is a base register we add it to $at before the
7536              lwc1 instructions.  If there is a constant we include it
7537              in the lwc1 instructions.  */
7538           used_at = 1;
7539           expr1.X_add_number = offset_expr.X_add_number;
7540           if (expr1.X_add_number < -0x8000
7541               || expr1.X_add_number >= 0x8000 - 4)
7542             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7543           load_got_offset (AT, &offset_expr);
7544           load_delay_nop ();
7545           if (breg != 0)
7546             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7547
7548           /* Set mips_optimize to 2 to avoid inserting an undesired
7549              nop.  */
7550           hold_mips_optimize = mips_optimize;
7551           mips_optimize = 2;
7552
7553           /* Itbl support may require additional care here.  */
7554           relax_start (offset_expr.X_add_symbol);
7555           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7556                        BFD_RELOC_LO16, AT);
7557           expr1.X_add_number += 4;
7558           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7559                        BFD_RELOC_LO16, AT);
7560           relax_switch ();
7561           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7562                        BFD_RELOC_LO16, AT);
7563           offset_expr.X_add_number += 4;
7564           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7565                        BFD_RELOC_LO16, AT);
7566           relax_end ();
7567
7568           mips_optimize = hold_mips_optimize;
7569         }
7570       else if (mips_big_got)
7571         {
7572           int gpdelay;
7573
7574           /* If this is a reference to an external symbol, we want
7575                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7576                addu     $at,$at,$gp
7577                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7578                nop
7579                <op>     $treg,0($at)
7580                <op>     $treg+1,4($at)
7581              Otherwise we want
7582                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7583                nop
7584                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7585                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7586              If there is a base register we add it to $at before the
7587              lwc1 instructions.  If there is a constant we include it
7588              in the lwc1 instructions.  */
7589           used_at = 1;
7590           expr1.X_add_number = offset_expr.X_add_number;
7591           offset_expr.X_add_number = 0;
7592           if (expr1.X_add_number < -0x8000
7593               || expr1.X_add_number >= 0x8000 - 4)
7594             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7595           gpdelay = reg_needs_delay (mips_gp_register);
7596           relax_start (offset_expr.X_add_symbol);
7597           macro_build (&offset_expr, "lui", "t,u",
7598                        AT, BFD_RELOC_MIPS_GOT_HI16);
7599           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7600                        AT, AT, mips_gp_register);
7601           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7602                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7603           load_delay_nop ();
7604           if (breg != 0)
7605             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7606           /* Itbl support may require additional care here.  */
7607           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7608                        BFD_RELOC_LO16, AT);
7609           expr1.X_add_number += 4;
7610
7611           /* Set mips_optimize to 2 to avoid inserting an undesired
7612              nop.  */
7613           hold_mips_optimize = mips_optimize;
7614           mips_optimize = 2;
7615           /* Itbl support may require additional care here.  */
7616           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7617                        BFD_RELOC_LO16, AT);
7618           mips_optimize = hold_mips_optimize;
7619           expr1.X_add_number -= 4;
7620
7621           relax_switch ();
7622           offset_expr.X_add_number = expr1.X_add_number;
7623           if (gpdelay)
7624             macro_build (NULL, "nop", "");
7625           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7626                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7627           load_delay_nop ();
7628           if (breg != 0)
7629             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7630           /* Itbl support may require additional care here.  */
7631           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7632                        BFD_RELOC_LO16, AT);
7633           offset_expr.X_add_number += 4;
7634
7635           /* Set mips_optimize to 2 to avoid inserting an undesired
7636              nop.  */
7637           hold_mips_optimize = mips_optimize;
7638           mips_optimize = 2;
7639           /* Itbl support may require additional care here.  */
7640           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7641                        BFD_RELOC_LO16, AT);
7642           mips_optimize = hold_mips_optimize;
7643           relax_end ();
7644         }
7645       else
7646         abort ();
7647
7648       break;
7649
7650     case M_LD_OB:
7651       s = HAVE_64BIT_GPRS ? "ld" : "lw";
7652       goto sd_ob;
7653     case M_SD_OB:
7654       s = HAVE_64BIT_GPRS ? "sd" : "sw";
7655     sd_ob:
7656       macro_build (&offset_expr, s, "t,o(b)", treg,
7657                    -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7658                    breg);
7659       if (!HAVE_64BIT_GPRS)
7660         {
7661           offset_expr.X_add_number += 4;
7662           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7663                        -1, offset_reloc[0], offset_reloc[1], offset_reloc[2],
7664                        breg);
7665         }
7666       break;
7667
7668    /* New code added to support COPZ instructions.
7669       This code builds table entries out of the macros in mip_opcodes.
7670       R4000 uses interlocks to handle coproc delays.
7671       Other chips (like the R3000) require nops to be inserted for delays.
7672
7673       FIXME: Currently, we require that the user handle delays.
7674       In order to fill delay slots for non-interlocked chips,
7675       we must have a way to specify delays based on the coprocessor.
7676       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7677       What are the side-effects of the cop instruction?
7678       What cache support might we have and what are its effects?
7679       Both coprocessor & memory require delays. how long???
7680       What registers are read/set/modified?
7681
7682       If an itbl is provided to interpret cop instructions,
7683       this knowledge can be encoded in the itbl spec.  */
7684
7685     case M_COP0:
7686       s = "c0";
7687       goto copz;
7688     case M_COP1:
7689       s = "c1";
7690       goto copz;
7691     case M_COP2:
7692       s = "c2";
7693       goto copz;
7694     case M_COP3:
7695       s = "c3";
7696     copz:
7697       if (NO_ISA_COP (mips_opts.arch)
7698           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7699         {
7700           as_bad (_("opcode not supported on this processor: %s"),
7701                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7702           break;
7703         }
7704
7705       /* For now we just do C (same as Cz).  The parameter will be
7706          stored in insn_opcode by mips_ip.  */
7707       macro_build (NULL, s, "C", ip->insn_opcode);
7708       break;
7709
7710     case M_MOVE:
7711       move_register (dreg, sreg);
7712       break;
7713
7714     case M_DMUL:
7715       dbl = 1;
7716     case M_MUL:
7717       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7718       macro_build (NULL, "mflo", "d", dreg);
7719       break;
7720
7721     case M_DMUL_I:
7722       dbl = 1;
7723     case M_MUL_I:
7724       /* The MIPS assembler some times generates shifts and adds.  I'm
7725          not trying to be that fancy. GCC should do this for us
7726          anyway.  */
7727       used_at = 1;
7728       load_register (AT, &imm_expr, dbl);
7729       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7730       macro_build (NULL, "mflo", "d", dreg);
7731       break;
7732
7733     case M_DMULO_I:
7734       dbl = 1;
7735     case M_MULO_I:
7736       imm = 1;
7737       goto do_mulo;
7738
7739     case M_DMULO:
7740       dbl = 1;
7741     case M_MULO:
7742     do_mulo:
7743       start_noreorder ();
7744       used_at = 1;
7745       if (imm)
7746         load_register (AT, &imm_expr, dbl);
7747       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7748       macro_build (NULL, "mflo", "d", dreg);
7749       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7750       macro_build (NULL, "mfhi", "d", AT);
7751       if (mips_trap)
7752         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7753       else
7754         {
7755           expr1.X_add_number = 8;
7756           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7757           macro_build (NULL, "nop", "");
7758           macro_build (NULL, "break", "c", 6);
7759         }
7760       end_noreorder ();
7761       macro_build (NULL, "mflo", "d", dreg);
7762       break;
7763
7764     case M_DMULOU_I:
7765       dbl = 1;
7766     case M_MULOU_I:
7767       imm = 1;
7768       goto do_mulou;
7769
7770     case M_DMULOU:
7771       dbl = 1;
7772     case M_MULOU:
7773     do_mulou:
7774       start_noreorder ();
7775       used_at = 1;
7776       if (imm)
7777         load_register (AT, &imm_expr, dbl);
7778       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7779                    sreg, imm ? AT : treg);
7780       macro_build (NULL, "mfhi", "d", AT);
7781       macro_build (NULL, "mflo", "d", dreg);
7782       if (mips_trap)
7783         macro_build (NULL, "tne", "s,t,q", AT, ZERO, 6);
7784       else
7785         {
7786           expr1.X_add_number = 8;
7787           macro_build (&expr1, "beq", "s,t,p", AT, ZERO);
7788           macro_build (NULL, "nop", "");
7789           macro_build (NULL, "break", "c", 6);
7790         }
7791       end_noreorder ();
7792       break;
7793
7794     case M_DROL:
7795       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7796         {
7797           if (dreg == sreg)
7798             {
7799               tempreg = AT;
7800               used_at = 1;
7801             }
7802           else
7803             {
7804               tempreg = dreg;
7805             }
7806           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7807           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7808           break;
7809         }
7810       used_at = 1;
7811       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7812       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7813       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7814       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7815       break;
7816
7817     case M_ROL:
7818       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7819         {
7820           if (dreg == sreg)
7821             {
7822               tempreg = AT;
7823               used_at = 1;
7824             }
7825           else
7826             {
7827               tempreg = dreg;
7828             }
7829           macro_build (NULL, "negu", "d,w", tempreg, treg);
7830           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7831           break;
7832         }
7833       used_at = 1;
7834       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7835       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7836       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7837       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7838       break;
7839
7840     case M_DROL_I:
7841       {
7842         unsigned int rot;
7843         char *l;
7844         char *rr;
7845
7846         if (imm_expr.X_op != O_constant)
7847           as_bad (_("Improper rotate count"));
7848         rot = imm_expr.X_add_number & 0x3f;
7849         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7850           {
7851             rot = (64 - rot) & 0x3f;
7852             if (rot >= 32)
7853               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7854             else
7855               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7856             break;
7857           }
7858         if (rot == 0)
7859           {
7860             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7861             break;
7862           }
7863         l = (rot < 0x20) ? "dsll" : "dsll32";
7864         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7865         rot &= 0x1f;
7866         used_at = 1;
7867         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7868         macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7869         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7870       }
7871       break;
7872
7873     case M_ROL_I:
7874       {
7875         unsigned int rot;
7876
7877         if (imm_expr.X_op != O_constant)
7878           as_bad (_("Improper rotate count"));
7879         rot = imm_expr.X_add_number & 0x1f;
7880         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7881           {
7882             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7883             break;
7884           }
7885         if (rot == 0)
7886           {
7887             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7888             break;
7889           }
7890         used_at = 1;
7891         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7892         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7893         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7894       }
7895       break;
7896
7897     case M_DROR:
7898       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7899         {
7900           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7901           break;
7902         }
7903       used_at = 1;
7904       macro_build (NULL, "dsubu", "d,v,t", AT, ZERO, treg);
7905       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7906       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7907       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7908       break;
7909
7910     case M_ROR:
7911       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7912         {
7913           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7914           break;
7915         }
7916       used_at = 1;
7917       macro_build (NULL, "subu", "d,v,t", AT, ZERO, treg);
7918       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7919       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7920       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7921       break;
7922
7923     case M_DROR_I:
7924       {
7925         unsigned int rot;
7926         char *l;
7927         char *rr;
7928
7929         if (imm_expr.X_op != O_constant)
7930           as_bad (_("Improper rotate count"));
7931         rot = imm_expr.X_add_number & 0x3f;
7932         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7933           {
7934             if (rot >= 32)
7935               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7936             else
7937               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7938             break;
7939           }
7940         if (rot == 0)
7941           {
7942             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7943             break;
7944           }
7945         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7946         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7947         rot &= 0x1f;
7948         used_at = 1;
7949         macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7950         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7951         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7952       }
7953       break;
7954
7955     case M_ROR_I:
7956       {
7957         unsigned int rot;
7958
7959         if (imm_expr.X_op != O_constant)
7960           as_bad (_("Improper rotate count"));
7961         rot = imm_expr.X_add_number & 0x1f;
7962         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7963           {
7964             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7965             break;
7966           }
7967         if (rot == 0)
7968           {
7969             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7970             break;
7971           }
7972         used_at = 1;
7973         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7974         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7975         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7976       }
7977       break;
7978
7979     case M_SEQ:
7980       if (sreg == 0)
7981         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7982       else if (treg == 0)
7983         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7984       else
7985         {
7986           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7987           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7988         }
7989       break;
7990
7991     case M_SEQ_I:
7992       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7993         {
7994           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7995           break;
7996         }
7997       if (sreg == 0)
7998         {
7999           as_warn (_("Instruction %s: result is always false"),
8000                    ip->insn_mo->name);
8001           move_register (dreg, 0);
8002           break;
8003         }
8004       if (CPU_HAS_SEQ (mips_opts.arch)
8005           && -512 <= imm_expr.X_add_number
8006           && imm_expr.X_add_number < 512)
8007         {
8008           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
8009                        (int) imm_expr.X_add_number);
8010           break;
8011         }
8012       if (imm_expr.X_op == O_constant
8013           && imm_expr.X_add_number >= 0
8014           && imm_expr.X_add_number < 0x10000)
8015         {
8016           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
8017         }
8018       else if (imm_expr.X_op == O_constant
8019                && imm_expr.X_add_number > -0x8000
8020                && imm_expr.X_add_number < 0)
8021         {
8022           imm_expr.X_add_number = -imm_expr.X_add_number;
8023           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
8024                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8025         }
8026       else if (CPU_HAS_SEQ (mips_opts.arch))
8027         {
8028           used_at = 1;
8029           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8030           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
8031           break;
8032         }
8033       else
8034         {
8035           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8036           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
8037           used_at = 1;
8038         }
8039       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
8040       break;
8041
8042     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
8043       s = "slt";
8044       goto sge;
8045     case M_SGEU:
8046       s = "sltu";
8047     sge:
8048       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
8049       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8050       break;
8051
8052     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
8053     case M_SGEU_I:
8054       if (imm_expr.X_op == O_constant
8055           && imm_expr.X_add_number >= -0x8000
8056           && imm_expr.X_add_number < 0x8000)
8057         {
8058           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
8059                        dreg, sreg, BFD_RELOC_LO16);
8060         }
8061       else
8062         {
8063           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8064           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
8065                        dreg, sreg, AT);
8066           used_at = 1;
8067         }
8068       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8069       break;
8070
8071     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
8072       s = "slt";
8073       goto sgt;
8074     case M_SGTU:
8075       s = "sltu";
8076     sgt:
8077       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8078       break;
8079
8080     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
8081       s = "slt";
8082       goto sgti;
8083     case M_SGTU_I:
8084       s = "sltu";
8085     sgti:
8086       used_at = 1;
8087       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8088       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8089       break;
8090
8091     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
8092       s = "slt";
8093       goto sle;
8094     case M_SLEU:
8095       s = "sltu";
8096     sle:
8097       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
8098       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8099       break;
8100
8101     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
8102       s = "slt";
8103       goto slei;
8104     case M_SLEU_I:
8105       s = "sltu";
8106     slei:
8107       used_at = 1;
8108       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8109       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
8110       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
8111       break;
8112
8113     case M_SLT_I:
8114       if (imm_expr.X_op == O_constant
8115           && imm_expr.X_add_number >= -0x8000
8116           && imm_expr.X_add_number < 0x8000)
8117         {
8118           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8119           break;
8120         }
8121       used_at = 1;
8122       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8123       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
8124       break;
8125
8126     case M_SLTU_I:
8127       if (imm_expr.X_op == O_constant
8128           && imm_expr.X_add_number >= -0x8000
8129           && imm_expr.X_add_number < 0x8000)
8130         {
8131           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
8132                        BFD_RELOC_LO16);
8133           break;
8134         }
8135       used_at = 1;
8136       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8137       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
8138       break;
8139
8140     case M_SNE:
8141       if (sreg == 0)
8142         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
8143       else if (treg == 0)
8144         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8145       else
8146         {
8147           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
8148           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8149         }
8150       break;
8151
8152     case M_SNE_I:
8153       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
8154         {
8155           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
8156           break;
8157         }
8158       if (sreg == 0)
8159         {
8160           as_warn (_("Instruction %s: result is always true"),
8161                    ip->insn_mo->name);
8162           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
8163                        dreg, 0, BFD_RELOC_LO16);
8164           break;
8165         }
8166       if (CPU_HAS_SEQ (mips_opts.arch)
8167           && -512 <= imm_expr.X_add_number
8168           && imm_expr.X_add_number < 512)
8169         {
8170           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
8171                        (int) imm_expr.X_add_number);
8172           break;
8173         }
8174       if (imm_expr.X_op == O_constant
8175           && imm_expr.X_add_number >= 0
8176           && imm_expr.X_add_number < 0x10000)
8177         {
8178           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
8179         }
8180       else if (imm_expr.X_op == O_constant
8181                && imm_expr.X_add_number > -0x8000
8182                && imm_expr.X_add_number < 0)
8183         {
8184           imm_expr.X_add_number = -imm_expr.X_add_number;
8185           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
8186                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
8187         }
8188       else if (CPU_HAS_SEQ (mips_opts.arch))
8189         {
8190           used_at = 1;
8191           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8192           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
8193           break;
8194         }
8195       else
8196         {
8197           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8198           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
8199           used_at = 1;
8200         }
8201       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
8202       break;
8203
8204     case M_DSUB_I:
8205       dbl = 1;
8206     case M_SUB_I:
8207       if (imm_expr.X_op == O_constant
8208           && imm_expr.X_add_number > -0x8000
8209           && imm_expr.X_add_number <= 0x8000)
8210         {
8211           imm_expr.X_add_number = -imm_expr.X_add_number;
8212           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
8213                        dreg, sreg, BFD_RELOC_LO16);
8214           break;
8215         }
8216       used_at = 1;
8217       load_register (AT, &imm_expr, dbl);
8218       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
8219       break;
8220
8221     case M_DSUBU_I:
8222       dbl = 1;
8223     case M_SUBU_I:
8224       if (imm_expr.X_op == O_constant
8225           && imm_expr.X_add_number > -0x8000
8226           && imm_expr.X_add_number <= 0x8000)
8227         {
8228           imm_expr.X_add_number = -imm_expr.X_add_number;
8229           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
8230                        dreg, sreg, BFD_RELOC_LO16);
8231           break;
8232         }
8233       used_at = 1;
8234       load_register (AT, &imm_expr, dbl);
8235       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
8236       break;
8237
8238     case M_TEQ_I:
8239       s = "teq";
8240       goto trap;
8241     case M_TGE_I:
8242       s = "tge";
8243       goto trap;
8244     case M_TGEU_I:
8245       s = "tgeu";
8246       goto trap;
8247     case M_TLT_I:
8248       s = "tlt";
8249       goto trap;
8250     case M_TLTU_I:
8251       s = "tltu";
8252       goto trap;
8253     case M_TNE_I:
8254       s = "tne";
8255     trap:
8256       used_at = 1;
8257       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8258       macro_build (NULL, s, "s,t", sreg, AT);
8259       break;
8260
8261     case M_TRUNCWS:
8262     case M_TRUNCWD:
8263       gas_assert (mips_opts.isa == ISA_MIPS1);
8264       used_at = 1;
8265       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
8266       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
8267
8268       /*
8269        * Is the double cfc1 instruction a bug in the mips assembler;
8270        * or is there a reason for it?
8271        */
8272       start_noreorder ();
8273       macro_build (NULL, "cfc1", "t,G", treg, RA);
8274       macro_build (NULL, "cfc1", "t,G", treg, RA);
8275       macro_build (NULL, "nop", "");
8276       expr1.X_add_number = 3;
8277       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8278       expr1.X_add_number = 2;
8279       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8280       macro_build (NULL, "ctc1", "t,G", AT, RA);
8281       macro_build (NULL, "nop", "");
8282       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8283                    dreg, sreg);
8284       macro_build (NULL, "ctc1", "t,G", treg, RA);
8285       macro_build (NULL, "nop", "");
8286       end_noreorder ();
8287       break;
8288
8289     case M_ULH:
8290       s = "lb";
8291       goto ulh;
8292     case M_ULHU:
8293       s = "lbu";
8294     ulh:
8295       used_at = 1;
8296       if (offset_expr.X_add_number >= 0x7fff)
8297         as_bad (_("Operand overflow"));
8298       if (!target_big_endian)
8299         ++offset_expr.X_add_number;
8300       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8301       if (!target_big_endian)
8302         --offset_expr.X_add_number;
8303       else
8304         ++offset_expr.X_add_number;
8305       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8306       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8307       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8308       break;
8309
8310     case M_ULD:
8311       s = "ldl";
8312       s2 = "ldr";
8313       off = 7;
8314       goto ulw;
8315     case M_ULW:
8316       s = "lwl";
8317       s2 = "lwr";
8318       off = 3;
8319     ulw:
8320       if (offset_expr.X_add_number >= 0x8000 - off)
8321         as_bad (_("Operand overflow"));
8322       if (treg != breg)
8323         tempreg = treg;
8324       else
8325         {
8326           used_at = 1;
8327           tempreg = AT;
8328         }
8329       if (!target_big_endian)
8330         offset_expr.X_add_number += off;
8331       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8332       if (!target_big_endian)
8333         offset_expr.X_add_number -= off;
8334       else
8335         offset_expr.X_add_number += off;
8336       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8337
8338       /* If necessary, move the result in tempreg to the final destination.  */
8339       if (treg == tempreg)
8340         break;
8341       /* Protect second load's delay slot.  */
8342       load_delay_nop ();
8343       move_register (treg, tempreg);
8344       break;
8345
8346     case M_ULD_A:
8347       s = "ldl";
8348       s2 = "ldr";
8349       off = 7;
8350       goto ulwa;
8351     case M_ULW_A:
8352       s = "lwl";
8353       s2 = "lwr";
8354       off = 3;
8355     ulwa:
8356       used_at = 1;
8357       load_address (AT, &offset_expr, &used_at);
8358       if (breg != 0)
8359         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8360       if (!target_big_endian)
8361         expr1.X_add_number = off;
8362       else
8363         expr1.X_add_number = 0;
8364       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8365       if (!target_big_endian)
8366         expr1.X_add_number = 0;
8367       else
8368         expr1.X_add_number = off;
8369       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8370       break;
8371
8372     case M_ULH_A:
8373     case M_ULHU_A:
8374       used_at = 1;
8375       load_address (AT, &offset_expr, &used_at);
8376       if (breg != 0)
8377         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8378       if (target_big_endian)
8379         expr1.X_add_number = 0;
8380       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8381                    treg, BFD_RELOC_LO16, AT);
8382       if (target_big_endian)
8383         expr1.X_add_number = 1;
8384       else
8385         expr1.X_add_number = 0;
8386       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8387       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8388       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8389       break;
8390
8391     case M_USH:
8392       used_at = 1;
8393       if (offset_expr.X_add_number >= 0x7fff)
8394         as_bad (_("Operand overflow"));
8395       if (target_big_endian)
8396         ++offset_expr.X_add_number;
8397       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8398       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8399       if (target_big_endian)
8400         --offset_expr.X_add_number;
8401       else
8402         ++offset_expr.X_add_number;
8403       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8404       break;
8405
8406     case M_USD:
8407       s = "sdl";
8408       s2 = "sdr";
8409       off = 7;
8410       goto usw;
8411     case M_USW:
8412       s = "swl";
8413       s2 = "swr";
8414       off = 3;
8415     usw:
8416       if (offset_expr.X_add_number >= 0x8000 - off)
8417         as_bad (_("Operand overflow"));
8418       if (!target_big_endian)
8419         offset_expr.X_add_number += off;
8420       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8421       if (!target_big_endian)
8422         offset_expr.X_add_number -= off;
8423       else
8424         offset_expr.X_add_number += off;
8425       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8426       break;
8427
8428     case M_USD_A:
8429       s = "sdl";
8430       s2 = "sdr";
8431       off = 7;
8432       goto uswa;
8433     case M_USW_A:
8434       s = "swl";
8435       s2 = "swr";
8436       off = 3;
8437     uswa:
8438       used_at = 1;
8439       load_address (AT, &offset_expr, &used_at);
8440       if (breg != 0)
8441         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8442       if (!target_big_endian)
8443         expr1.X_add_number = off;
8444       else
8445         expr1.X_add_number = 0;
8446       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8447       if (!target_big_endian)
8448         expr1.X_add_number = 0;
8449       else
8450         expr1.X_add_number = off;
8451       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8452       break;
8453
8454     case M_USH_A:
8455       used_at = 1;
8456       load_address (AT, &offset_expr, &used_at);
8457       if (breg != 0)
8458         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8459       if (!target_big_endian)
8460         expr1.X_add_number = 0;
8461       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8462       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8463       if (!target_big_endian)
8464         expr1.X_add_number = 1;
8465       else
8466         expr1.X_add_number = 0;
8467       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8468       if (!target_big_endian)
8469         expr1.X_add_number = 0;
8470       else
8471         expr1.X_add_number = 1;
8472       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8473       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8474       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8475       break;
8476
8477     default:
8478       /* FIXME: Check if this is one of the itbl macros, since they
8479          are added dynamically.  */
8480       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8481       break;
8482     }
8483   if (!mips_opts.at && used_at)
8484     as_bad (_("Macro used $at after \".set noat\""));
8485 }
8486
8487 /* Implement macros in mips16 mode.  */
8488
8489 static void
8490 mips16_macro (struct mips_cl_insn *ip)
8491 {
8492   int mask;
8493   int xreg, yreg, zreg, tmp;
8494   expressionS expr1;
8495   int dbl;
8496   const char *s, *s2, *s3;
8497
8498   mask = ip->insn_mo->mask;
8499
8500   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8501   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8502   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8503
8504   expr1.X_op = O_constant;
8505   expr1.X_op_symbol = NULL;
8506   expr1.X_add_symbol = NULL;
8507   expr1.X_add_number = 1;
8508
8509   dbl = 0;
8510
8511   switch (mask)
8512     {
8513     default:
8514       internalError ();
8515
8516     case M_DDIV_3:
8517       dbl = 1;
8518     case M_DIV_3:
8519       s = "mflo";
8520       goto do_div3;
8521     case M_DREM_3:
8522       dbl = 1;
8523     case M_REM_3:
8524       s = "mfhi";
8525     do_div3:
8526       start_noreorder ();
8527       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8528       expr1.X_add_number = 2;
8529       macro_build (&expr1, "bnez", "x,p", yreg);
8530       macro_build (NULL, "break", "6", 7);
8531
8532       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8533          since that causes an overflow.  We should do that as well,
8534          but I don't see how to do the comparisons without a temporary
8535          register.  */
8536       end_noreorder ();
8537       macro_build (NULL, s, "x", zreg);
8538       break;
8539
8540     case M_DIVU_3:
8541       s = "divu";
8542       s2 = "mflo";
8543       goto do_divu3;
8544     case M_REMU_3:
8545       s = "divu";
8546       s2 = "mfhi";
8547       goto do_divu3;
8548     case M_DDIVU_3:
8549       s = "ddivu";
8550       s2 = "mflo";
8551       goto do_divu3;
8552     case M_DREMU_3:
8553       s = "ddivu";
8554       s2 = "mfhi";
8555     do_divu3:
8556       start_noreorder ();
8557       macro_build (NULL, s, "0,x,y", xreg, yreg);
8558       expr1.X_add_number = 2;
8559       macro_build (&expr1, "bnez", "x,p", yreg);
8560       macro_build (NULL, "break", "6", 7);
8561       end_noreorder ();
8562       macro_build (NULL, s2, "x", zreg);
8563       break;
8564
8565     case M_DMUL:
8566       dbl = 1;
8567     case M_MUL:
8568       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8569       macro_build (NULL, "mflo", "x", zreg);
8570       break;
8571
8572     case M_DSUBU_I:
8573       dbl = 1;
8574       goto do_subu;
8575     case M_SUBU_I:
8576     do_subu:
8577       if (imm_expr.X_op != O_constant)
8578         as_bad (_("Unsupported large constant"));
8579       imm_expr.X_add_number = -imm_expr.X_add_number;
8580       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8581       break;
8582
8583     case M_SUBU_I_2:
8584       if (imm_expr.X_op != O_constant)
8585         as_bad (_("Unsupported large constant"));
8586       imm_expr.X_add_number = -imm_expr.X_add_number;
8587       macro_build (&imm_expr, "addiu", "x,k", xreg);
8588       break;
8589
8590     case M_DSUBU_I_2:
8591       if (imm_expr.X_op != O_constant)
8592         as_bad (_("Unsupported large constant"));
8593       imm_expr.X_add_number = -imm_expr.X_add_number;
8594       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8595       break;
8596
8597     case M_BEQ:
8598       s = "cmp";
8599       s2 = "bteqz";
8600       goto do_branch;
8601     case M_BNE:
8602       s = "cmp";
8603       s2 = "btnez";
8604       goto do_branch;
8605     case M_BLT:
8606       s = "slt";
8607       s2 = "btnez";
8608       goto do_branch;
8609     case M_BLTU:
8610       s = "sltu";
8611       s2 = "btnez";
8612       goto do_branch;
8613     case M_BLE:
8614       s = "slt";
8615       s2 = "bteqz";
8616       goto do_reverse_branch;
8617     case M_BLEU:
8618       s = "sltu";
8619       s2 = "bteqz";
8620       goto do_reverse_branch;
8621     case M_BGE:
8622       s = "slt";
8623       s2 = "bteqz";
8624       goto do_branch;
8625     case M_BGEU:
8626       s = "sltu";
8627       s2 = "bteqz";
8628       goto do_branch;
8629     case M_BGT:
8630       s = "slt";
8631       s2 = "btnez";
8632       goto do_reverse_branch;
8633     case M_BGTU:
8634       s = "sltu";
8635       s2 = "btnez";
8636
8637     do_reverse_branch:
8638       tmp = xreg;
8639       xreg = yreg;
8640       yreg = tmp;
8641
8642     do_branch:
8643       macro_build (NULL, s, "x,y", xreg, yreg);
8644       macro_build (&offset_expr, s2, "p");
8645       break;
8646
8647     case M_BEQ_I:
8648       s = "cmpi";
8649       s2 = "bteqz";
8650       s3 = "x,U";
8651       goto do_branch_i;
8652     case M_BNE_I:
8653       s = "cmpi";
8654       s2 = "btnez";
8655       s3 = "x,U";
8656       goto do_branch_i;
8657     case M_BLT_I:
8658       s = "slti";
8659       s2 = "btnez";
8660       s3 = "x,8";
8661       goto do_branch_i;
8662     case M_BLTU_I:
8663       s = "sltiu";
8664       s2 = "btnez";
8665       s3 = "x,8";
8666       goto do_branch_i;
8667     case M_BLE_I:
8668       s = "slti";
8669       s2 = "btnez";
8670       s3 = "x,8";
8671       goto do_addone_branch_i;
8672     case M_BLEU_I:
8673       s = "sltiu";
8674       s2 = "btnez";
8675       s3 = "x,8";
8676       goto do_addone_branch_i;
8677     case M_BGE_I:
8678       s = "slti";
8679       s2 = "bteqz";
8680       s3 = "x,8";
8681       goto do_branch_i;
8682     case M_BGEU_I:
8683       s = "sltiu";
8684       s2 = "bteqz";
8685       s3 = "x,8";
8686       goto do_branch_i;
8687     case M_BGT_I:
8688       s = "slti";
8689       s2 = "bteqz";
8690       s3 = "x,8";
8691       goto do_addone_branch_i;
8692     case M_BGTU_I:
8693       s = "sltiu";
8694       s2 = "bteqz";
8695       s3 = "x,8";
8696
8697     do_addone_branch_i:
8698       if (imm_expr.X_op != O_constant)
8699         as_bad (_("Unsupported large constant"));
8700       ++imm_expr.X_add_number;
8701
8702     do_branch_i:
8703       macro_build (&imm_expr, s, s3, xreg);
8704       macro_build (&offset_expr, s2, "p");
8705       break;
8706
8707     case M_ABS:
8708       expr1.X_add_number = 0;
8709       macro_build (&expr1, "slti", "x,8", yreg);
8710       if (xreg != yreg)
8711         move_register (xreg, yreg);
8712       expr1.X_add_number = 2;
8713       macro_build (&expr1, "bteqz", "p");
8714       macro_build (NULL, "neg", "x,w", xreg, xreg);
8715     }
8716 }
8717
8718 /* For consistency checking, verify that all bits are specified either
8719    by the match/mask part of the instruction definition, or by the
8720    operand list.  */
8721 static int
8722 validate_mips_insn (const struct mips_opcode *opc)
8723 {
8724   const char *p = opc->args;
8725   char c;
8726   unsigned long used_bits = opc->mask;
8727
8728   if ((used_bits & opc->match) != opc->match)
8729     {
8730       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8731               opc->name, opc->args);
8732       return 0;
8733     }
8734 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8735   while (*p)
8736     switch (c = *p++)
8737       {
8738       case ',': break;
8739       case '(': break;
8740       case ')': break;
8741       case '+':
8742         switch (c = *p++)
8743           {
8744           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8745           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8746           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8747           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8748           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8749           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8750           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8751           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8752                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8753           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8754           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8755           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8756           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8757           case 'I': break;
8758           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8759           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8760                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8761           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8762           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8763           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8764           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8765           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8766           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8767           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8768           case 'z': USE_BITS (OP_MASK_RZ,       OP_SH_RZ);      break;
8769           case 'Z': USE_BITS (OP_MASK_FZ,       OP_SH_FZ);      break;
8770           case 'a': USE_BITS (OP_MASK_OFFSET_A, OP_SH_OFFSET_A); break;
8771           case 'b': USE_BITS (OP_MASK_OFFSET_B, OP_SH_OFFSET_B); break;
8772           case 'c': USE_BITS (OP_MASK_OFFSET_C, OP_SH_OFFSET_C); break;
8773
8774           default:
8775             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8776                     c, opc->name, opc->args);
8777             return 0;
8778           }
8779         break;
8780       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8781       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8782       case 'A': break;
8783       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8784       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8785       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8786       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8787       case 'F': break;
8788       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8789       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8790       case 'I': break;
8791       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8792       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8793       case 'L': break;
8794       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8795       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8796       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8797       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8798                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8799       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8800       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8801       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8802       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8803       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8804       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8805       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8806       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8807       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8808       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8809       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8810       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8811       case 'f': break;
8812       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8813       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8814       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8815       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8816       case 'l': break;
8817       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8818       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8819       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8820       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8821       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8822       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8823       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8824       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8825       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8826       case 'x': break;
8827       case 'z': break;
8828       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8829       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8830                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8831       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8832       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8833       case '[': break;
8834       case ']': break;
8835       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8836       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8837       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8838       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8839       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8840       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8841       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8842       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8843       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8844       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8845       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8846       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8847       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8848       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8849       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8850       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8851       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8852       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8853       default:
8854         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8855                 c, opc->name, opc->args);
8856         return 0;
8857       }
8858 #undef USE_BITS
8859   if (used_bits != 0xffffffff)
8860     {
8861       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8862               ~used_bits & 0xffffffff, opc->name, opc->args);
8863       return 0;
8864     }
8865   return 1;
8866 }
8867
8868 /* UDI immediates.  */
8869 struct mips_immed {
8870   char          type;
8871   unsigned int  shift;
8872   unsigned long mask;
8873   const char *  desc;
8874 };
8875
8876 static const struct mips_immed mips_immed[] = {
8877   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8878   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8879   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8880   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8881   { 0,0,0,0 }
8882 };
8883
8884 /* Check whether an odd floating-point register is allowed.  */
8885 static int
8886 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8887 {
8888   const char *s = insn->name;
8889
8890   if (insn->pinfo == INSN_MACRO)
8891     /* Let a macro pass, we'll catch it later when it is expanded.  */
8892     return 1;
8893
8894   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8895     {
8896       /* Allow odd registers for single-precision ops.  */
8897       switch (insn->pinfo & (FP_S | FP_D))
8898         {
8899         case FP_S:
8900         case 0:
8901           return 1;     /* both single precision - ok */
8902         case FP_D:
8903           return 0;     /* both double precision - fail */
8904         default:
8905           break;
8906         }
8907
8908       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8909       s = strchr (insn->name, '.');
8910       if (argnum == 2)
8911         s = s != NULL ? strchr (s + 1, '.') : NULL;
8912       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8913     } 
8914
8915   /* Single-precision coprocessor loads and moves are OK too.  */
8916   if ((insn->pinfo & FP_S)
8917       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8918                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8919     return 1;
8920
8921   return 0;
8922 }
8923
8924 /* This routine assembles an instruction into its binary format.  As a
8925    side effect, it sets one of the global variables imm_reloc or
8926    offset_reloc to the type of relocation to do if one of the operands
8927    is an address expression.  */
8928
8929 static void
8930 mips_ip (char *str, struct mips_cl_insn *ip)
8931 {
8932   char *s;
8933   const char *args;
8934   char c = 0;
8935   struct mips_opcode *insn;
8936   char *argsStart;
8937   unsigned int regno;
8938   unsigned int lastregno;
8939   unsigned int lastpos = 0;
8940   unsigned int limlo, limhi;
8941   char *s_reset;
8942   char save_c = 0;
8943   offsetT min_range, max_range;
8944   int argnum;
8945   unsigned int rtype;
8946
8947   insn_error = NULL;
8948
8949   /* If the instruction contains a '.', we first try to match an instruction
8950      including the '.'.  Then we try again without the '.'.  */
8951   insn = NULL;
8952   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8953     continue;
8954
8955   /* If we stopped on whitespace, then replace the whitespace with null for
8956      the call to hash_find.  Save the character we replaced just in case we
8957      have to re-parse the instruction.  */
8958   if (ISSPACE (*s))
8959     {
8960       save_c = *s;
8961       *s++ = '\0';
8962     }
8963
8964   insn = (struct mips_opcode *) hash_find (op_hash, str);
8965
8966   /* If we didn't find the instruction in the opcode table, try again, but
8967      this time with just the instruction up to, but not including the
8968      first '.'.  */
8969   if (insn == NULL)
8970     {
8971       /* Restore the character we overwrite above (if any).  */
8972       if (save_c)
8973         *(--s) = save_c;
8974
8975       /* Scan up to the first '.' or whitespace.  */
8976       for (s = str;
8977            *s != '\0' && *s != '.' && !ISSPACE (*s);
8978            ++s)
8979         continue;
8980
8981       /* If we did not find a '.', then we can quit now.  */
8982       if (*s != '.')
8983         {
8984           insn_error = _("Unrecognized opcode");
8985           return;
8986         }
8987
8988       /* Lookup the instruction in the hash table.  */
8989       *s++ = '\0';
8990       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8991         {
8992           insn_error = _("Unrecognized opcode");
8993           return;
8994         }
8995     }
8996
8997   argsStart = s;
8998   for (;;)
8999     {
9000       bfd_boolean ok;
9001
9002       gas_assert (strcmp (insn->name, str) == 0);
9003
9004       ok = is_opcode_valid (insn);
9005       if (! ok)
9006         {
9007           if (insn + 1 < &mips_opcodes[NUMOPCODES]
9008               && strcmp (insn->name, insn[1].name) == 0)
9009             {
9010               ++insn;
9011               continue;
9012             }
9013           else
9014             {
9015               if (!insn_error)
9016                 {
9017                   static char buf[100];
9018                   sprintf (buf,
9019                            _("opcode not supported on this processor: %s (%s)"),
9020                            mips_cpu_info_from_arch (mips_opts.arch)->name,
9021                            mips_cpu_info_from_isa (mips_opts.isa)->name);
9022                   insn_error = buf;
9023                 }
9024               if (save_c)
9025                 *(--s) = save_c;
9026               return;
9027             }
9028         }
9029
9030       create_insn (ip, insn);
9031       insn_error = NULL;
9032       argnum = 1;
9033       lastregno = 0xffffffff;
9034       for (args = insn->args;; ++args)
9035         {
9036           int is_mdmx;
9037
9038           s += strspn (s, " \t");
9039           is_mdmx = 0;
9040           switch (*args)
9041             {
9042             case '\0':          /* end of args */
9043               if (*s == '\0')
9044                 return;
9045               break;
9046
9047             case '2': /* DSP 2-bit unsigned immediate in bit 11.  */
9048               my_getExpression (&imm_expr, s);
9049               check_absolute_expr (ip, &imm_expr);
9050               if ((unsigned long) imm_expr.X_add_number != 1
9051                   && (unsigned long) imm_expr.X_add_number != 3)
9052                 {
9053                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
9054                           (unsigned long) imm_expr.X_add_number);
9055                 }
9056               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
9057               imm_expr.X_op = O_absent;
9058               s = expr_end;
9059               continue;
9060
9061             case '3': /* DSP 3-bit unsigned immediate in bit 21.  */
9062               my_getExpression (&imm_expr, s);
9063               check_absolute_expr (ip, &imm_expr);
9064               if (imm_expr.X_add_number & ~OP_MASK_SA3)
9065                 {
9066                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9067                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
9068                 }
9069               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
9070               imm_expr.X_op = O_absent;
9071               s = expr_end;
9072               continue;
9073
9074             case '4': /* DSP 4-bit unsigned immediate in bit 21.  */
9075               my_getExpression (&imm_expr, s);
9076               check_absolute_expr (ip, &imm_expr);
9077               if (imm_expr.X_add_number & ~OP_MASK_SA4)
9078                 {
9079                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9080                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
9081                 }
9082               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
9083               imm_expr.X_op = O_absent;
9084               s = expr_end;
9085               continue;
9086
9087             case '5': /* DSP 8-bit unsigned immediate in bit 16.  */
9088               my_getExpression (&imm_expr, s);
9089               check_absolute_expr (ip, &imm_expr);
9090               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
9091                 {
9092                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9093                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
9094                 }
9095               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
9096               imm_expr.X_op = O_absent;
9097               s = expr_end;
9098               continue;
9099
9100             case '6': /* DSP 5-bit unsigned immediate in bit 21.  */
9101               my_getExpression (&imm_expr, s);
9102               check_absolute_expr (ip, &imm_expr);
9103               if (imm_expr.X_add_number & ~OP_MASK_RS)
9104                 {
9105                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9106                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
9107                 }
9108               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
9109               imm_expr.X_op = O_absent;
9110               s = expr_end;
9111               continue;
9112
9113             case '7': /* Four DSP accumulators in bits 11,12.  */
9114               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9115                   s[3] >= '0' && s[3] <= '3')
9116                 {
9117                   regno = s[3] - '0';
9118                   s += 4;
9119                   INSERT_OPERAND (DSPACC, *ip, regno);
9120                   continue;
9121                 }
9122               else
9123                 as_bad (_("Invalid dsp acc register"));
9124               break;
9125
9126             case '8': /* DSP 6-bit unsigned immediate in bit 11.  */
9127               my_getExpression (&imm_expr, s);
9128               check_absolute_expr (ip, &imm_expr);
9129               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
9130                 {
9131                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9132                           OP_MASK_WRDSP,
9133                           (unsigned long) imm_expr.X_add_number);
9134                 }
9135               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
9136               imm_expr.X_op = O_absent;
9137               s = expr_end;
9138               continue;
9139
9140             case '9': /* Four DSP accumulators in bits 21,22.  */
9141               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9142                   s[3] >= '0' && s[3] <= '3')
9143                 {
9144                   regno = s[3] - '0';
9145                   s += 4;
9146                   INSERT_OPERAND (DSPACC_S, *ip, regno);
9147                   continue;
9148                 }
9149               else
9150                 as_bad (_("Invalid dsp acc register"));
9151               break;
9152
9153             case '0': /* DSP 6-bit signed immediate in bit 20.  */
9154               my_getExpression (&imm_expr, s);
9155               check_absolute_expr (ip, &imm_expr);
9156               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
9157               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
9158               if (imm_expr.X_add_number < min_range ||
9159                   imm_expr.X_add_number > max_range)
9160                 {
9161                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9162                           (long) min_range, (long) max_range,
9163                           (long) imm_expr.X_add_number);
9164                 }
9165               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
9166               imm_expr.X_op = O_absent;
9167               s = expr_end;
9168               continue;
9169
9170             case '\'': /* DSP 6-bit unsigned immediate in bit 16.  */
9171               my_getExpression (&imm_expr, s);
9172               check_absolute_expr (ip, &imm_expr);
9173               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
9174                 {
9175                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
9176                           OP_MASK_RDDSP,
9177                           (unsigned long) imm_expr.X_add_number);
9178                 }
9179               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
9180               imm_expr.X_op = O_absent;
9181               s = expr_end;
9182               continue;
9183
9184             case ':': /* DSP 7-bit signed immediate in bit 19.  */
9185               my_getExpression (&imm_expr, s);
9186               check_absolute_expr (ip, &imm_expr);
9187               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
9188               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
9189               if (imm_expr.X_add_number < min_range ||
9190                   imm_expr.X_add_number > max_range)
9191                 {
9192                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9193                           (long) min_range, (long) max_range,
9194                           (long) imm_expr.X_add_number);
9195                 }
9196               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
9197               imm_expr.X_op = O_absent;
9198               s = expr_end;
9199               continue;
9200
9201             case '@': /* DSP 10-bit signed immediate in bit 16.  */
9202               my_getExpression (&imm_expr, s);
9203               check_absolute_expr (ip, &imm_expr);
9204               min_range = -((OP_MASK_IMM10 + 1) >> 1);
9205               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
9206               if (imm_expr.X_add_number < min_range ||
9207                   imm_expr.X_add_number > max_range)
9208                 {
9209                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
9210                           (long) min_range, (long) max_range,
9211                           (long) imm_expr.X_add_number);
9212                 }
9213               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
9214               imm_expr.X_op = O_absent;
9215               s = expr_end;
9216               continue;
9217
9218             case '!': /* MT usermode flag bit.  */
9219               my_getExpression (&imm_expr, s);
9220               check_absolute_expr (ip, &imm_expr);
9221               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
9222                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
9223                         (unsigned long) imm_expr.X_add_number);
9224               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
9225               imm_expr.X_op = O_absent;
9226               s = expr_end;
9227               continue;
9228
9229             case '$': /* MT load high flag bit.  */
9230               my_getExpression (&imm_expr, s);
9231               check_absolute_expr (ip, &imm_expr);
9232               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
9233                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
9234                         (unsigned long) imm_expr.X_add_number);
9235               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
9236               imm_expr.X_op = O_absent;
9237               s = expr_end;
9238               continue;
9239
9240             case '*': /* Four DSP accumulators in bits 18,19.  */
9241               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9242                   s[3] >= '0' && s[3] <= '3')
9243                 {
9244                   regno = s[3] - '0';
9245                   s += 4;
9246                   INSERT_OPERAND (MTACC_T, *ip, regno);
9247                   continue;
9248                 }
9249               else
9250                 as_bad (_("Invalid dsp/smartmips acc register"));
9251               break;
9252
9253             case '&': /* Four DSP accumulators in bits 13,14.  */
9254               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9255                   s[3] >= '0' && s[3] <= '3')
9256                 {
9257                   regno = s[3] - '0';
9258                   s += 4;
9259                   INSERT_OPERAND (MTACC_D, *ip, regno);
9260                   continue;
9261                 }
9262               else
9263                 as_bad (_("Invalid dsp/smartmips acc register"));
9264               break;
9265
9266             case ',':
9267               ++argnum;
9268               if (*s++ == *args)
9269                 continue;
9270               s--;
9271               switch (*++args)
9272                 {
9273                 case 'r':
9274                 case 'v':
9275                   INSERT_OPERAND (RS, *ip, lastregno);
9276                   continue;
9277
9278                 case 'w':
9279                   INSERT_OPERAND (RT, *ip, lastregno);
9280                   continue;
9281
9282                 case 'W':
9283                   INSERT_OPERAND (FT, *ip, lastregno);
9284                   continue;
9285
9286                 case 'V':
9287                   INSERT_OPERAND (FS, *ip, lastregno);
9288                   continue;
9289                 }
9290               break;
9291
9292             case '(':
9293               /* Handle optional base register.
9294                  Either the base register is omitted or
9295                  we must have a left paren.  */
9296               /* This is dependent on the next operand specifier
9297                  is a base register specification.  */
9298               gas_assert (args[1] == 'b');
9299               if (*s == '\0')
9300                 return;
9301
9302             case ')':           /* These must match exactly.  */
9303             case '[':
9304             case ']':
9305               if (*s++ == *args)
9306                 continue;
9307               break;
9308
9309             case '+':           /* Opcode extension character.  */
9310               switch (*++args)
9311                 {
9312                 case '1':       /* UDI immediates.  */
9313                 case '2':
9314                 case '3':
9315                 case '4':
9316                   {
9317                     const struct mips_immed *imm = mips_immed;
9318
9319                     while (imm->type && imm->type != *args)
9320                       ++imm;
9321                     if (! imm->type)
9322                       internalError ();
9323                     my_getExpression (&imm_expr, s);
9324                     check_absolute_expr (ip, &imm_expr);
9325                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9326                       {
9327                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9328                                  imm->desc ? imm->desc : ip->insn_mo->name,
9329                                  (unsigned long) imm_expr.X_add_number,
9330                                  (unsigned long) imm_expr.X_add_number);
9331                         imm_expr.X_add_number &= imm->mask;
9332                       }
9333                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9334                                         << imm->shift);
9335                     imm_expr.X_op = O_absent;
9336                     s = expr_end;
9337                   }
9338                   continue;
9339
9340                 case 'A':               /* ins/ext position, becomes LSB.  */
9341                   limlo = 0;
9342                   limhi = 31;
9343                   goto do_lsb;
9344                 case 'E':
9345                   limlo = 32;
9346                   limhi = 63;
9347                   goto do_lsb;
9348                 do_lsb:
9349                   my_getExpression (&imm_expr, s);
9350                   check_absolute_expr (ip, &imm_expr);
9351                   if ((unsigned long) imm_expr.X_add_number < limlo
9352                       || (unsigned long) imm_expr.X_add_number > limhi)
9353                     {
9354                       as_bad (_("Improper position (%lu)"),
9355                               (unsigned long) imm_expr.X_add_number);
9356                       imm_expr.X_add_number = limlo;
9357                     }
9358                   lastpos = imm_expr.X_add_number;
9359                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9360                   imm_expr.X_op = O_absent;
9361                   s = expr_end;
9362                   continue;
9363
9364                 case 'B':               /* ins size, becomes MSB.  */
9365                   limlo = 1;
9366                   limhi = 32;
9367                   goto do_msb;
9368                 case 'F':
9369                   limlo = 33;
9370                   limhi = 64;
9371                   goto do_msb;
9372                 do_msb:
9373                   my_getExpression (&imm_expr, s);
9374                   check_absolute_expr (ip, &imm_expr);
9375                   /* Check for negative input so that small negative numbers
9376                      will not succeed incorrectly.  The checks against
9377                      (pos+size) transitively check "size" itself,
9378                      assuming that "pos" is reasonable.  */
9379                   if ((long) imm_expr.X_add_number < 0
9380                       || ((unsigned long) imm_expr.X_add_number
9381                           + lastpos) < limlo
9382                       || ((unsigned long) imm_expr.X_add_number
9383                           + lastpos) > limhi)
9384                     {
9385                       as_bad (_("Improper insert size (%lu, position %lu)"),
9386                               (unsigned long) imm_expr.X_add_number,
9387                               (unsigned long) lastpos);
9388                       imm_expr.X_add_number = limlo - lastpos;
9389                     }
9390                   INSERT_OPERAND (INSMSB, *ip,
9391                                  lastpos + imm_expr.X_add_number - 1);
9392                   imm_expr.X_op = O_absent;
9393                   s = expr_end;
9394                   continue;
9395
9396                 case 'C':               /* ext size, becomes MSBD.  */
9397                   limlo = 1;
9398                   limhi = 32;
9399                   goto do_msbd;
9400                 case 'G':
9401                   limlo = 33;
9402                   limhi = 64;
9403                   goto do_msbd;
9404                 case 'H':
9405                   limlo = 33;
9406                   limhi = 64;
9407                   goto do_msbd;
9408                 do_msbd:
9409                   my_getExpression (&imm_expr, s);
9410                   check_absolute_expr (ip, &imm_expr);
9411                   /* Check for negative input so that small negative numbers
9412                      will not succeed incorrectly.  The checks against
9413                      (pos+size) transitively check "size" itself,
9414                      assuming that "pos" is reasonable.  */
9415                   if ((long) imm_expr.X_add_number < 0
9416                       || ((unsigned long) imm_expr.X_add_number
9417                           + lastpos) < limlo
9418                       || ((unsigned long) imm_expr.X_add_number
9419                           + lastpos) > limhi)
9420                     {
9421                       as_bad (_("Improper extract size (%lu, position %lu)"),
9422                               (unsigned long) imm_expr.X_add_number,
9423                               (unsigned long) lastpos);
9424                       imm_expr.X_add_number = limlo - lastpos;
9425                     }
9426                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9427                   imm_expr.X_op = O_absent;
9428                   s = expr_end;
9429                   continue;
9430
9431                 case 'D':
9432                   /* +D is for disassembly only; never match.  */
9433                   break;
9434
9435                 case 'I':
9436                   /* "+I" is like "I", except that imm2_expr is used.  */
9437                   my_getExpression (&imm2_expr, s);
9438                   if (imm2_expr.X_op != O_big
9439                       && imm2_expr.X_op != O_constant)
9440                   insn_error = _("absolute expression required");
9441                   if (HAVE_32BIT_GPRS)
9442                     normalize_constant_expr (&imm2_expr);
9443                   s = expr_end;
9444                   continue;
9445
9446                 case 'T': /* Coprocessor register.  */
9447                   /* +T is for disassembly only; never match.  */
9448                   break;
9449
9450                 case 't': /* Coprocessor register number.  */
9451                   if (s[0] == '$' && ISDIGIT (s[1]))
9452                     {
9453                       ++s;
9454                       regno = 0;
9455                       do
9456                         {
9457                           regno *= 10;
9458                           regno += *s - '0';
9459                           ++s;
9460                         }
9461                       while (ISDIGIT (*s));
9462                       if (regno > 31)
9463                         as_bad (_("Invalid register number (%d)"), regno);
9464                       else
9465                         {
9466                           INSERT_OPERAND (RT, *ip, regno);
9467                           continue;
9468                         }
9469                     }
9470                   else
9471                     as_bad (_("Invalid coprocessor 0 register number"));
9472                   break;
9473
9474                 case 'x':
9475                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9476                      is not in the valid range.  */
9477                   my_getExpression (&imm_expr, s);
9478                   check_absolute_expr (ip, &imm_expr);
9479                   if ((unsigned) imm_expr.X_add_number > 31)
9480                     {
9481                       as_bad (_("Improper bit index (%lu)"),
9482                               (unsigned long) imm_expr.X_add_number);
9483                       imm_expr.X_add_number = 0;
9484                     }
9485                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9486                   imm_expr.X_op = O_absent;
9487                   s = expr_end;
9488                   continue;
9489
9490                 case 'X':
9491                   /* bbit[01] bit index when bbit is used but we generate
9492                      bbit[01]32 because the index is over 32.  Move to the
9493                      next candidate if index is not in the valid range.  */
9494                   my_getExpression (&imm_expr, s);
9495                   check_absolute_expr (ip, &imm_expr);
9496                   if ((unsigned) imm_expr.X_add_number < 32
9497                       || (unsigned) imm_expr.X_add_number > 63)
9498                     break;
9499                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9500                   imm_expr.X_op = O_absent;
9501                   s = expr_end;
9502                   continue;
9503
9504                 case 'p':
9505                   /* cins, cins32, exts and exts32 position field.  Give error
9506                      if it's not in the valid range.  */
9507                   my_getExpression (&imm_expr, s);
9508                   check_absolute_expr (ip, &imm_expr);
9509                   if ((unsigned) imm_expr.X_add_number > 31)
9510                     {
9511                       as_bad (_("Improper position (%lu)"),
9512                               (unsigned long) imm_expr.X_add_number);
9513                       imm_expr.X_add_number = 0;
9514                     }
9515                   /* Make the pos explicit to simplify +S.  */
9516                   lastpos = imm_expr.X_add_number + 32;
9517                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9518                   imm_expr.X_op = O_absent;
9519                   s = expr_end;
9520                   continue;
9521
9522                 case 'P':
9523                   /* cins, cins32, exts and exts32 position field.  Move to
9524                      the next candidate if it's not in the valid range.  */
9525                   my_getExpression (&imm_expr, s);
9526                   check_absolute_expr (ip, &imm_expr);
9527                   if ((unsigned) imm_expr.X_add_number < 32
9528                       || (unsigned) imm_expr.X_add_number > 63)
9529                     break;
9530                   lastpos = imm_expr.X_add_number;
9531                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9532                   imm_expr.X_op = O_absent;
9533                   s = expr_end;
9534                   continue;
9535
9536                 case 's':
9537                   /* cins and exts length-minus-one field.  */
9538                   my_getExpression (&imm_expr, s);
9539                   check_absolute_expr (ip, &imm_expr);
9540                   if ((unsigned long) imm_expr.X_add_number > 31)
9541                     {
9542                       as_bad (_("Improper size (%lu)"),
9543                               (unsigned long) imm_expr.X_add_number);
9544                       imm_expr.X_add_number = 0;
9545                     }
9546                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9547                   imm_expr.X_op = O_absent;
9548                   s = expr_end;
9549                   continue;
9550
9551                 case 'S':
9552                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9553                      length-minus-one field.  */
9554                   my_getExpression (&imm_expr, s);
9555                   check_absolute_expr (ip, &imm_expr);
9556                   if ((long) imm_expr.X_add_number < 0
9557                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9558                     {
9559                       as_bad (_("Improper size (%lu)"),
9560                               (unsigned long) imm_expr.X_add_number);
9561                       imm_expr.X_add_number = 0;
9562                     }
9563                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9564                   imm_expr.X_op = O_absent;
9565                   s = expr_end;
9566                   continue;
9567
9568                 case 'Q':
9569                   /* seqi/snei immediate field.  */
9570                   my_getExpression (&imm_expr, s);
9571                   check_absolute_expr (ip, &imm_expr);
9572                   if ((long) imm_expr.X_add_number < -512
9573                       || (long) imm_expr.X_add_number >= 512)
9574                     {
9575                       as_bad (_("Improper immediate (%ld)"),
9576                                (long) imm_expr.X_add_number);
9577                       imm_expr.X_add_number = 0;
9578                     }
9579                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9580                   imm_expr.X_op = O_absent;
9581                   s = expr_end;
9582                   continue;
9583
9584                 case 'a': /* 8-bit signed offset in bit 6 */
9585                   my_getExpression (&imm_expr, s);
9586                   check_absolute_expr (ip, &imm_expr);
9587                   min_range = -((OP_MASK_OFFSET_A + 1) >> 1);
9588                   max_range = ((OP_MASK_OFFSET_A + 1) >> 1) - 1;
9589                   if (imm_expr.X_add_number < min_range
9590                       || imm_expr.X_add_number > max_range)
9591                     {
9592                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
9593                               (long) min_range, (long) max_range,
9594                               (long) imm_expr.X_add_number);
9595                     }
9596                   INSERT_OPERAND (OFFSET_A, *ip, imm_expr.X_add_number);
9597                   imm_expr.X_op = O_absent;
9598                   s = expr_end;
9599                   continue;
9600
9601                 case 'b': /* 8-bit signed offset in bit 3 */
9602                   my_getExpression (&imm_expr, s);
9603                   check_absolute_expr (ip, &imm_expr);
9604                   min_range = -((OP_MASK_OFFSET_B + 1) >> 1);
9605                   max_range = ((OP_MASK_OFFSET_B + 1) >> 1) - 1;
9606                   if (imm_expr.X_add_number < min_range
9607                       || imm_expr.X_add_number > max_range)
9608                     {
9609                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
9610                               (long) min_range, (long) max_range,
9611                               (long) imm_expr.X_add_number);
9612                     }
9613                   INSERT_OPERAND (OFFSET_B, *ip, imm_expr.X_add_number);
9614                   imm_expr.X_op = O_absent;
9615                   s = expr_end;
9616                   continue;
9617
9618                 case 'c': /* 9-bit signed offset in bit 6 */
9619                   my_getExpression (&imm_expr, s);
9620                   check_absolute_expr (ip, &imm_expr);
9621                   min_range = -((OP_MASK_OFFSET_C + 1) >> 1);
9622                   max_range = ((OP_MASK_OFFSET_C + 1) >> 1) - 1;
9623                   /* We check the offset range before adjusted.  */
9624                   min_range <<= 4;
9625                   max_range <<= 4;
9626                   if (imm_expr.X_add_number < min_range
9627                       || imm_expr.X_add_number > max_range)
9628                     {
9629                       as_bad (_("Offset not in range %ld..%ld (%ld)"),
9630                               (long) min_range, (long) max_range,
9631                               (long) imm_expr.X_add_number);
9632                     }
9633                   if (imm_expr.X_add_number & 0xf)
9634                     {
9635                       as_bad (_("Offset not 16 bytes alignment (%ld)"),
9636                               (long) imm_expr.X_add_number);
9637                     }
9638                   /* Right shift 4 bits to adjust the offset operand.  */
9639                   INSERT_OPERAND (OFFSET_C, *ip, imm_expr.X_add_number >> 4);
9640                   imm_expr.X_op = O_absent;
9641                   s = expr_end;
9642                   continue;
9643
9644                 case 'z':
9645                   if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
9646                     break;
9647                   if (regno == AT && mips_opts.at)
9648                     {
9649                       if (mips_opts.at == ATREG)
9650                         as_warn (_("used $at without \".set noat\""));
9651                       else
9652                         as_warn (_("used $%u with \".set at=$%u\""),
9653                                  regno, mips_opts.at);
9654                     }
9655                   INSERT_OPERAND (RZ, *ip, regno);
9656                   continue;
9657
9658                 case 'Z':
9659                   if (!reg_lookup (&s, RTYPE_FPU, &regno))
9660                     break;
9661                   INSERT_OPERAND (FZ, *ip, regno);
9662                   continue;
9663
9664                 default:
9665                   as_bad (_("Internal error: bad mips opcode "
9666                             "(unknown extension operand type `+%c'): %s %s"),
9667                           *args, insn->name, insn->args);
9668                   /* Further processing is fruitless.  */
9669                   return;
9670                 }
9671               break;
9672
9673             case '<':           /* must be at least one digit */
9674               /*
9675                * According to the manual, if the shift amount is greater
9676                * than 31 or less than 0, then the shift amount should be
9677                * mod 32.  In reality the mips assembler issues an error.
9678                * We issue a warning and mask out all but the low 5 bits.
9679                */
9680               my_getExpression (&imm_expr, s);
9681               check_absolute_expr (ip, &imm_expr);
9682               if ((unsigned long) imm_expr.X_add_number > 31)
9683                 as_warn (_("Improper shift amount (%lu)"),
9684                          (unsigned long) imm_expr.X_add_number);
9685               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9686               imm_expr.X_op = O_absent;
9687               s = expr_end;
9688               continue;
9689
9690             case '>':           /* shift amount minus 32 */
9691               my_getExpression (&imm_expr, s);
9692               check_absolute_expr (ip, &imm_expr);
9693               if ((unsigned long) imm_expr.X_add_number < 32
9694                   || (unsigned long) imm_expr.X_add_number > 63)
9695                 break;
9696               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9697               imm_expr.X_op = O_absent;
9698               s = expr_end;
9699               continue;
9700
9701             case 'k':           /* CACHE code.  */
9702             case 'h':           /* PREFX code.  */
9703             case '1':           /* SYNC type.  */
9704               my_getExpression (&imm_expr, s);
9705               check_absolute_expr (ip, &imm_expr);
9706               if ((unsigned long) imm_expr.X_add_number > 31)
9707                 as_warn (_("Invalid value for `%s' (%lu)"),
9708                          ip->insn_mo->name,
9709                          (unsigned long) imm_expr.X_add_number);
9710               if (*args == 'k')
9711                 {
9712                   if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9713                     switch (imm_expr.X_add_number)
9714                       {
9715                       case 5:
9716                       case 25:
9717                       case 26:
9718                       case 27:
9719                       case 28:
9720                       case 29:
9721                       case 30:
9722                       case 31:  /* These are ok.  */
9723                         break;
9724
9725                       default:  /* The rest must be changed to 28.  */
9726                         imm_expr.X_add_number = 28;
9727                         break;
9728                       }
9729                   INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9730                 }
9731               else if (*args == 'h')
9732                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9733               else
9734                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9735               imm_expr.X_op = O_absent;
9736               s = expr_end;
9737               continue;
9738
9739             case 'c':           /* BREAK code.  */
9740               my_getExpression (&imm_expr, s);
9741               check_absolute_expr (ip, &imm_expr);
9742               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9743                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9744                          ip->insn_mo->name,
9745                          (unsigned long) imm_expr.X_add_number);
9746               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9747               imm_expr.X_op = O_absent;
9748               s = expr_end;
9749               continue;
9750
9751             case 'q':           /* Lower BREAK code.  */
9752               my_getExpression (&imm_expr, s);
9753               check_absolute_expr (ip, &imm_expr);
9754               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9755                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9756                          ip->insn_mo->name,
9757                          (unsigned long) imm_expr.X_add_number);
9758               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9759               imm_expr.X_op = O_absent;
9760               s = expr_end;
9761               continue;
9762
9763             case 'B':           /* 20-bit SYSCALL/BREAK code.  */
9764               my_getExpression (&imm_expr, s);
9765               check_absolute_expr (ip, &imm_expr);
9766               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9767                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9768                          ip->insn_mo->name,
9769                          (unsigned long) imm_expr.X_add_number);
9770               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9771               imm_expr.X_op = O_absent;
9772               s = expr_end;
9773               continue;
9774
9775             case 'C':           /* Coprocessor code.  */
9776               my_getExpression (&imm_expr, s);
9777               check_absolute_expr (ip, &imm_expr);
9778               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9779                 {
9780                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9781                            (unsigned long) imm_expr.X_add_number);
9782                   imm_expr.X_add_number &= OP_MASK_COPZ;
9783                 }
9784               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9785               imm_expr.X_op = O_absent;
9786               s = expr_end;
9787               continue;
9788
9789             case 'J':           /* 19-bit WAIT code.  */
9790               my_getExpression (&imm_expr, s);
9791               check_absolute_expr (ip, &imm_expr);
9792               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9793                 {
9794                   as_warn (_("Illegal 19-bit code (%lu)"),
9795                            (unsigned long) imm_expr.X_add_number);
9796                   imm_expr.X_add_number &= OP_MASK_CODE19;
9797                 }
9798               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9799               imm_expr.X_op = O_absent;
9800               s = expr_end;
9801               continue;
9802
9803             case 'P':           /* Performance register.  */
9804               my_getExpression (&imm_expr, s);
9805               check_absolute_expr (ip, &imm_expr);
9806               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9807                 as_warn (_("Invalid performance register (%lu)"),
9808                          (unsigned long) imm_expr.X_add_number);
9809               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9810               imm_expr.X_op = O_absent;
9811               s = expr_end;
9812               continue;
9813
9814             case 'G':           /* Coprocessor destination register.  */
9815               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9816                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9817               else
9818                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9819               INSERT_OPERAND (RD, *ip, regno);
9820               if (ok) 
9821                 {
9822                   lastregno = regno;
9823                   continue;
9824                 }
9825               else
9826                 break;
9827
9828             case 'b':           /* Base register.  */
9829             case 'd':           /* Destination register.  */
9830             case 's':           /* Source register.  */
9831             case 't':           /* Target register.  */
9832             case 'r':           /* Both target and source.  */
9833             case 'v':           /* Both dest and source.  */
9834             case 'w':           /* Both dest and target.  */
9835             case 'E':           /* Coprocessor target register.  */
9836             case 'K':           /* RDHWR destination register.  */
9837             case 'x':           /* Ignore register name.  */
9838             case 'z':           /* Must be zero register.  */
9839             case 'U':           /* Destination register (CLO/CLZ).  */
9840             case 'g':           /* Coprocessor destination register.  */
9841               s_reset = s;
9842               if (*args == 'E' || *args == 'K')
9843                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9844               else
9845                 {
9846                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9847                   if (regno == AT && mips_opts.at)
9848                     {
9849                       if (mips_opts.at == ATREG)
9850                         as_warn (_("Used $at without \".set noat\""));
9851                       else
9852                         as_warn (_("Used $%u with \".set at=$%u\""),
9853                                  regno, mips_opts.at);
9854                     }
9855                 }
9856               if (ok)
9857                 {
9858                   c = *args;
9859                   if (*s == ' ')
9860                     ++s;
9861                   if (args[1] != *s)
9862                     {
9863                       if (c == 'r' || c == 'v' || c == 'w')
9864                         {
9865                           regno = lastregno;
9866                           s = s_reset;
9867                           ++args;
9868                         }
9869                     }
9870                   /* 'z' only matches $0.  */
9871                   if (c == 'z' && regno != 0)
9872                     break;
9873
9874                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9875                     {
9876                       if (regno == lastregno)
9877                         {
9878                           insn_error
9879                             = _("Source and destination must be different");
9880                           continue;
9881                         }
9882                       if (regno == 31 && lastregno == 0xffffffff)
9883                         {
9884                           insn_error
9885                             = _("A destination register must be supplied");
9886                           continue;
9887                         }
9888                     }
9889                   /* Now that we have assembled one operand, we use the args
9890                      string to figure out where it goes in the instruction.  */
9891                   switch (c)
9892                     {
9893                     case 'r':
9894                     case 's':
9895                     case 'v':
9896                     case 'b':
9897                       INSERT_OPERAND (RS, *ip, regno);
9898                       break;
9899                     case 'd':
9900                     case 'K':
9901                     case 'g':
9902                       INSERT_OPERAND (RD, *ip, regno);
9903                       break;
9904                     case 'U':
9905                       INSERT_OPERAND (RD, *ip, regno);
9906                       INSERT_OPERAND (RT, *ip, regno);
9907                       break;
9908                     case 'w':
9909                     case 't':
9910                     case 'E':
9911                       INSERT_OPERAND (RT, *ip, regno);
9912                       break;
9913                     case 'x':
9914                       /* This case exists because on the r3000 trunc
9915                          expands into a macro which requires a gp
9916                          register.  On the r6000 or r4000 it is
9917                          assembled into a single instruction which
9918                          ignores the register.  Thus the insn version
9919                          is MIPS_ISA2 and uses 'x', and the macro
9920                          version is MIPS_ISA1 and uses 't'.  */
9921                       break;
9922                     case 'z':
9923                       /* This case is for the div instruction, which
9924                          acts differently if the destination argument
9925                          is $0.  This only matches $0, and is checked
9926                          outside the switch.  */
9927                       break;
9928                     }
9929                   lastregno = regno;
9930                   continue;
9931                 }
9932               switch (*args++)
9933                 {
9934                 case 'r':
9935                 case 'v':
9936                   INSERT_OPERAND (RS, *ip, lastregno);
9937                   continue;
9938                 case 'w':
9939                   INSERT_OPERAND (RT, *ip, lastregno);
9940                   continue;
9941                 }
9942               break;
9943
9944             case 'O':           /* MDMX alignment immediate constant.  */
9945               my_getExpression (&imm_expr, s);
9946               check_absolute_expr (ip, &imm_expr);
9947               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9948                 as_warn (_("Improper align amount (%ld), using low bits"),
9949                          (long) imm_expr.X_add_number);
9950               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9951               imm_expr.X_op = O_absent;
9952               s = expr_end;
9953               continue;
9954
9955             case 'Q':           /* MDMX vector, element sel, or const.  */
9956               if (s[0] != '$')
9957                 {
9958                   /* MDMX Immediate.  */
9959                   my_getExpression (&imm_expr, s);
9960                   check_absolute_expr (ip, &imm_expr);
9961                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9962                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9963                              (long) imm_expr.X_add_number);
9964                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9965                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9966                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9967                   else
9968                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9969                   imm_expr.X_op = O_absent;
9970                   s = expr_end;
9971                   continue;
9972                 }
9973               /* Not MDMX Immediate.  Fall through.  */
9974             case 'X':           /* MDMX destination register.  */
9975             case 'Y':           /* MDMX source register.  */
9976             case 'Z':           /* MDMX target register.  */
9977               is_mdmx = 1;
9978             case 'D':           /* Floating point destination register.  */
9979             case 'S':           /* Floating point source register.  */
9980             case 'T':           /* Floating point target register.  */
9981             case 'R':           /* Floating point source register.  */
9982             case 'V':
9983             case 'W':
9984               rtype = RTYPE_FPU;
9985               if (is_mdmx
9986                   || (mips_opts.ase_mdmx
9987                       && (ip->insn_mo->pinfo & FP_D)
9988                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9989                                                 | INSN_COPROC_MEMORY_DELAY
9990                                                 | INSN_LOAD_COPROC_DELAY
9991                                                 | INSN_LOAD_MEMORY_DELAY
9992                                                 | INSN_STORE_MEMORY))))
9993                 rtype |= RTYPE_VEC;
9994               s_reset = s;
9995               if (reg_lookup (&s, rtype, &regno))
9996                 {
9997                   if ((regno & 1) != 0
9998                       && HAVE_32BIT_FPRS
9999                       && !mips_oddfpreg_ok (ip->insn_mo, argnum))
10000                     as_warn (_("Float register should be even, was %d"),
10001                              regno);
10002
10003                   c = *args;
10004                   if (*s == ' ')
10005                     ++s;
10006                   if (args[1] != *s)
10007                     {
10008                       if (c == 'V' || c == 'W')
10009                         {
10010                           regno = lastregno;
10011                           s = s_reset;
10012                           ++args;
10013                         }
10014                     }
10015                   switch (c)
10016                     {
10017                     case 'D':
10018                     case 'X':
10019                       INSERT_OPERAND (FD, *ip, regno);
10020                       break;
10021                     case 'V':
10022                     case 'S':
10023                     case 'Y':
10024                       INSERT_OPERAND (FS, *ip, regno);
10025                       break;
10026                     case 'Q':
10027                       /* This is like 'Z', but also needs to fix the MDMX
10028                          vector/scalar select bits.  Note that the
10029                          scalar immediate case is handled above.  */
10030                       if (*s == '[')
10031                         {
10032                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
10033                           int max_el = (is_qh ? 3 : 7);
10034                           s++;
10035                           my_getExpression(&imm_expr, s);
10036                           check_absolute_expr (ip, &imm_expr);
10037                           s = expr_end;
10038                           if (imm_expr.X_add_number > max_el)
10039                             as_bad (_("Bad element selector %ld"),
10040                                     (long) imm_expr.X_add_number);
10041                           imm_expr.X_add_number &= max_el;
10042                           ip->insn_opcode |= (imm_expr.X_add_number
10043                                               << (OP_SH_VSEL +
10044                                                   (is_qh ? 2 : 1)));
10045                           imm_expr.X_op = O_absent;
10046                           if (*s != ']')
10047                             as_warn (_("Expecting ']' found '%s'"), s);
10048                           else
10049                             s++;
10050                         }
10051                       else
10052                         {
10053                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
10054                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
10055                                                 << OP_SH_VSEL);
10056                           else
10057                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
10058                                                 OP_SH_VSEL);
10059                         }
10060                       /* Fall through.  */
10061                     case 'W':
10062                     case 'T':
10063                     case 'Z':
10064                       INSERT_OPERAND (FT, *ip, regno);
10065                       break;
10066                     case 'R':
10067                       INSERT_OPERAND (FR, *ip, regno);
10068                       break;
10069                     }
10070                   lastregno = regno;
10071                   continue;
10072                 }
10073
10074               switch (*args++)
10075                 {
10076                 case 'V':
10077                   INSERT_OPERAND (FS, *ip, lastregno);
10078                   continue;
10079                 case 'W':
10080                   INSERT_OPERAND (FT, *ip, lastregno);
10081                   continue;
10082                 }
10083               break;
10084
10085             case 'I':
10086               my_getExpression (&imm_expr, s);
10087               if (imm_expr.X_op != O_big
10088                   && imm_expr.X_op != O_constant)
10089                 insn_error = _("absolute expression required");
10090               if (HAVE_32BIT_GPRS)
10091                 normalize_constant_expr (&imm_expr);
10092               s = expr_end;
10093               continue;
10094
10095             case 'A':
10096               my_getExpression (&offset_expr, s);
10097               normalize_address_expr (&offset_expr);
10098               *imm_reloc = BFD_RELOC_32;
10099               s = expr_end;
10100               continue;
10101
10102             case 'F':
10103             case 'L':
10104             case 'f':
10105             case 'l':
10106               {
10107                 int f64;
10108                 int using_gprs;
10109                 char *save_in;
10110                 char *err;
10111                 unsigned char temp[8];
10112                 int len;
10113                 unsigned int length;
10114                 segT seg;
10115                 subsegT subseg;
10116                 char *p;
10117
10118                 /* These only appear as the last operand in an
10119                    instruction, and every instruction that accepts
10120                    them in any variant accepts them in all variants.
10121                    This means we don't have to worry about backing out
10122                    any changes if the instruction does not match.
10123
10124                    The difference between them is the size of the
10125                    floating point constant and where it goes.  For 'F'
10126                    and 'L' the constant is 64 bits; for 'f' and 'l' it
10127                    is 32 bits.  Where the constant is placed is based
10128                    on how the MIPS assembler does things:
10129                     F -- .rdata
10130                     L -- .lit8
10131                     f -- immediate value
10132                     l -- .lit4
10133
10134                     The .lit4 and .lit8 sections are only used if
10135                     permitted by the -G argument.
10136
10137                     The code below needs to know whether the target register
10138                     is 32 or 64 bits wide.  It relies on the fact 'f' and
10139                     'F' are used with GPR-based instructions and 'l' and
10140                     'L' are used with FPR-based instructions.  */
10141
10142                 f64 = *args == 'F' || *args == 'L';
10143                 using_gprs = *args == 'F' || *args == 'f';
10144
10145                 save_in = input_line_pointer;
10146                 input_line_pointer = s;
10147                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
10148                 length = len;
10149                 s = input_line_pointer;
10150                 input_line_pointer = save_in;
10151                 if (err != NULL && *err != '\0')
10152                   {
10153                     as_bad (_("Bad floating point constant: %s"), err);
10154                     memset (temp, '\0', sizeof temp);
10155                     length = f64 ? 8 : 4;
10156                   }
10157
10158                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
10159
10160                 if (*args == 'f'
10161                     || (*args == 'l'
10162                         && (g_switch_value < 4
10163                             || (temp[0] == 0 && temp[1] == 0)
10164                             || (temp[2] == 0 && temp[3] == 0))))
10165                   {
10166                     imm_expr.X_op = O_constant;
10167                     if (!target_big_endian)
10168                       imm_expr.X_add_number = bfd_getl32 (temp);
10169                     else
10170                       imm_expr.X_add_number = bfd_getb32 (temp);
10171                   }
10172                 else if (length > 4
10173                          && !mips_disable_float_construction
10174                          /* Constants can only be constructed in GPRs and
10175                             copied to FPRs if the GPRs are at least as wide
10176                             as the FPRs.  Force the constant into memory if
10177                             we are using 64-bit FPRs but the GPRs are only
10178                             32 bits wide.  */
10179                          && (using_gprs
10180                              || !(HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
10181                          && ((temp[0] == 0 && temp[1] == 0)
10182                              || (temp[2] == 0 && temp[3] == 0))
10183                          && ((temp[4] == 0 && temp[5] == 0)
10184                              || (temp[6] == 0 && temp[7] == 0)))
10185                   {
10186                     /* The value is simple enough to load with a couple of
10187                        instructions.  If using 32-bit registers, set
10188                        imm_expr to the high order 32 bits and offset_expr to
10189                        the low order 32 bits.  Otherwise, set imm_expr to
10190                        the entire 64 bit constant.  */
10191                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
10192                       {
10193                         imm_expr.X_op = O_constant;
10194                         offset_expr.X_op = O_constant;
10195                         if (!target_big_endian)
10196                           {
10197                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
10198                             offset_expr.X_add_number = bfd_getl32 (temp);
10199                           }
10200                         else
10201                           {
10202                             imm_expr.X_add_number = bfd_getb32 (temp);
10203                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
10204                           }
10205                         if (offset_expr.X_add_number == 0)
10206                           offset_expr.X_op = O_absent;
10207                       }
10208                     else if (sizeof (imm_expr.X_add_number) > 4)
10209                       {
10210                         imm_expr.X_op = O_constant;
10211                         if (!target_big_endian)
10212                           imm_expr.X_add_number = bfd_getl64 (temp);
10213                         else
10214                           imm_expr.X_add_number = bfd_getb64 (temp);
10215                       }
10216                     else
10217                       {
10218                         imm_expr.X_op = O_big;
10219                         imm_expr.X_add_number = 4;
10220                         if (!target_big_endian)
10221                           {
10222                             generic_bignum[0] = bfd_getl16 (temp);
10223                             generic_bignum[1] = bfd_getl16 (temp + 2);
10224                             generic_bignum[2] = bfd_getl16 (temp + 4);
10225                             generic_bignum[3] = bfd_getl16 (temp + 6);
10226                           }
10227                         else
10228                           {
10229                             generic_bignum[0] = bfd_getb16 (temp + 6);
10230                             generic_bignum[1] = bfd_getb16 (temp + 4);
10231                             generic_bignum[2] = bfd_getb16 (temp + 2);
10232                             generic_bignum[3] = bfd_getb16 (temp);
10233                           }
10234                       }
10235                   }
10236                 else
10237                   {
10238                     const char *newname;
10239                     segT new_seg;
10240
10241                     /* Switch to the right section.  */
10242                     seg = now_seg;
10243                     subseg = now_subseg;
10244                     switch (*args)
10245                       {
10246                       default: /* unused default case avoids warnings.  */
10247                       case 'L':
10248                         newname = RDATA_SECTION_NAME;
10249                         if (g_switch_value >= 8)
10250                           newname = ".lit8";
10251                         break;
10252                       case 'F':
10253                         newname = RDATA_SECTION_NAME;
10254                         break;
10255                       case 'l':
10256                         gas_assert (g_switch_value >= 4);
10257                         newname = ".lit4";
10258                         break;
10259                       }
10260                     new_seg = subseg_new (newname, (subsegT) 0);
10261                     if (IS_ELF)
10262                       bfd_set_section_flags (stdoutput, new_seg,
10263                                              (SEC_ALLOC
10264                                               | SEC_LOAD
10265                                               | SEC_READONLY
10266                                               | SEC_DATA));
10267                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
10268                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
10269                       record_alignment (new_seg, 4);
10270                     else
10271                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
10272                     if (seg == now_seg)
10273                       as_bad (_("Can't use floating point insn in this section"));
10274
10275                     /* Set the argument to the current address in the
10276                        section.  */
10277                     offset_expr.X_op = O_symbol;
10278                     offset_expr.X_add_symbol = symbol_temp_new_now ();
10279                     offset_expr.X_add_number = 0;
10280
10281                     /* Put the floating point number into the section.  */
10282                     p = frag_more ((int) length);
10283                     memcpy (p, temp, length);
10284
10285                     /* Switch back to the original section.  */
10286                     subseg_set (seg, subseg);
10287                   }
10288               }
10289               continue;
10290
10291             case 'i':           /* 16-bit unsigned immediate.  */
10292             case 'j':           /* 16-bit signed immediate.  */
10293               *imm_reloc = BFD_RELOC_LO16;
10294               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
10295                 {
10296                   int more;
10297                   offsetT minval, maxval;
10298
10299                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10300                           && strcmp (insn->name, insn[1].name) == 0);
10301
10302                   /* If the expression was written as an unsigned number,
10303                      only treat it as signed if there are no more
10304                      alternatives.  */
10305                   if (more
10306                       && *args == 'j'
10307                       && sizeof (imm_expr.X_add_number) <= 4
10308                       && imm_expr.X_op == O_constant
10309                       && imm_expr.X_add_number < 0
10310                       && imm_expr.X_unsigned
10311                       && HAVE_64BIT_GPRS)
10312                     break;
10313
10314                   /* For compatibility with older assemblers, we accept
10315                      0x8000-0xffff as signed 16-bit numbers when only
10316                      signed numbers are allowed.  */
10317                   if (*args == 'i')
10318                     minval = 0, maxval = 0xffff;
10319                   else if (more)
10320                     minval = -0x8000, maxval = 0x7fff;
10321                   else
10322                     minval = -0x8000, maxval = 0xffff;
10323
10324                   if (imm_expr.X_op != O_constant
10325                       || imm_expr.X_add_number < minval
10326                       || imm_expr.X_add_number > maxval)
10327                     {
10328                       if (more)
10329                         break;
10330                       if (imm_expr.X_op == O_constant
10331                           || imm_expr.X_op == O_big)
10332                         as_bad (_("Expression out of range"));
10333                     }
10334                 }
10335               s = expr_end;
10336               continue;
10337
10338             case 'o':           /* 16-bit offset.  */
10339               offset_reloc[0] = BFD_RELOC_LO16;
10340               offset_reloc[1] = BFD_RELOC_UNUSED;
10341               offset_reloc[2] = BFD_RELOC_UNUSED;
10342
10343               /* Check whether there is only a single bracketed expression
10344                  left.  If so, it must be the base register and the
10345                  constant must be zero.  */
10346               if (*s == '(' && strchr (s + 1, '(') == 0)
10347                 {
10348                   offset_expr.X_op = O_constant;
10349                   offset_expr.X_add_number = 0;
10350                   continue;
10351                 }
10352
10353               /* If this value won't fit into a 16 bit offset, then go
10354                  find a macro that will generate the 32 bit offset
10355                  code pattern.  */
10356               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10357                   && (offset_expr.X_op != O_constant
10358                       || offset_expr.X_add_number >= 0x8000
10359                       || offset_expr.X_add_number < -0x8000))
10360                 break;
10361
10362               s = expr_end;
10363               continue;
10364
10365             case 'p':           /* PC-relative offset.  */
10366               *offset_reloc = BFD_RELOC_16_PCREL_S2;
10367               my_getExpression (&offset_expr, s);
10368               s = expr_end;
10369               continue;
10370
10371             case 'u':           /* Upper 16 bits.  */
10372               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10373                   && imm_expr.X_op == O_constant
10374                   && (imm_expr.X_add_number < 0
10375                       || imm_expr.X_add_number >= 0x10000))
10376                 as_bad (_("lui expression (%lu) not in range 0..65535"),
10377                         (unsigned long) imm_expr.X_add_number);
10378               s = expr_end;
10379               continue;
10380
10381             case 'a':           /* 26-bit address.  */
10382               my_getExpression (&offset_expr, s);
10383               s = expr_end;
10384               *offset_reloc = BFD_RELOC_MIPS_JMP;
10385               continue;
10386
10387             case 'N':           /* 3-bit branch condition code.  */
10388             case 'M':           /* 3-bit compare condition code.  */
10389               rtype = RTYPE_CCC;
10390               if (ip->insn_mo->pinfo & (FP_D | FP_S))
10391                 rtype |= RTYPE_FCC;
10392               if (!reg_lookup (&s, rtype, &regno))
10393                 break;
10394               if ((strcmp (str + strlen (str) - 3, ".ps") == 0
10395                    || strcmp (str + strlen (str) - 5, "any2f") == 0
10396                    || strcmp (str + strlen (str) - 5, "any2t") == 0)
10397                   && (regno & 1) != 0)
10398                 as_warn (_("Condition code register should be even for %s, "
10399                            "was %d"),
10400                          str, regno);
10401               if ((strcmp (str + strlen (str) - 5, "any4f") == 0
10402                    || strcmp (str + strlen (str) - 5, "any4t") == 0)
10403                   && (regno & 3) != 0)
10404                 as_warn (_("Condition code register should be 0 or 4 for %s, "
10405                            "was %d"),
10406                          str, regno);
10407               if (*args == 'N')
10408                 INSERT_OPERAND (BCC, *ip, regno);
10409               else
10410                 INSERT_OPERAND (CCC, *ip, regno);
10411               continue;
10412
10413             case 'H':
10414               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10415                 s += 2;
10416               if (ISDIGIT (*s))
10417                 {
10418                   c = 0;
10419                   do
10420                     {
10421                       c *= 10;
10422                       c += *s - '0';
10423                       ++s;
10424                     }
10425                   while (ISDIGIT (*s));
10426                 }
10427               else
10428                 c = 8; /* Invalid sel value.  */
10429
10430               if (c > 7)
10431                 as_bad (_("Invalid coprocessor sub-selection value (0-7)"));
10432               ip->insn_opcode |= c;
10433               continue;
10434
10435             case 'e':
10436               /* Must be at least one digit.  */
10437               my_getExpression (&imm_expr, s);
10438               check_absolute_expr (ip, &imm_expr);
10439
10440               if ((unsigned long) imm_expr.X_add_number
10441                   > (unsigned long) OP_MASK_VECBYTE)
10442                 {
10443                   as_bad (_("bad byte vector index (%ld)"),
10444                            (long) imm_expr.X_add_number);
10445                   imm_expr.X_add_number = 0;
10446                 }
10447
10448               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10449               imm_expr.X_op = O_absent;
10450               s = expr_end;
10451               continue;
10452
10453             case '%':
10454               my_getExpression (&imm_expr, s);
10455               check_absolute_expr (ip, &imm_expr);
10456
10457               if ((unsigned long) imm_expr.X_add_number
10458                   > (unsigned long) OP_MASK_VECALIGN)
10459                 {
10460                   as_bad (_("bad byte vector index (%ld)"),
10461                            (long) imm_expr.X_add_number);
10462                   imm_expr.X_add_number = 0;
10463                 }
10464
10465               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10466               imm_expr.X_op = O_absent;
10467               s = expr_end;
10468               continue;
10469
10470             default:
10471               as_bad (_("Bad char = '%c'\n"), *args);
10472               internalError ();
10473             }
10474           break;
10475         }
10476       /* Args don't match.  */
10477       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10478           !strcmp (insn->name, insn[1].name))
10479         {
10480           ++insn;
10481           s = argsStart;
10482           insn_error = _("Illegal operands");
10483           continue;
10484         }
10485       if (save_c)
10486         *(--argsStart) = save_c;
10487       insn_error = _("Illegal operands");
10488       return;
10489     }
10490 }
10491
10492 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10493
10494 /* This routine assembles an instruction into its binary format when
10495    assembling for the mips16.  As a side effect, it sets one of the
10496    global variables imm_reloc or offset_reloc to the type of
10497    relocation to do if one of the operands is an address expression.
10498    It also sets mips16_small and mips16_ext if the user explicitly
10499    requested a small or extended instruction.  */
10500
10501 static void
10502 mips16_ip (char *str, struct mips_cl_insn *ip)
10503 {
10504   char *s;
10505   const char *args;
10506   struct mips_opcode *insn;
10507   char *argsstart;
10508   unsigned int regno;
10509   unsigned int lastregno = 0;
10510   char *s_reset;
10511   size_t i;
10512
10513   insn_error = NULL;
10514
10515   mips16_small = FALSE;
10516   mips16_ext = FALSE;
10517
10518   for (s = str; ISLOWER (*s); ++s)
10519     ;
10520   switch (*s)
10521     {
10522     case '\0':
10523       break;
10524
10525     case ' ':
10526       *s++ = '\0';
10527       break;
10528
10529     case '.':
10530       if (s[1] == 't' && s[2] == ' ')
10531         {
10532           *s = '\0';
10533           mips16_small = TRUE;
10534           s += 3;
10535           break;
10536         }
10537       else if (s[1] == 'e' && s[2] == ' ')
10538         {
10539           *s = '\0';
10540           mips16_ext = TRUE;
10541           s += 3;
10542           break;
10543         }
10544       /* Fall through.  */
10545     default:
10546       insn_error = _("unknown opcode");
10547       return;
10548     }
10549
10550   if (mips_opts.noautoextend && ! mips16_ext)
10551     mips16_small = TRUE;
10552
10553   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10554     {
10555       insn_error = _("unrecognized opcode");
10556       return;
10557     }
10558
10559   argsstart = s;
10560   for (;;)
10561     {
10562       bfd_boolean ok;
10563
10564       gas_assert (strcmp (insn->name, str) == 0);
10565
10566       ok = is_opcode_valid_16 (insn);
10567       if (! ok)
10568         {
10569           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10570               && strcmp (insn->name, insn[1].name) == 0)
10571             {
10572               ++insn;
10573               continue;
10574             }
10575           else
10576             {
10577               if (!insn_error)
10578                 {
10579                   static char buf[100];
10580                   sprintf (buf,
10581                            _("opcode not supported on this processor: %s (%s)"),
10582                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10583                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10584                   insn_error = buf;
10585                 }
10586               return;
10587             }
10588         }
10589
10590       create_insn (ip, insn);
10591       imm_expr.X_op = O_absent;
10592       imm_reloc[0] = BFD_RELOC_UNUSED;
10593       imm_reloc[1] = BFD_RELOC_UNUSED;
10594       imm_reloc[2] = BFD_RELOC_UNUSED;
10595       imm2_expr.X_op = O_absent;
10596       offset_expr.X_op = O_absent;
10597       offset_reloc[0] = BFD_RELOC_UNUSED;
10598       offset_reloc[1] = BFD_RELOC_UNUSED;
10599       offset_reloc[2] = BFD_RELOC_UNUSED;
10600       for (args = insn->args; 1; ++args)
10601         {
10602           int c;
10603
10604           if (*s == ' ')
10605             ++s;
10606
10607           /* In this switch statement we call break if we did not find
10608              a match, continue if we did find a match, or return if we
10609              are done.  */
10610
10611           c = *args;
10612           switch (c)
10613             {
10614             case '\0':
10615               if (*s == '\0')
10616                 {
10617                   /* Stuff the immediate value in now, if we can.  */
10618                   if (imm_expr.X_op == O_constant
10619                       && *imm_reloc > BFD_RELOC_UNUSED
10620                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10621                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10622                       && insn->pinfo != INSN_MACRO)
10623                     {
10624                       valueT tmp;
10625
10626                       switch (*offset_reloc)
10627                         {
10628                           case BFD_RELOC_MIPS16_HI16_S:
10629                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10630                             break;
10631
10632                           case BFD_RELOC_MIPS16_HI16:
10633                             tmp = imm_expr.X_add_number >> 16;
10634                             break;
10635
10636                           case BFD_RELOC_MIPS16_LO16:
10637                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10638                                   - 0x8000;
10639                             break;
10640
10641                           case BFD_RELOC_UNUSED:
10642                             tmp = imm_expr.X_add_number;
10643                             break;
10644
10645                           default:
10646                             internalError ();
10647                         }
10648                       *offset_reloc = BFD_RELOC_UNUSED;
10649
10650                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10651                                     tmp, TRUE, mips16_small,
10652                                     mips16_ext, &ip->insn_opcode,
10653                                     &ip->use_extend, &ip->extend);
10654                       imm_expr.X_op = O_absent;
10655                       *imm_reloc = BFD_RELOC_UNUSED;
10656                     }
10657
10658                   return;
10659                 }
10660               break;
10661
10662             case ',':
10663               if (*s++ == c)
10664                 continue;
10665               s--;
10666               switch (*++args)
10667                 {
10668                 case 'v':
10669                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10670                   continue;
10671                 case 'w':
10672                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10673                   continue;
10674                 }
10675               break;
10676
10677             case '(':
10678             case ')':
10679               if (*s++ == c)
10680                 continue;
10681               break;
10682
10683             case 'v':
10684             case 'w':
10685               if (s[0] != '$')
10686                 {
10687                   if (c == 'v')
10688                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10689                   else
10690                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10691                   ++args;
10692                   continue;
10693                 }
10694               /* Fall through.  */
10695             case 'x':
10696             case 'y':
10697             case 'z':
10698             case 'Z':
10699             case '0':
10700             case 'S':
10701             case 'R':
10702             case 'X':
10703             case 'Y':
10704               s_reset = s;
10705               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10706                 {
10707                   if (c == 'v' || c == 'w')
10708                     {
10709                       if (c == 'v')
10710                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10711                       else
10712                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10713                       ++args;
10714                       continue;
10715                     }
10716                   break;
10717                 }
10718
10719               if (*s == ' ')
10720                 ++s;
10721               if (args[1] != *s)
10722                 {
10723                   if (c == 'v' || c == 'w')
10724                     {
10725                       regno = mips16_to_32_reg_map[lastregno];
10726                       s = s_reset;
10727                       ++args;
10728                     }
10729                 }
10730
10731               switch (c)
10732                 {
10733                 case 'x':
10734                 case 'y':
10735                 case 'z':
10736                 case 'v':
10737                 case 'w':
10738                 case 'Z':
10739                   regno = mips32_to_16_reg_map[regno];
10740                   break;
10741
10742                 case '0':
10743                   if (regno != 0)
10744                     regno = ILLEGAL_REG;
10745                   break;
10746
10747                 case 'S':
10748                   if (regno != SP)
10749                     regno = ILLEGAL_REG;
10750                   break;
10751
10752                 case 'R':
10753                   if (regno != RA)
10754                     regno = ILLEGAL_REG;
10755                   break;
10756
10757                 case 'X':
10758                 case 'Y':
10759                   if (regno == AT && mips_opts.at)
10760                     {
10761                       if (mips_opts.at == ATREG)
10762                         as_warn (_("used $at without \".set noat\""));
10763                       else
10764                         as_warn (_("used $%u with \".set at=$%u\""),
10765                                  regno, mips_opts.at);
10766                     }
10767                   break;
10768
10769                 default:
10770                   internalError ();
10771                 }
10772
10773               if (regno == ILLEGAL_REG)
10774                 break;
10775
10776               switch (c)
10777                 {
10778                 case 'x':
10779                 case 'v':
10780                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10781                   break;
10782                 case 'y':
10783                 case 'w':
10784                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10785                   break;
10786                 case 'z':
10787                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10788                   break;
10789                 case 'Z':
10790                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10791                 case '0':
10792                 case 'S':
10793                 case 'R':
10794                   break;
10795                 case 'X':
10796                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10797                   break;
10798                 case 'Y':
10799                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10800                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10801                   break;
10802                 default:
10803                   internalError ();
10804                 }
10805
10806               lastregno = regno;
10807               continue;
10808
10809             case 'P':
10810               if (strncmp (s, "$pc", 3) == 0)
10811                 {
10812                   s += 3;
10813                   continue;
10814                 }
10815               break;
10816
10817             case '5':
10818             case 'H':
10819             case 'W':
10820             case 'D':
10821             case 'j':
10822             case 'V':
10823             case 'C':
10824             case 'U':
10825             case 'k':
10826             case 'K':
10827               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10828               if (i > 0)
10829                 {
10830                   if (imm_expr.X_op != O_constant)
10831                     {
10832                       mips16_ext = TRUE;
10833                       ip->use_extend = TRUE;
10834                       ip->extend = 0;
10835                     }
10836                   else
10837                     {
10838                       /* We need to relax this instruction.  */
10839                       *offset_reloc = *imm_reloc;
10840                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10841                     }
10842                   s = expr_end;
10843                   continue;
10844                 }
10845               *imm_reloc = BFD_RELOC_UNUSED;
10846               /* Fall through.  */
10847             case '<':
10848             case '>':
10849             case '[':
10850             case ']':
10851             case '4':
10852             case '8':
10853               my_getExpression (&imm_expr, s);
10854               if (imm_expr.X_op == O_register)
10855                 {
10856                   /* What we thought was an expression turned out to
10857                      be a register.  */
10858
10859                   if (s[0] == '(' && args[1] == '(')
10860                     {
10861                       /* It looks like the expression was omitted
10862                          before a register indirection, which means
10863                          that the expression is implicitly zero.  We
10864                          still set up imm_expr, so that we handle
10865                          explicit extensions correctly.  */
10866                       imm_expr.X_op = O_constant;
10867                       imm_expr.X_add_number = 0;
10868                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10869                       continue;
10870                     }
10871
10872                   break;
10873                 }
10874
10875               /* We need to relax this instruction.  */
10876               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10877               s = expr_end;
10878               continue;
10879
10880             case 'p':
10881             case 'q':
10882             case 'A':
10883             case 'B':
10884             case 'E':
10885               /* We use offset_reloc rather than imm_reloc for the PC
10886                  relative operands.  This lets macros with both
10887                  immediate and address operands work correctly.  */
10888               my_getExpression (&offset_expr, s);
10889
10890               if (offset_expr.X_op == O_register)
10891                 break;
10892
10893               /* We need to relax this instruction.  */
10894               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10895               s = expr_end;
10896               continue;
10897
10898             case '6':           /* break code */
10899               my_getExpression (&imm_expr, s);
10900               check_absolute_expr (ip, &imm_expr);
10901               if ((unsigned long) imm_expr.X_add_number > 63)
10902                 as_warn (_("Invalid value for `%s' (%lu)"),
10903                          ip->insn_mo->name,
10904                          (unsigned long) imm_expr.X_add_number);
10905               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10906               imm_expr.X_op = O_absent;
10907               s = expr_end;
10908               continue;
10909
10910             case 'a':           /* 26 bit address */
10911               my_getExpression (&offset_expr, s);
10912               s = expr_end;
10913               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10914               ip->insn_opcode <<= 16;
10915               continue;
10916
10917             case 'l':           /* register list for entry macro */
10918             case 'L':           /* register list for exit macro */
10919               {
10920                 int mask;
10921
10922                 if (c == 'l')
10923                   mask = 0;
10924                 else
10925                   mask = 7 << 3;
10926                 while (*s != '\0')
10927                   {
10928                     unsigned int freg, reg1, reg2;
10929
10930                     while (*s == ' ' || *s == ',')
10931                       ++s;
10932                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10933                       freg = 0;
10934                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10935                       freg = 1;
10936                     else
10937                       {
10938                         as_bad (_("can't parse register list"));
10939                         break;
10940                       }
10941                     if (*s == ' ')
10942                       ++s;
10943                     if (*s != '-')
10944                       reg2 = reg1;
10945                     else
10946                       {
10947                         ++s;
10948                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10949                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10950                           {
10951                             as_bad (_("invalid register list"));
10952                             break;
10953                           }
10954                       }
10955                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10956                       {
10957                         mask &= ~ (7 << 3);
10958                         mask |= 5 << 3;
10959                       }
10960                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10961                       {
10962                         mask &= ~ (7 << 3);
10963                         mask |= 6 << 3;
10964                       }
10965                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10966                       mask |= (reg2 - 3) << 3;
10967                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10968                       mask |= (reg2 - 15) << 1;
10969                     else if (reg1 == RA && reg2 == RA)
10970                       mask |= 1;
10971                     else
10972                       {
10973                         as_bad (_("invalid register list"));
10974                         break;
10975                       }
10976                   }
10977                 /* The mask is filled in in the opcode table for the
10978                    benefit of the disassembler.  We remove it before
10979                    applying the actual mask.  */
10980                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10981                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10982               }
10983             continue;
10984
10985             case 'm':           /* Register list for save insn.  */
10986             case 'M':           /* Register list for restore insn.  */
10987               {
10988                 int opcode = 0;
10989                 int framesz = 0, seen_framesz = 0;
10990                 int nargs = 0, statics = 0, sregs = 0;
10991
10992                 while (*s != '\0')
10993                   {
10994                     unsigned int reg1, reg2;
10995
10996                     SKIP_SPACE_TABS (s);
10997                     while (*s == ',')
10998                       ++s;
10999                     SKIP_SPACE_TABS (s);
11000
11001                     my_getExpression (&imm_expr, s);
11002                     if (imm_expr.X_op == O_constant)
11003                       {
11004                         /* Handle the frame size.  */
11005                         if (seen_framesz)
11006                           {
11007                             as_bad (_("more than one frame size in list"));
11008                             break;
11009                           }
11010                         seen_framesz = 1;
11011                         framesz = imm_expr.X_add_number;
11012                         imm_expr.X_op = O_absent;
11013                         s = expr_end;
11014                         continue;
11015                       }
11016
11017                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
11018                       {
11019                         as_bad (_("can't parse register list"));
11020                         break;
11021                       }
11022
11023                     while (*s == ' ')
11024                       ++s;
11025
11026                     if (*s != '-')
11027                       reg2 = reg1;
11028                     else
11029                       {
11030                         ++s;
11031                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
11032                             || reg2 < reg1)
11033                           {
11034                             as_bad (_("can't parse register list"));
11035                             break;
11036                           }
11037                       }
11038
11039                     while (reg1 <= reg2)
11040                       {
11041                         if (reg1 >= 4 && reg1 <= 7)
11042                           {
11043                             if (!seen_framesz)
11044                                 /* args $a0-$a3 */
11045                                 nargs |= 1 << (reg1 - 4);
11046                             else
11047                                 /* statics $a0-$a3 */
11048                                 statics |= 1 << (reg1 - 4);
11049                           }
11050                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
11051                           {
11052                             /* $s0-$s8 */
11053                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
11054                           }
11055                         else if (reg1 == 31)
11056                           {
11057                             /* Add $ra to insn.  */
11058                             opcode |= 0x40;
11059                           }
11060                         else
11061                           {
11062                             as_bad (_("unexpected register in list"));
11063                             break;
11064                           }
11065                         if (++reg1 == 24)
11066                           reg1 = 30;
11067                       }
11068                   }
11069
11070                 /* Encode args/statics combination.  */
11071                 if (nargs & statics)
11072                   as_bad (_("arg/static registers overlap"));
11073                 else if (nargs == 0xf)
11074                   /* All $a0-$a3 are args.  */
11075                   opcode |= MIPS16_ALL_ARGS << 16;
11076                 else if (statics == 0xf)
11077                   /* All $a0-$a3 are statics.  */
11078                   opcode |= MIPS16_ALL_STATICS << 16;
11079                 else 
11080                   {
11081                     int narg = 0, nstat = 0;
11082
11083                     /* Count arg registers.  */
11084                     while (nargs & 0x1)
11085                       {
11086                         nargs >>= 1;
11087                         narg++;
11088                       }
11089                     if (nargs != 0)
11090                       as_bad (_("invalid arg register list"));
11091
11092                     /* Count static registers.  */
11093                     while (statics & 0x8)
11094                       {
11095                         statics = (statics << 1) & 0xf;
11096                         nstat++;
11097                       }
11098                     if (statics != 0) 
11099                       as_bad (_("invalid static register list"));
11100
11101                     /* Encode args/statics.  */
11102                     opcode |= ((narg << 2) | nstat) << 16;
11103                   }
11104
11105                 /* Encode $s0/$s1.  */
11106                 if (sregs & (1 << 0))           /* $s0 */
11107                   opcode |= 0x20;
11108                 if (sregs & (1 << 1))           /* $s1 */
11109                   opcode |= 0x10;
11110                 sregs >>= 2;
11111
11112                 if (sregs != 0)
11113                   {
11114                     /* Count regs $s2-$s8.  */
11115                     int nsreg = 0;
11116                     while (sregs & 1)
11117                       {
11118                         sregs >>= 1;
11119                         nsreg++;
11120                       }
11121                     if (sregs != 0)
11122                       as_bad (_("invalid static register list"));
11123                     /* Encode $s2-$s8. */
11124                     opcode |= nsreg << 24;
11125                   }
11126
11127                 /* Encode frame size.  */
11128                 if (!seen_framesz)
11129                   as_bad (_("missing frame size"));
11130                 else if ((framesz & 7) != 0 || framesz < 0
11131                          || framesz > 0xff * 8)
11132                   as_bad (_("invalid frame size"));
11133                 else if (framesz != 128 || (opcode >> 16) != 0)
11134                   {
11135                     framesz /= 8;
11136                     opcode |= (((framesz & 0xf0) << 16)
11137                              | (framesz & 0x0f));
11138                   }
11139
11140                 /* Finally build the instruction.  */
11141                 if ((opcode >> 16) != 0 || framesz == 0)
11142                   {
11143                     ip->use_extend = TRUE;
11144                     ip->extend = opcode >> 16;
11145                   }
11146                 ip->insn_opcode |= opcode & 0x7f;
11147               }
11148             continue;
11149
11150             case 'e':           /* extend code */
11151               my_getExpression (&imm_expr, s);
11152               check_absolute_expr (ip, &imm_expr);
11153               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
11154                 {
11155                   as_warn (_("Invalid value for `%s' (%lu)"),
11156                            ip->insn_mo->name,
11157                            (unsigned long) imm_expr.X_add_number);
11158                   imm_expr.X_add_number &= 0x7ff;
11159                 }
11160               ip->insn_opcode |= imm_expr.X_add_number;
11161               imm_expr.X_op = O_absent;
11162               s = expr_end;
11163               continue;
11164
11165             default:
11166               internalError ();
11167             }
11168           break;
11169         }
11170
11171       /* Args don't match.  */
11172       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
11173           strcmp (insn->name, insn[1].name) == 0)
11174         {
11175           ++insn;
11176           s = argsstart;
11177           continue;
11178         }
11179
11180       insn_error = _("illegal operands");
11181
11182       return;
11183     }
11184 }
11185
11186 /* This structure holds information we know about a mips16 immediate
11187    argument type.  */
11188
11189 struct mips16_immed_operand
11190 {
11191   /* The type code used in the argument string in the opcode table.  */
11192   int type;
11193   /* The number of bits in the short form of the opcode.  */
11194   int nbits;
11195   /* The number of bits in the extended form of the opcode.  */
11196   int extbits;
11197   /* The amount by which the short form is shifted when it is used;
11198      for example, the sw instruction has a shift count of 2.  */
11199   int shift;
11200   /* The amount by which the short form is shifted when it is stored
11201      into the instruction code.  */
11202   int op_shift;
11203   /* Non-zero if the short form is unsigned.  */
11204   int unsp;
11205   /* Non-zero if the extended form is unsigned.  */
11206   int extu;
11207   /* Non-zero if the value is PC relative.  */
11208   int pcrel;
11209 };
11210
11211 /* The mips16 immediate operand types.  */
11212
11213 static const struct mips16_immed_operand mips16_immed_operands[] =
11214 {
11215   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
11216   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
11217   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
11218   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
11219   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
11220   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
11221   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
11222   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
11223   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
11224   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
11225   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
11226   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
11227   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
11228   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
11229   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
11230   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
11231   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11232   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
11233   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
11234   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
11235   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
11236 };
11237
11238 #define MIPS16_NUM_IMMED \
11239   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
11240
11241 /* Handle a mips16 instruction with an immediate value.  This or's the
11242    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
11243    whether an extended value is needed; if one is needed, it sets
11244    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
11245    If SMALL is true, an unextended opcode was explicitly requested.
11246    If EXT is true, an extended opcode was explicitly requested.  If
11247    WARN is true, warn if EXT does not match reality.  */
11248
11249 static void
11250 mips16_immed (char *file, unsigned int line, int type, offsetT val,
11251               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
11252               unsigned long *insn, bfd_boolean *use_extend,
11253               unsigned short *extend)
11254 {
11255   const struct mips16_immed_operand *op;
11256   int mintiny, maxtiny;
11257   bfd_boolean needext;
11258
11259   op = mips16_immed_operands;
11260   while (op->type != type)
11261     {
11262       ++op;
11263       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
11264     }
11265
11266   if (op->unsp)
11267     {
11268       if (type == '<' || type == '>' || type == '[' || type == ']')
11269         {
11270           mintiny = 1;
11271           maxtiny = 1 << op->nbits;
11272         }
11273       else
11274         {
11275           mintiny = 0;
11276           maxtiny = (1 << op->nbits) - 1;
11277         }
11278     }
11279   else
11280     {
11281       mintiny = - (1 << (op->nbits - 1));
11282       maxtiny = (1 << (op->nbits - 1)) - 1;
11283     }
11284
11285   /* Branch offsets have an implicit 0 in the lowest bit.  */
11286   if (type == 'p' || type == 'q')
11287     val /= 2;
11288
11289   if ((val & ((1 << op->shift) - 1)) != 0
11290       || val < (mintiny << op->shift)
11291       || val > (maxtiny << op->shift))
11292     needext = TRUE;
11293   else
11294     needext = FALSE;
11295
11296   if (warn && ext && ! needext)
11297     as_warn_where (file, line,
11298                    _("extended operand requested but not required"));
11299   if (small && needext)
11300     as_bad_where (file, line, _("invalid unextended operand value"));
11301
11302   if (small || (! ext && ! needext))
11303     {
11304       int insnval;
11305
11306       *use_extend = FALSE;
11307       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11308       insnval <<= op->op_shift;
11309       *insn |= insnval;
11310     }
11311   else
11312     {
11313       long minext, maxext;
11314       int extval;
11315
11316       if (op->extu)
11317         {
11318           minext = 0;
11319           maxext = (1 << op->extbits) - 1;
11320         }
11321       else
11322         {
11323           minext = - (1 << (op->extbits - 1));
11324           maxext = (1 << (op->extbits - 1)) - 1;
11325         }
11326       if (val < minext || val > maxext)
11327         as_bad_where (file, line,
11328                       _("operand value out of range for instruction"));
11329
11330       *use_extend = TRUE;
11331       if (op->extbits == 16)
11332         {
11333           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11334           val &= 0x1f;
11335         }
11336       else if (op->extbits == 15)
11337         {
11338           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11339           val &= 0xf;
11340         }
11341       else
11342         {
11343           extval = ((val & 0x1f) << 6) | (val & 0x20);
11344           val = 0;
11345         }
11346
11347       *extend = (unsigned short) extval;
11348       *insn |= val;
11349     }
11350 }
11351 \f
11352 struct percent_op_match
11353 {
11354   const char *str;
11355   bfd_reloc_code_real_type reloc;
11356 };
11357
11358 static const struct percent_op_match mips_percent_op[] =
11359 {
11360   {"%lo", BFD_RELOC_LO16},
11361 #ifdef OBJ_ELF
11362   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11363   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11364   {"%call16", BFD_RELOC_MIPS_CALL16},
11365   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11366   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11367   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11368   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11369   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11370   {"%got", BFD_RELOC_MIPS_GOT16},
11371   {"%gp_rel", BFD_RELOC_GPREL16},
11372   {"%half", BFD_RELOC_16},
11373   {"%highest", BFD_RELOC_MIPS_HIGHEST},
11374   {"%higher", BFD_RELOC_MIPS_HIGHER},
11375   {"%neg", BFD_RELOC_MIPS_SUB},
11376   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11377   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11378   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11379   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11380   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11381   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11382   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11383 #endif
11384   {"%hi", BFD_RELOC_HI16_S}
11385 };
11386
11387 static const struct percent_op_match mips16_percent_op[] =
11388 {
11389   {"%lo", BFD_RELOC_MIPS16_LO16},
11390   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11391   {"%got", BFD_RELOC_MIPS16_GOT16},
11392   {"%call16", BFD_RELOC_MIPS16_CALL16},
11393   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11394 };
11395
11396
11397 /* Return true if *STR points to a relocation operator.  When returning true,
11398    move *STR over the operator and store its relocation code in *RELOC.
11399    Leave both *STR and *RELOC alone when returning false.  */
11400
11401 static bfd_boolean
11402 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11403 {
11404   const struct percent_op_match *percent_op;
11405   size_t limit, i;
11406
11407   if (mips_opts.mips16)
11408     {
11409       percent_op = mips16_percent_op;
11410       limit = ARRAY_SIZE (mips16_percent_op);
11411     }
11412   else
11413     {
11414       percent_op = mips_percent_op;
11415       limit = ARRAY_SIZE (mips_percent_op);
11416     }
11417
11418   for (i = 0; i < limit; i++)
11419     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11420       {
11421         int len = strlen (percent_op[i].str);
11422
11423         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11424           continue;
11425
11426         *str += strlen (percent_op[i].str);
11427         *reloc = percent_op[i].reloc;
11428
11429         /* Check whether the output BFD supports this relocation.
11430            If not, issue an error and fall back on something safe.  */
11431         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11432           {
11433             as_bad (_("relocation %s isn't supported by the current ABI"),
11434                     percent_op[i].str);
11435             *reloc = BFD_RELOC_UNUSED;
11436           }
11437         return TRUE;
11438       }
11439   return FALSE;
11440 }
11441
11442
11443 /* Parse string STR as a 16-bit relocatable operand.  Store the
11444    expression in *EP and the relocations in the array starting
11445    at RELOC.  Return the number of relocation operators used.
11446
11447    On exit, EXPR_END points to the first character after the expression.  */
11448
11449 static size_t
11450 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11451                        char *str)
11452 {
11453   bfd_reloc_code_real_type reversed_reloc[3];
11454   size_t reloc_index, i;
11455   int crux_depth, str_depth;
11456   char *crux;
11457
11458   /* Search for the start of the main expression, recoding relocations
11459      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11460      of the main expression and with CRUX_DEPTH containing the number
11461      of open brackets at that point.  */
11462   reloc_index = -1;
11463   str_depth = 0;
11464   do
11465     {
11466       reloc_index++;
11467       crux = str;
11468       crux_depth = str_depth;
11469
11470       /* Skip over whitespace and brackets, keeping count of the number
11471          of brackets.  */
11472       while (*str == ' ' || *str == '\t' || *str == '(')
11473         if (*str++ == '(')
11474           str_depth++;
11475     }
11476   while (*str == '%'
11477          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11478          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11479
11480   my_getExpression (ep, crux);
11481   str = expr_end;
11482
11483   /* Match every open bracket.  */
11484   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11485     if (*str++ == ')')
11486       crux_depth--;
11487
11488   if (crux_depth > 0)
11489     as_bad (_("unclosed '('"));
11490
11491   expr_end = str;
11492
11493   if (reloc_index != 0)
11494     {
11495       prev_reloc_op_frag = frag_now;
11496       for (i = 0; i < reloc_index; i++)
11497         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11498     }
11499
11500   return reloc_index;
11501 }
11502
11503 static void
11504 my_getExpression (expressionS *ep, char *str)
11505 {
11506   char *save_in;
11507
11508   save_in = input_line_pointer;
11509   input_line_pointer = str;
11510   expression (ep);
11511   expr_end = input_line_pointer;
11512   input_line_pointer = save_in;
11513 }
11514
11515 char *
11516 md_atof (int type, char *litP, int *sizeP)
11517 {
11518   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11519 }
11520
11521 void
11522 md_number_to_chars (char *buf, valueT val, int n)
11523 {
11524   if (target_big_endian)
11525     number_to_chars_bigendian (buf, val, n);
11526   else
11527     number_to_chars_littleendian (buf, val, n);
11528 }
11529 \f
11530 #ifdef OBJ_ELF
11531 static int support_64bit_objects(void)
11532 {
11533   const char **list, **l;
11534   int yes;
11535
11536   list = bfd_target_list ();
11537   for (l = list; *l != NULL; l++)
11538     if (strcmp (*l, ELF_TARGET ("elf64-", "big")) == 0
11539         || strcmp (*l, ELF_TARGET ("elf64-", "little")) == 0)
11540       break;
11541   yes = (*l != NULL);
11542   free (list);
11543   return yes;
11544 }
11545 #endif /* OBJ_ELF */
11546
11547 const char *md_shortopts = "O::g::G:";
11548
11549 enum options
11550   {
11551     OPTION_MARCH = OPTION_MD_BASE,
11552     OPTION_MTUNE,
11553     OPTION_MIPS1,
11554     OPTION_MIPS2,
11555     OPTION_MIPS3,
11556     OPTION_MIPS4,
11557     OPTION_MIPS5,
11558     OPTION_MIPS32,
11559     OPTION_MIPS64,
11560     OPTION_MIPS32R2,
11561     OPTION_MIPS64R2,
11562     OPTION_MIPS16,
11563     OPTION_NO_MIPS16,
11564     OPTION_MIPS3D,
11565     OPTION_NO_MIPS3D,
11566     OPTION_MDMX,
11567     OPTION_NO_MDMX,
11568     OPTION_DSP,
11569     OPTION_NO_DSP,
11570     OPTION_MT,
11571     OPTION_NO_MT,
11572     OPTION_SMARTMIPS,
11573     OPTION_NO_SMARTMIPS,
11574     OPTION_DSPR2,
11575     OPTION_NO_DSPR2,
11576     OPTION_COMPAT_ARCH_BASE,
11577     OPTION_M4650,
11578     OPTION_NO_M4650,
11579     OPTION_M4010,
11580     OPTION_NO_M4010,
11581     OPTION_M4100,
11582     OPTION_NO_M4100,
11583     OPTION_M3900,
11584     OPTION_NO_M3900,
11585     OPTION_M7000_HILO_FIX,
11586     OPTION_MNO_7000_HILO_FIX, 
11587     OPTION_FIX_24K,
11588     OPTION_NO_FIX_24K,
11589     OPTION_FIX_LOONGSON2F_JUMP,
11590     OPTION_NO_FIX_LOONGSON2F_JUMP,
11591     OPTION_FIX_LOONGSON2F_NOP,
11592     OPTION_NO_FIX_LOONGSON2F_NOP,
11593     OPTION_FIX_VR4120,
11594     OPTION_NO_FIX_VR4120,
11595     OPTION_FIX_VR4130,
11596     OPTION_NO_FIX_VR4130,
11597     OPTION_FIX_CN63XXP1,
11598     OPTION_NO_FIX_CN63XXP1,
11599     OPTION_TRAP,
11600     OPTION_BREAK,
11601     OPTION_EB,
11602     OPTION_EL,
11603     OPTION_FP32,
11604     OPTION_GP32,
11605     OPTION_CONSTRUCT_FLOATS,
11606     OPTION_NO_CONSTRUCT_FLOATS,
11607     OPTION_FP64,
11608     OPTION_GP64,
11609     OPTION_RELAX_BRANCH,
11610     OPTION_NO_RELAX_BRANCH,
11611     OPTION_MSHARED,
11612     OPTION_MNO_SHARED,
11613     OPTION_MSYM32,
11614     OPTION_MNO_SYM32,
11615     OPTION_SOFT_FLOAT,
11616     OPTION_HARD_FLOAT,
11617     OPTION_SINGLE_FLOAT,
11618     OPTION_DOUBLE_FLOAT,
11619     OPTION_32,
11620 #ifdef OBJ_ELF
11621     OPTION_CALL_SHARED,
11622     OPTION_CALL_NONPIC,
11623     OPTION_NON_SHARED,
11624     OPTION_XGOT,
11625     OPTION_MABI,
11626     OPTION_N32,
11627     OPTION_64,
11628     OPTION_MDEBUG,
11629     OPTION_NO_MDEBUG,
11630     OPTION_PDR,
11631     OPTION_NO_PDR,
11632     OPTION_MVXWORKS_PIC,
11633 #endif /* OBJ_ELF */
11634     OPTION_END_OF_ENUM    
11635   };
11636   
11637 struct option md_longopts[] =
11638 {
11639   /* Options which specify architecture.  */
11640   {"march", required_argument, NULL, OPTION_MARCH},
11641   {"mtune", required_argument, NULL, OPTION_MTUNE},
11642   {"mips0", no_argument, NULL, OPTION_MIPS1},
11643   {"mips1", no_argument, NULL, OPTION_MIPS1},
11644   {"mips2", no_argument, NULL, OPTION_MIPS2},
11645   {"mips3", no_argument, NULL, OPTION_MIPS3},
11646   {"mips4", no_argument, NULL, OPTION_MIPS4},
11647   {"mips5", no_argument, NULL, OPTION_MIPS5},
11648   {"mips32", no_argument, NULL, OPTION_MIPS32},
11649   {"mips64", no_argument, NULL, OPTION_MIPS64},
11650   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11651   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11652
11653   /* Options which specify Application Specific Extensions (ASEs).  */
11654   {"mips16", no_argument, NULL, OPTION_MIPS16},
11655   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11656   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11657   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11658   {"mdmx", no_argument, NULL, OPTION_MDMX},
11659   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11660   {"mdsp", no_argument, NULL, OPTION_DSP},
11661   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11662   {"mmt", no_argument, NULL, OPTION_MT},
11663   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11664   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11665   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11666   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11667   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11668
11669   /* Old-style architecture options.  Don't add more of these.  */
11670   {"m4650", no_argument, NULL, OPTION_M4650},
11671   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11672   {"m4010", no_argument, NULL, OPTION_M4010},
11673   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11674   {"m4100", no_argument, NULL, OPTION_M4100},
11675   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11676   {"m3900", no_argument, NULL, OPTION_M3900},
11677   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11678
11679   /* Options which enable bug fixes.  */
11680   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11681   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11682   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11683   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11684   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11685   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11686   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11687   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11688   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11689   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11690   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11691   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11692   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11693   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11694   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11695
11696   /* Miscellaneous options.  */
11697   {"trap", no_argument, NULL, OPTION_TRAP},
11698   {"no-break", no_argument, NULL, OPTION_TRAP},
11699   {"break", no_argument, NULL, OPTION_BREAK},
11700   {"no-trap", no_argument, NULL, OPTION_BREAK},
11701   {"EB", no_argument, NULL, OPTION_EB},
11702   {"EL", no_argument, NULL, OPTION_EL},
11703   {"mfp32", no_argument, NULL, OPTION_FP32},
11704   {"mgp32", no_argument, NULL, OPTION_GP32},
11705   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11706   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11707   {"mfp64", no_argument, NULL, OPTION_FP64},
11708   {"mgp64", no_argument, NULL, OPTION_GP64},
11709   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11710   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11711   {"mshared", no_argument, NULL, OPTION_MSHARED},
11712   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11713   {"msym32", no_argument, NULL, OPTION_MSYM32},
11714   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11715   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11716   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11717   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11718   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11719
11720   /* Strictly speaking this next option is ELF specific,
11721      but we allow it for other ports as well in order to
11722      make testing easier.  */
11723   {"32",          no_argument, NULL, OPTION_32},
11724   
11725   /* ELF-specific options.  */
11726 #ifdef OBJ_ELF
11727   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11728   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11729   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11730   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11731   {"xgot",        no_argument, NULL, OPTION_XGOT},
11732   {"mabi", required_argument, NULL, OPTION_MABI},
11733   {"n32",         no_argument, NULL, OPTION_N32},
11734   {"64",          no_argument, NULL, OPTION_64},
11735   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11736   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11737   {"mpdr", no_argument, NULL, OPTION_PDR},
11738   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11739   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11740 #endif /* OBJ_ELF */
11741
11742   {NULL, no_argument, NULL, 0}
11743 };
11744 size_t md_longopts_size = sizeof (md_longopts);
11745
11746 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11747    NEW_VALUE.  Warn if another value was already specified.  Note:
11748    we have to defer parsing the -march and -mtune arguments in order
11749    to handle 'from-abi' correctly, since the ABI might be specified
11750    in a later argument.  */
11751
11752 static void
11753 mips_set_option_string (const char **string_ptr, const char *new_value)
11754 {
11755   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11756     as_warn (_("A different %s was already specified, is now %s"),
11757              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11758              new_value);
11759
11760   *string_ptr = new_value;
11761 }
11762
11763 int
11764 md_parse_option (int c, char *arg)
11765 {
11766   switch (c)
11767     {
11768     case OPTION_CONSTRUCT_FLOATS:
11769       mips_disable_float_construction = 0;
11770       break;
11771
11772     case OPTION_NO_CONSTRUCT_FLOATS:
11773       mips_disable_float_construction = 1;
11774       break;
11775
11776     case OPTION_TRAP:
11777       mips_trap = 1;
11778       break;
11779
11780     case OPTION_BREAK:
11781       mips_trap = 0;
11782       break;
11783
11784     case OPTION_EB:
11785       target_big_endian = 1;
11786       break;
11787
11788     case OPTION_EL:
11789       target_big_endian = 0;
11790       break;
11791
11792     case 'O':
11793       if (arg == NULL)
11794         mips_optimize = 1;
11795       else if (arg[0] == '0')
11796         mips_optimize = 0;
11797       else if (arg[0] == '1')
11798         mips_optimize = 1;
11799       else
11800         mips_optimize = 2;
11801       break;
11802
11803     case 'g':
11804       if (arg == NULL)
11805         mips_debug = 2;
11806       else
11807         mips_debug = atoi (arg);
11808       break;
11809
11810     case OPTION_MIPS1:
11811       file_mips_isa = ISA_MIPS1;
11812       break;
11813
11814     case OPTION_MIPS2:
11815       file_mips_isa = ISA_MIPS2;
11816       break;
11817
11818     case OPTION_MIPS3:
11819       file_mips_isa = ISA_MIPS3;
11820       break;
11821
11822     case OPTION_MIPS4:
11823       file_mips_isa = ISA_MIPS4;
11824       break;
11825
11826     case OPTION_MIPS5:
11827       file_mips_isa = ISA_MIPS5;
11828       break;
11829
11830     case OPTION_MIPS32:
11831       file_mips_isa = ISA_MIPS32;
11832       break;
11833
11834     case OPTION_MIPS32R2:
11835       file_mips_isa = ISA_MIPS32R2;
11836       break;
11837
11838     case OPTION_MIPS64R2:
11839       file_mips_isa = ISA_MIPS64R2;
11840       break;
11841
11842     case OPTION_MIPS64:
11843       file_mips_isa = ISA_MIPS64;
11844       break;
11845
11846     case OPTION_MTUNE:
11847       mips_set_option_string (&mips_tune_string, arg);
11848       break;
11849
11850     case OPTION_MARCH:
11851       mips_set_option_string (&mips_arch_string, arg);
11852       break;
11853
11854     case OPTION_M4650:
11855       mips_set_option_string (&mips_arch_string, "4650");
11856       mips_set_option_string (&mips_tune_string, "4650");
11857       break;
11858
11859     case OPTION_NO_M4650:
11860       break;
11861
11862     case OPTION_M4010:
11863       mips_set_option_string (&mips_arch_string, "4010");
11864       mips_set_option_string (&mips_tune_string, "4010");
11865       break;
11866
11867     case OPTION_NO_M4010:
11868       break;
11869
11870     case OPTION_M4100:
11871       mips_set_option_string (&mips_arch_string, "4100");
11872       mips_set_option_string (&mips_tune_string, "4100");
11873       break;
11874
11875     case OPTION_NO_M4100:
11876       break;
11877
11878     case OPTION_M3900:
11879       mips_set_option_string (&mips_arch_string, "3900");
11880       mips_set_option_string (&mips_tune_string, "3900");
11881       break;
11882
11883     case OPTION_NO_M3900:
11884       break;
11885
11886     case OPTION_MDMX:
11887       mips_opts.ase_mdmx = 1;
11888       break;
11889
11890     case OPTION_NO_MDMX:
11891       mips_opts.ase_mdmx = 0;
11892       break;
11893
11894     case OPTION_DSP:
11895       mips_opts.ase_dsp = 1;
11896       mips_opts.ase_dspr2 = 0;
11897       break;
11898
11899     case OPTION_NO_DSP:
11900       mips_opts.ase_dsp = 0;
11901       mips_opts.ase_dspr2 = 0;
11902       break;
11903
11904     case OPTION_DSPR2:
11905       mips_opts.ase_dspr2 = 1;
11906       mips_opts.ase_dsp = 1;
11907       break;
11908
11909     case OPTION_NO_DSPR2:
11910       mips_opts.ase_dspr2 = 0;
11911       mips_opts.ase_dsp = 0;
11912       break;
11913
11914     case OPTION_MT:
11915       mips_opts.ase_mt = 1;
11916       break;
11917
11918     case OPTION_NO_MT:
11919       mips_opts.ase_mt = 0;
11920       break;
11921
11922     case OPTION_MIPS16:
11923       mips_opts.mips16 = 1;
11924       mips_no_prev_insn ();
11925       break;
11926
11927     case OPTION_NO_MIPS16:
11928       mips_opts.mips16 = 0;
11929       mips_no_prev_insn ();
11930       break;
11931
11932     case OPTION_MIPS3D:
11933       mips_opts.ase_mips3d = 1;
11934       break;
11935
11936     case OPTION_NO_MIPS3D:
11937       mips_opts.ase_mips3d = 0;
11938       break;
11939
11940     case OPTION_SMARTMIPS:
11941       mips_opts.ase_smartmips = 1;
11942       break;
11943
11944     case OPTION_NO_SMARTMIPS:
11945       mips_opts.ase_smartmips = 0;
11946       break;
11947
11948     case OPTION_FIX_24K:
11949       mips_fix_24k = 1;
11950       break;
11951
11952     case OPTION_NO_FIX_24K:
11953       mips_fix_24k = 0;
11954       break;
11955
11956     case OPTION_FIX_LOONGSON2F_JUMP:
11957       mips_fix_loongson2f_jump = TRUE;
11958       break;
11959
11960     case OPTION_NO_FIX_LOONGSON2F_JUMP:
11961       mips_fix_loongson2f_jump = FALSE;
11962       break;
11963
11964     case OPTION_FIX_LOONGSON2F_NOP:
11965       mips_fix_loongson2f_nop = TRUE;
11966       break;
11967
11968     case OPTION_NO_FIX_LOONGSON2F_NOP:
11969       mips_fix_loongson2f_nop = FALSE;
11970       break;
11971
11972     case OPTION_FIX_VR4120:
11973       mips_fix_vr4120 = 1;
11974       break;
11975
11976     case OPTION_NO_FIX_VR4120:
11977       mips_fix_vr4120 = 0;
11978       break;
11979
11980     case OPTION_FIX_VR4130:
11981       mips_fix_vr4130 = 1;
11982       break;
11983
11984     case OPTION_NO_FIX_VR4130:
11985       mips_fix_vr4130 = 0;
11986       break;
11987
11988     case OPTION_FIX_CN63XXP1:
11989       mips_fix_cn63xxp1 = TRUE;
11990       break;
11991
11992     case OPTION_NO_FIX_CN63XXP1:
11993       mips_fix_cn63xxp1 = FALSE;
11994       break;
11995
11996     case OPTION_RELAX_BRANCH:
11997       mips_relax_branch = 1;
11998       break;
11999
12000     case OPTION_NO_RELAX_BRANCH:
12001       mips_relax_branch = 0;
12002       break;
12003
12004     case OPTION_MSHARED:
12005       mips_in_shared = TRUE;
12006       break;
12007
12008     case OPTION_MNO_SHARED:
12009       mips_in_shared = FALSE;
12010       break;
12011
12012     case OPTION_MSYM32:
12013       mips_opts.sym32 = TRUE;
12014       break;
12015
12016     case OPTION_MNO_SYM32:
12017       mips_opts.sym32 = FALSE;
12018       break;
12019
12020 #ifdef OBJ_ELF
12021       /* When generating ELF code, we permit -KPIC and -call_shared to
12022          select SVR4_PIC, and -non_shared to select no PIC.  This is
12023          intended to be compatible with Irix 5.  */
12024     case OPTION_CALL_SHARED:
12025       if (!IS_ELF)
12026         {
12027           as_bad (_("-call_shared is supported only for ELF format"));
12028           return 0;
12029         }
12030       mips_pic = SVR4_PIC;
12031       mips_abicalls = TRUE;
12032       break;
12033
12034     case OPTION_CALL_NONPIC:
12035       if (!IS_ELF)
12036         {
12037           as_bad (_("-call_nonpic is supported only for ELF format"));
12038           return 0;
12039         }
12040       mips_pic = NO_PIC;
12041       mips_abicalls = TRUE;
12042       break;
12043
12044     case OPTION_NON_SHARED:
12045       if (!IS_ELF)
12046         {
12047           as_bad (_("-non_shared is supported only for ELF format"));
12048           return 0;
12049         }
12050       mips_pic = NO_PIC;
12051       mips_abicalls = FALSE;
12052       break;
12053
12054       /* The -xgot option tells the assembler to use 32 bit offsets
12055          when accessing the got in SVR4_PIC mode.  It is for Irix
12056          compatibility.  */
12057     case OPTION_XGOT:
12058       mips_big_got = 1;
12059       break;
12060 #endif /* OBJ_ELF */
12061
12062     case 'G':
12063       g_switch_value = atoi (arg);
12064       g_switch_seen = 1;
12065       break;
12066
12067       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
12068          and -mabi=64.  */
12069     case OPTION_32:
12070       if (IS_ELF)
12071         mips_abi = O32_ABI;
12072       /* We silently ignore -32 for non-ELF targets.  This greatly
12073          simplifies the construction of the MIPS GAS test cases.  */
12074       break;
12075
12076 #ifdef OBJ_ELF
12077     case OPTION_N32:
12078       if (!IS_ELF)
12079         {
12080           as_bad (_("-n32 is supported for ELF format only"));
12081           return 0;
12082         }
12083       mips_abi = N32_ABI;
12084       break;
12085
12086     case OPTION_64:
12087       if (!IS_ELF)
12088         {
12089           as_bad (_("-64 is supported for ELF format only"));
12090           return 0;
12091         }
12092       mips_abi = N64_ABI;
12093       if (!support_64bit_objects())
12094         as_fatal (_("No compiled in support for 64 bit object file format"));
12095       break;
12096 #endif /* OBJ_ELF */
12097
12098     case OPTION_GP32:
12099       file_mips_gp32 = 1;
12100       break;
12101
12102     case OPTION_GP64:
12103       file_mips_gp32 = 0;
12104       break;
12105
12106     case OPTION_FP32:
12107       file_mips_fp32 = 1;
12108       break;
12109
12110     case OPTION_FP64:
12111       file_mips_fp32 = 0;
12112       break;
12113
12114     case OPTION_SINGLE_FLOAT:
12115       file_mips_single_float = 1;
12116       break;
12117
12118     case OPTION_DOUBLE_FLOAT:
12119       file_mips_single_float = 0;
12120       break;
12121
12122     case OPTION_SOFT_FLOAT:
12123       file_mips_soft_float = 1;
12124       break;
12125
12126     case OPTION_HARD_FLOAT:
12127       file_mips_soft_float = 0;
12128       break;
12129
12130 #ifdef OBJ_ELF
12131     case OPTION_MABI:
12132       if (!IS_ELF)
12133         {
12134           as_bad (_("-mabi is supported for ELF format only"));
12135           return 0;
12136         }
12137       if (strcmp (arg, "32") == 0)
12138         mips_abi = O32_ABI;
12139       else if (strcmp (arg, "o64") == 0)
12140         mips_abi = O64_ABI;
12141       else if (strcmp (arg, "n32") == 0)
12142         mips_abi = N32_ABI;
12143       else if (strcmp (arg, "64") == 0)
12144         {
12145           mips_abi = N64_ABI;
12146           if (! support_64bit_objects())
12147             as_fatal (_("No compiled in support for 64 bit object file "
12148                         "format"));
12149         }
12150       else if (strcmp (arg, "eabi") == 0)
12151         mips_abi = EABI_ABI;
12152       else
12153         {
12154           as_fatal (_("invalid abi -mabi=%s"), arg);
12155           return 0;
12156         }
12157       break;
12158 #endif /* OBJ_ELF */
12159
12160     case OPTION_M7000_HILO_FIX:
12161       mips_7000_hilo_fix = TRUE;
12162       break;
12163
12164     case OPTION_MNO_7000_HILO_FIX:
12165       mips_7000_hilo_fix = FALSE;
12166       break;
12167
12168 #ifdef OBJ_ELF
12169     case OPTION_MDEBUG:
12170       mips_flag_mdebug = TRUE;
12171       break;
12172
12173     case OPTION_NO_MDEBUG:
12174       mips_flag_mdebug = FALSE;
12175       break;
12176
12177     case OPTION_PDR:
12178       mips_flag_pdr = TRUE;
12179       break;
12180
12181     case OPTION_NO_PDR:
12182       mips_flag_pdr = FALSE;
12183       break;
12184
12185     case OPTION_MVXWORKS_PIC:
12186       mips_pic = VXWORKS_PIC;
12187       break;
12188 #endif /* OBJ_ELF */
12189
12190     default:
12191       return 0;
12192     }
12193
12194     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
12195
12196   return 1;
12197 }
12198 \f
12199 /* Set up globals to generate code for the ISA or processor
12200    described by INFO.  */
12201
12202 static void
12203 mips_set_architecture (const struct mips_cpu_info *info)
12204 {
12205   if (info != 0)
12206     {
12207       file_mips_arch = info->cpu;
12208       mips_opts.arch = info->cpu;
12209       mips_opts.isa = info->isa;
12210     }
12211 }
12212
12213
12214 /* Likewise for tuning.  */
12215
12216 static void
12217 mips_set_tune (const struct mips_cpu_info *info)
12218 {
12219   if (info != 0)
12220     mips_tune = info->cpu;
12221 }
12222
12223
12224 void
12225 mips_after_parse_args (void)
12226 {
12227   const struct mips_cpu_info *arch_info = 0;
12228   const struct mips_cpu_info *tune_info = 0;
12229
12230   /* GP relative stuff not working for PE */
12231   if (strncmp (TARGET_OS, "pe", 2) == 0)
12232     {
12233       if (g_switch_seen && g_switch_value != 0)
12234         as_bad (_("-G not supported in this configuration."));
12235       g_switch_value = 0;
12236     }
12237
12238   if (mips_abi == NO_ABI)
12239     mips_abi = MIPS_DEFAULT_ABI;
12240
12241   /* The following code determines the architecture and register size.
12242      Similar code was added to GCC 3.3 (see override_options() in
12243      config/mips/mips.c).  The GAS and GCC code should be kept in sync
12244      as much as possible.  */
12245
12246   if (mips_arch_string != 0)
12247     arch_info = mips_parse_cpu ("-march", mips_arch_string);
12248
12249   if (file_mips_isa != ISA_UNKNOWN)
12250     {
12251       /* Handle -mipsN.  At this point, file_mips_isa contains the
12252          ISA level specified by -mipsN, while arch_info->isa contains
12253          the -march selection (if any).  */
12254       if (arch_info != 0)
12255         {
12256           /* -march takes precedence over -mipsN, since it is more descriptive.
12257              There's no harm in specifying both as long as the ISA levels
12258              are the same.  */
12259           if (file_mips_isa != arch_info->isa)
12260             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
12261                     mips_cpu_info_from_isa (file_mips_isa)->name,
12262                     mips_cpu_info_from_isa (arch_info->isa)->name);
12263         }
12264       else
12265         arch_info = mips_cpu_info_from_isa (file_mips_isa);
12266     }
12267
12268   if (arch_info == 0)
12269     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
12270
12271   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
12272     as_bad (_("-march=%s is not compatible with the selected ABI"),
12273             arch_info->name);
12274
12275   mips_set_architecture (arch_info);
12276
12277   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
12278   if (mips_tune_string != 0)
12279     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
12280
12281   if (tune_info == 0)
12282     mips_set_tune (arch_info);
12283   else
12284     mips_set_tune (tune_info);
12285
12286   if (file_mips_gp32 >= 0)
12287     {
12288       /* The user specified the size of the integer registers.  Make sure
12289          it agrees with the ABI and ISA.  */
12290       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12291         as_bad (_("-mgp64 used with a 32-bit processor"));
12292       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12293         as_bad (_("-mgp32 used with a 64-bit ABI"));
12294       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12295         as_bad (_("-mgp64 used with a 32-bit ABI"));
12296     }
12297   else
12298     {
12299       /* Infer the integer register size from the ABI and processor.
12300          Restrict ourselves to 32-bit registers if that's all the
12301          processor has, or if the ABI cannot handle 64-bit registers.  */
12302       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12303                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12304     }
12305
12306   switch (file_mips_fp32)
12307     {
12308     default:
12309     case -1:
12310       /* No user specified float register size.
12311          ??? GAS treats single-float processors as though they had 64-bit
12312          float registers (although it complains when double-precision
12313          instructions are used).  As things stand, saying they have 32-bit
12314          registers would lead to spurious "register must be even" messages.
12315          So here we assume float registers are never smaller than the
12316          integer ones.  */
12317       if (file_mips_gp32 == 0)
12318         /* 64-bit integer registers implies 64-bit float registers.  */
12319         file_mips_fp32 = 0;
12320       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12321                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12322         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
12323         file_mips_fp32 = 0;
12324       else
12325         /* 32-bit float registers.  */
12326         file_mips_fp32 = 1;
12327       break;
12328
12329     /* The user specified the size of the float registers.  Check if it
12330        agrees with the ABI and ISA.  */
12331     case 0:
12332       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12333         as_bad (_("-mfp64 used with a 32-bit fpu"));
12334       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12335                && !ISA_HAS_MXHC1 (mips_opts.isa))
12336         as_warn (_("-mfp64 used with a 32-bit ABI"));
12337       break;
12338     case 1:
12339       if (ABI_NEEDS_64BIT_REGS (mips_abi))
12340         as_warn (_("-mfp32 used with a 64-bit ABI"));
12341       break;
12342     }
12343
12344   /* End of GCC-shared inference code.  */
12345
12346   /* This flag is set when we have a 64-bit capable CPU but use only
12347      32-bit wide registers.  Note that EABI does not use it.  */
12348   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12349       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12350           || mips_abi == O32_ABI))
12351     mips_32bitmode = 1;
12352
12353   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12354     as_bad (_("trap exception not supported at ISA 1"));
12355
12356   /* If the selected architecture includes support for ASEs, enable
12357      generation of code for them.  */
12358   if (mips_opts.mips16 == -1)
12359     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12360   if (mips_opts.ase_mips3d == -1)
12361     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12362                             && file_mips_fp32 == 0) ? 1 : 0;
12363   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12364     as_bad (_("-mfp32 used with -mips3d"));
12365
12366   if (mips_opts.ase_mdmx == -1)
12367     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12368                           && file_mips_fp32 == 0) ? 1 : 0;
12369   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12370     as_bad (_("-mfp32 used with -mdmx"));
12371
12372   if (mips_opts.ase_smartmips == -1)
12373     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12374   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12375     as_warn (_("%s ISA does not support SmartMIPS"), 
12376              mips_cpu_info_from_isa (mips_opts.isa)->name);
12377
12378   if (mips_opts.ase_dsp == -1)
12379     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12380   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12381     as_warn (_("%s ISA does not support DSP ASE"), 
12382              mips_cpu_info_from_isa (mips_opts.isa)->name);
12383
12384   if (mips_opts.ase_dspr2 == -1)
12385     {
12386       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12387       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12388     }
12389   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12390     as_warn (_("%s ISA does not support DSP R2 ASE"),
12391              mips_cpu_info_from_isa (mips_opts.isa)->name);
12392
12393   if (mips_opts.ase_mt == -1)
12394     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12395   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12396     as_warn (_("%s ISA does not support MT ASE"),
12397              mips_cpu_info_from_isa (mips_opts.isa)->name);
12398
12399   file_mips_isa = mips_opts.isa;
12400   file_ase_mips3d = mips_opts.ase_mips3d;
12401   file_ase_mdmx = mips_opts.ase_mdmx;
12402   file_ase_smartmips = mips_opts.ase_smartmips;
12403   file_ase_dsp = mips_opts.ase_dsp;
12404   file_ase_dspr2 = mips_opts.ase_dspr2;
12405   file_ase_mt = mips_opts.ase_mt;
12406   mips_opts.gp32 = file_mips_gp32;
12407   mips_opts.fp32 = file_mips_fp32;
12408   mips_opts.soft_float = file_mips_soft_float;
12409   mips_opts.single_float = file_mips_single_float;
12410
12411   if (mips_flag_mdebug < 0)
12412     {
12413 #ifdef OBJ_MAYBE_ECOFF
12414       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12415         mips_flag_mdebug = 1;
12416       else
12417 #endif /* OBJ_MAYBE_ECOFF */
12418         mips_flag_mdebug = 0;
12419     }
12420 }
12421 \f
12422 void
12423 mips_init_after_args (void)
12424 {
12425   /* initialize opcodes */
12426   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12427   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12428 }
12429
12430 long
12431 md_pcrel_from (fixS *fixP)
12432 {
12433   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12434   switch (fixP->fx_r_type)
12435     {
12436     case BFD_RELOC_16_PCREL_S2:
12437     case BFD_RELOC_MIPS_JMP:
12438       /* Return the address of the delay slot.  */
12439       return addr + 4;
12440     default:
12441       /* We have no relocation type for PC relative MIPS16 instructions.  */
12442       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12443         as_bad_where (fixP->fx_file, fixP->fx_line,
12444                       _("PC relative MIPS16 instruction references a different section"));
12445       return addr;
12446     }
12447 }
12448
12449 /* This is called before the symbol table is processed.  In order to
12450    work with gcc when using mips-tfile, we must keep all local labels.
12451    However, in other cases, we want to discard them.  If we were
12452    called with -g, but we didn't see any debugging information, it may
12453    mean that gcc is smuggling debugging information through to
12454    mips-tfile, in which case we must generate all local labels.  */
12455
12456 void
12457 mips_frob_file_before_adjust (void)
12458 {
12459 #ifndef NO_ECOFF_DEBUGGING
12460   if (ECOFF_DEBUGGING
12461       && mips_debug != 0
12462       && ! ecoff_debugging_seen)
12463     flag_keep_locals = 1;
12464 #endif
12465 }
12466
12467 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12468    the corresponding LO16 reloc.  This is called before md_apply_fix and
12469    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12470    relocation operators.
12471
12472    For our purposes, a %lo() expression matches a %got() or %hi()
12473    expression if:
12474
12475       (a) it refers to the same symbol; and
12476       (b) the offset applied in the %lo() expression is no lower than
12477           the offset applied in the %got() or %hi().
12478
12479    (b) allows us to cope with code like:
12480
12481         lui     $4,%hi(foo)
12482         lh      $4,%lo(foo+2)($4)
12483
12484    ...which is legal on RELA targets, and has a well-defined behaviour
12485    if the user knows that adding 2 to "foo" will not induce a carry to
12486    the high 16 bits.
12487
12488    When several %lo()s match a particular %got() or %hi(), we use the
12489    following rules to distinguish them:
12490
12491      (1) %lo()s with smaller offsets are a better match than %lo()s with
12492          higher offsets.
12493
12494      (2) %lo()s with no matching %got() or %hi() are better than those
12495          that already have a matching %got() or %hi().
12496
12497      (3) later %lo()s are better than earlier %lo()s.
12498
12499    These rules are applied in order.
12500
12501    (1) means, among other things, that %lo()s with identical offsets are
12502    chosen if they exist.
12503
12504    (2) means that we won't associate several high-part relocations with
12505    the same low-part relocation unless there's no alternative.  Having
12506    several high parts for the same low part is a GNU extension; this rule
12507    allows careful users to avoid it.
12508
12509    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12510    with the last high-part relocation being at the front of the list.
12511    It therefore makes sense to choose the last matching low-part
12512    relocation, all other things being equal.  It's also easier
12513    to code that way.  */
12514
12515 void
12516 mips_frob_file (void)
12517 {
12518   struct mips_hi_fixup *l;
12519   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12520
12521   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12522     {
12523       segment_info_type *seginfo;
12524       bfd_boolean matched_lo_p;
12525       fixS **hi_pos, **lo_pos, **pos;
12526
12527       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12528
12529       /* If a GOT16 relocation turns out to be against a global symbol,
12530          there isn't supposed to be a matching LO.  */
12531       if (got16_reloc_p (l->fixp->fx_r_type)
12532           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12533         continue;
12534
12535       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12536       if (fixup_has_matching_lo_p (l->fixp))
12537         continue;
12538
12539       seginfo = seg_info (l->seg);
12540
12541       /* Set HI_POS to the position of this relocation in the chain.
12542          Set LO_POS to the position of the chosen low-part relocation.
12543          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12544          relocation that matches an immediately-preceding high-part
12545          relocation.  */
12546       hi_pos = NULL;
12547       lo_pos = NULL;
12548       matched_lo_p = FALSE;
12549       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12550
12551       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12552         {
12553           if (*pos == l->fixp)
12554             hi_pos = pos;
12555
12556           if ((*pos)->fx_r_type == looking_for_rtype
12557               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12558               && (*pos)->fx_offset >= l->fixp->fx_offset
12559               && (lo_pos == NULL
12560                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12561                   || (!matched_lo_p
12562                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12563             lo_pos = pos;
12564
12565           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12566                           && fixup_has_matching_lo_p (*pos));
12567         }
12568
12569       /* If we found a match, remove the high-part relocation from its
12570          current position and insert it before the low-part relocation.
12571          Make the offsets match so that fixup_has_matching_lo_p()
12572          will return true.
12573
12574          We don't warn about unmatched high-part relocations since some
12575          versions of gcc have been known to emit dead "lui ...%hi(...)"
12576          instructions.  */
12577       if (lo_pos != NULL)
12578         {
12579           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12580           if (l->fixp->fx_next != *lo_pos)
12581             {
12582               *hi_pos = l->fixp->fx_next;
12583               l->fixp->fx_next = *lo_pos;
12584               *lo_pos = l->fixp;
12585             }
12586         }
12587     }
12588 }
12589
12590 /* We may have combined relocations without symbols in the N32/N64 ABI.
12591    We have to prevent gas from dropping them.  */
12592
12593 int
12594 mips_force_relocation (fixS *fixp)
12595 {
12596   if (generic_force_reloc (fixp))
12597     return 1;
12598
12599   if (HAVE_NEWABI
12600       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12601       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12602           || hi16_reloc_p (fixp->fx_r_type)
12603           || lo16_reloc_p (fixp->fx_r_type)))
12604     return 1;
12605
12606   return 0;
12607 }
12608
12609 /* Apply a fixup to the object file.  */
12610
12611 void
12612 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12613 {
12614   bfd_byte *buf;
12615   long insn;
12616   reloc_howto_type *howto;
12617
12618   /* We ignore generic BFD relocations we don't know about.  */
12619   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12620   if (! howto)
12621     return;
12622
12623   gas_assert (fixP->fx_size == 4
12624               || fixP->fx_r_type == BFD_RELOC_16
12625               || fixP->fx_r_type == BFD_RELOC_64
12626               || fixP->fx_r_type == BFD_RELOC_CTOR
12627               || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12628               || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12629               || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12630               || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12631
12632   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12633
12634   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12635
12636   /* Don't treat parts of a composite relocation as done.  There are two
12637      reasons for this:
12638
12639      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12640          should nevertheless be emitted if the first part is.
12641
12642      (2) In normal usage, composite relocations are never assembly-time
12643          constants.  The easiest way of dealing with the pathological
12644          exceptions is to generate a relocation against STN_UNDEF and
12645          leave everything up to the linker.  */
12646   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12647     fixP->fx_done = 1;
12648
12649   switch (fixP->fx_r_type)
12650     {
12651     case BFD_RELOC_MIPS_TLS_GD:
12652     case BFD_RELOC_MIPS_TLS_LDM:
12653     case BFD_RELOC_MIPS_TLS_DTPREL32:
12654     case BFD_RELOC_MIPS_TLS_DTPREL64:
12655     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12656     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12657     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12658     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12659     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12660       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12661       /* fall through */
12662
12663     case BFD_RELOC_MIPS_JMP:
12664     case BFD_RELOC_MIPS_SHIFT5:
12665     case BFD_RELOC_MIPS_SHIFT6:
12666     case BFD_RELOC_MIPS_GOT_DISP:
12667     case BFD_RELOC_MIPS_GOT_PAGE:
12668     case BFD_RELOC_MIPS_GOT_OFST:
12669     case BFD_RELOC_MIPS_SUB:
12670     case BFD_RELOC_MIPS_INSERT_A:
12671     case BFD_RELOC_MIPS_INSERT_B:
12672     case BFD_RELOC_MIPS_DELETE:
12673     case BFD_RELOC_MIPS_HIGHEST:
12674     case BFD_RELOC_MIPS_HIGHER:
12675     case BFD_RELOC_MIPS_SCN_DISP:
12676     case BFD_RELOC_MIPS_REL16:
12677     case BFD_RELOC_MIPS_RELGOT:
12678     case BFD_RELOC_MIPS_JALR:
12679     case BFD_RELOC_HI16:
12680     case BFD_RELOC_HI16_S:
12681     case BFD_RELOC_GPREL16:
12682     case BFD_RELOC_MIPS_LITERAL:
12683     case BFD_RELOC_MIPS_CALL16:
12684     case BFD_RELOC_MIPS_GOT16:
12685     case BFD_RELOC_GPREL32:
12686     case BFD_RELOC_MIPS_GOT_HI16:
12687     case BFD_RELOC_MIPS_GOT_LO16:
12688     case BFD_RELOC_MIPS_CALL_HI16:
12689     case BFD_RELOC_MIPS_CALL_LO16:
12690     case BFD_RELOC_MIPS16_GPREL:
12691     case BFD_RELOC_MIPS16_GOT16:
12692     case BFD_RELOC_MIPS16_CALL16:
12693     case BFD_RELOC_MIPS16_HI16:
12694     case BFD_RELOC_MIPS16_HI16_S:
12695     case BFD_RELOC_MIPS16_JMP:
12696       /* Nothing needed to do.  The value comes from the reloc entry.  */
12697       break;
12698
12699     case BFD_RELOC_64:
12700       /* This is handled like BFD_RELOC_32, but we output a sign
12701          extended value if we are only 32 bits.  */
12702       if (fixP->fx_done)
12703         {
12704           if (8 <= sizeof (valueT))
12705             md_number_to_chars ((char *) buf, *valP, 8);
12706           else
12707             {
12708               valueT hiv;
12709
12710               if ((*valP & 0x80000000) != 0)
12711                 hiv = 0xffffffff;
12712               else
12713                 hiv = 0;
12714               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12715                                   *valP, 4);
12716               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12717                                   hiv, 4);
12718             }
12719         }
12720       break;
12721
12722     case BFD_RELOC_RVA:
12723     case BFD_RELOC_32:
12724     case BFD_RELOC_16:
12725       /* If we are deleting this reloc entry, we must fill in the
12726          value now.  This can happen if we have a .word which is not
12727          resolved when it appears but is later defined.  */
12728       if (fixP->fx_done)
12729         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12730       break;
12731
12732     case BFD_RELOC_LO16:
12733     case BFD_RELOC_MIPS16_LO16:
12734       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12735          may be safe to remove, but if so it's not obvious.  */
12736       /* When handling an embedded PIC switch statement, we can wind
12737          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12738       if (fixP->fx_done)
12739         {
12740           if (*valP + 0x8000 > 0xffff)
12741             as_bad_where (fixP->fx_file, fixP->fx_line,
12742                           _("relocation overflow"));
12743           if (target_big_endian)
12744             buf += 2;
12745           md_number_to_chars ((char *) buf, *valP, 2);
12746         }
12747       break;
12748
12749     case BFD_RELOC_16_PCREL_S2:
12750       if ((*valP & 0x3) != 0)
12751         as_bad_where (fixP->fx_file, fixP->fx_line,
12752                       _("Branch to misaligned address (%lx)"), (long) *valP);
12753
12754       /* We need to save the bits in the instruction since fixup_segment()
12755          might be deleting the relocation entry (i.e., a branch within
12756          the current segment).  */
12757       if (! fixP->fx_done)
12758         break;
12759
12760       /* Update old instruction data.  */
12761       if (target_big_endian)
12762         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12763       else
12764         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12765
12766       if (*valP + 0x20000 <= 0x3ffff)
12767         {
12768           insn |= (*valP >> 2) & 0xffff;
12769           md_number_to_chars ((char *) buf, insn, 4);
12770         }
12771       else if (mips_pic == NO_PIC
12772                && fixP->fx_done
12773                && fixP->fx_frag->fr_address >= text_section->vma
12774                && (fixP->fx_frag->fr_address
12775                    < text_section->vma + bfd_get_section_size (text_section))
12776                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12777                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12778                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12779         {
12780           /* The branch offset is too large.  If this is an
12781              unconditional branch, and we are not generating PIC code,
12782              we can convert it to an absolute jump instruction.  */
12783           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12784             insn = 0x0c000000;  /* jal */
12785           else
12786             insn = 0x08000000;  /* j */
12787           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12788           fixP->fx_done = 0;
12789           fixP->fx_addsy = section_symbol (text_section);
12790           *valP += md_pcrel_from (fixP);
12791           md_number_to_chars ((char *) buf, insn, 4);
12792         }
12793       else
12794         {
12795           /* If we got here, we have branch-relaxation disabled,
12796              and there's nothing we can do to fix this instruction
12797              without turning it into a longer sequence.  */
12798           as_bad_where (fixP->fx_file, fixP->fx_line,
12799                         _("Branch out of range"));
12800         }
12801       break;
12802
12803     case BFD_RELOC_VTABLE_INHERIT:
12804       fixP->fx_done = 0;
12805       if (fixP->fx_addsy
12806           && !S_IS_DEFINED (fixP->fx_addsy)
12807           && !S_IS_WEAK (fixP->fx_addsy))
12808         S_SET_WEAK (fixP->fx_addsy);
12809       break;
12810
12811     case BFD_RELOC_VTABLE_ENTRY:
12812       fixP->fx_done = 0;
12813       break;
12814
12815     default:
12816       internalError ();
12817     }
12818
12819   /* Remember value for tc_gen_reloc.  */
12820   fixP->fx_addnumber = *valP;
12821 }
12822
12823 static symbolS *
12824 get_symbol (void)
12825 {
12826   int c;
12827   char *name;
12828   symbolS *p;
12829
12830   name = input_line_pointer;
12831   c = get_symbol_end ();
12832   p = (symbolS *) symbol_find_or_make (name);
12833   *input_line_pointer = c;
12834   return p;
12835 }
12836
12837 /* Align the current frag to a given power of two.  If a particular
12838    fill byte should be used, FILL points to an integer that contains
12839    that byte, otherwise FILL is null.
12840
12841    The MIPS assembler also automatically adjusts any preceding
12842    label.  */
12843
12844 static void
12845 mips_align (int to, int *fill, symbolS *label)
12846 {
12847   mips_emit_delays ();
12848   mips_record_mips16_mode ();
12849   if (fill == NULL && subseg_text_p (now_seg))
12850     frag_align_code (to, 0);
12851   else
12852     frag_align (to, fill ? *fill : 0, 0);
12853   record_alignment (now_seg, to);
12854   if (label != NULL)
12855     {
12856       gas_assert (S_GET_SEGMENT (label) == now_seg);
12857       symbol_set_frag (label, frag_now);
12858       S_SET_VALUE (label, (valueT) frag_now_fix ());
12859     }
12860 }
12861
12862 /* Align to a given power of two.  .align 0 turns off the automatic
12863    alignment used by the data creating pseudo-ops.  */
12864
12865 static void
12866 s_align (int x ATTRIBUTE_UNUSED)
12867 {
12868   int temp, fill_value, *fill_ptr;
12869   long max_alignment = 28;
12870
12871   /* o Note that the assembler pulls down any immediately preceding label
12872        to the aligned address.
12873      o It's not documented but auto alignment is reinstated by
12874        a .align pseudo instruction.
12875      o Note also that after auto alignment is turned off the mips assembler
12876        issues an error on attempt to assemble an improperly aligned data item.
12877        We don't.  */
12878
12879   temp = get_absolute_expression ();
12880   if (temp > max_alignment)
12881     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12882   else if (temp < 0)
12883     {
12884       as_warn (_("Alignment negative: 0 assumed."));
12885       temp = 0;
12886     }
12887   if (*input_line_pointer == ',')
12888     {
12889       ++input_line_pointer;
12890       fill_value = get_absolute_expression ();
12891       fill_ptr = &fill_value;
12892     }
12893   else
12894     fill_ptr = 0;
12895   if (temp)
12896     {
12897       segment_info_type *si = seg_info (now_seg);
12898       struct insn_label_list *l = si->label_list;
12899       /* Auto alignment should be switched on by next section change.  */
12900       auto_align = 1;
12901       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12902     }
12903   else
12904     {
12905       auto_align = 0;
12906     }
12907
12908   demand_empty_rest_of_line ();
12909 }
12910
12911 static void
12912 s_change_sec (int sec)
12913 {
12914   segT seg;
12915
12916 #ifdef OBJ_ELF
12917   /* The ELF backend needs to know that we are changing sections, so
12918      that .previous works correctly.  We could do something like check
12919      for an obj_section_change_hook macro, but that might be confusing
12920      as it would not be appropriate to use it in the section changing
12921      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12922      This should be cleaner, somehow.  */
12923   if (IS_ELF)
12924     obj_elf_section_change_hook ();
12925 #endif
12926
12927   mips_emit_delays ();
12928
12929   switch (sec)
12930     {
12931     case 't':
12932       s_text (0);
12933       break;
12934     case 'd':
12935       s_data (0);
12936       break;
12937     case 'b':
12938       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12939       demand_empty_rest_of_line ();
12940       break;
12941
12942     case 'r':
12943       seg = subseg_new (RDATA_SECTION_NAME,
12944                         (subsegT) get_absolute_expression ());
12945       if (IS_ELF)
12946         {
12947           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12948                                                   | SEC_READONLY | SEC_RELOC
12949                                                   | SEC_DATA));
12950           if (strncmp (TARGET_OS, "elf", 3) != 0)
12951             record_alignment (seg, 4);
12952         }
12953       demand_empty_rest_of_line ();
12954       break;
12955
12956     case 's':
12957       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12958       if (IS_ELF)
12959         {
12960           bfd_set_section_flags (stdoutput, seg,
12961                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12962           if (strncmp (TARGET_OS, "elf", 3) != 0)
12963             record_alignment (seg, 4);
12964         }
12965       demand_empty_rest_of_line ();
12966       break;
12967
12968     case 'B':
12969       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12970       if (IS_ELF)
12971         {
12972           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12973           if (strncmp (TARGET_OS, "elf", 3) != 0)
12974             record_alignment (seg, 4);
12975         }
12976       demand_empty_rest_of_line ();
12977       break;
12978     }
12979
12980   auto_align = 1;
12981 }
12982
12983 void
12984 s_change_section (int ignore ATTRIBUTE_UNUSED)
12985 {
12986 #ifdef OBJ_ELF
12987   char *section_name;
12988   char c;
12989   char next_c = 0;
12990   int section_type;
12991   int section_flag;
12992   int section_entry_size;
12993   int section_alignment;
12994
12995   if (!IS_ELF)
12996     return;
12997
12998   section_name = input_line_pointer;
12999   c = get_symbol_end ();
13000   if (c)
13001     next_c = *(input_line_pointer + 1);
13002
13003   /* Do we have .section Name<,"flags">?  */
13004   if (c != ',' || (c == ',' && next_c == '"'))
13005     {
13006       /* just after name is now '\0'.  */
13007       *input_line_pointer = c;
13008       input_line_pointer = section_name;
13009       obj_elf_section (ignore);
13010       return;
13011     }
13012   input_line_pointer++;
13013
13014   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
13015   if (c == ',')
13016     section_type = get_absolute_expression ();
13017   else
13018     section_type = 0;
13019   if (*input_line_pointer++ == ',')
13020     section_flag = get_absolute_expression ();
13021   else
13022     section_flag = 0;
13023   if (*input_line_pointer++ == ',')
13024     section_entry_size = get_absolute_expression ();
13025   else
13026     section_entry_size = 0;
13027   if (*input_line_pointer++ == ',')
13028     section_alignment = get_absolute_expression ();
13029   else
13030     section_alignment = 0;
13031   /* FIXME: really ignore?  */
13032   (void) section_alignment;
13033
13034   section_name = xstrdup (section_name);
13035
13036   /* When using the generic form of .section (as implemented by obj-elf.c),
13037      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
13038      traditionally had to fall back on the more common @progbits instead.
13039
13040      There's nothing really harmful in this, since bfd will correct
13041      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
13042      means that, for backwards compatibility, the special_section entries
13043      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
13044
13045      Even so, we shouldn't force users of the MIPS .section syntax to
13046      incorrectly label the sections as SHT_PROGBITS.  The best compromise
13047      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
13048      generic type-checking code.  */
13049   if (section_type == SHT_MIPS_DWARF)
13050     section_type = SHT_PROGBITS;
13051
13052   obj_elf_change_section (section_name, section_type, section_flag,
13053                           section_entry_size, 0, 0, 0);
13054
13055   if (now_seg->name != section_name)
13056     free (section_name);
13057 #endif /* OBJ_ELF */
13058 }
13059
13060 void
13061 mips_enable_auto_align (void)
13062 {
13063   auto_align = 1;
13064 }
13065
13066 static void
13067 s_cons (int log_size)
13068 {
13069   segment_info_type *si = seg_info (now_seg);
13070   struct insn_label_list *l = si->label_list;
13071   symbolS *label;
13072
13073   label = l != NULL ? l->label : NULL;
13074   mips_emit_delays ();
13075   if (log_size > 0 && auto_align)
13076     mips_align (log_size, 0, label);
13077   cons (1 << log_size);
13078   mips_clear_insn_labels ();
13079 }
13080
13081 static void
13082 s_float_cons (int type)
13083 {
13084   segment_info_type *si = seg_info (now_seg);
13085   struct insn_label_list *l = si->label_list;
13086   symbolS *label;
13087
13088   label = l != NULL ? l->label : NULL;
13089
13090   mips_emit_delays ();
13091
13092   if (auto_align)
13093     {
13094       if (type == 'd')
13095         mips_align (3, 0, label);
13096       else
13097         mips_align (2, 0, label);
13098     }
13099
13100   float_cons (type);
13101   mips_clear_insn_labels ();
13102 }
13103
13104 /* Handle .globl.  We need to override it because on Irix 5 you are
13105    permitted to say
13106        .globl foo .text
13107    where foo is an undefined symbol, to mean that foo should be
13108    considered to be the address of a function.  */
13109
13110 static void
13111 s_mips_globl (int x ATTRIBUTE_UNUSED)
13112 {
13113   char *name;
13114   int c;
13115   symbolS *symbolP;
13116   flagword flag;
13117
13118   do
13119     {
13120       name = input_line_pointer;
13121       c = get_symbol_end ();
13122       symbolP = symbol_find_or_make (name);
13123       S_SET_EXTERNAL (symbolP);
13124
13125       *input_line_pointer = c;
13126       SKIP_WHITESPACE ();
13127
13128       /* On Irix 5, every global symbol that is not explicitly labelled as
13129          being a function is apparently labelled as being an object.  */
13130       flag = BSF_OBJECT;
13131
13132       if (!is_end_of_line[(unsigned char) *input_line_pointer]
13133           && (*input_line_pointer != ','))
13134         {
13135           char *secname;
13136           asection *sec;
13137
13138           secname = input_line_pointer;
13139           c = get_symbol_end ();
13140           sec = bfd_get_section_by_name (stdoutput, secname);
13141           if (sec == NULL)
13142             as_bad (_("%s: no such section"), secname);
13143           *input_line_pointer = c;
13144
13145           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
13146             flag = BSF_FUNCTION;
13147         }
13148
13149       symbol_get_bfdsym (symbolP)->flags |= flag;
13150
13151       c = *input_line_pointer;
13152       if (c == ',')
13153         {
13154           input_line_pointer++;
13155           SKIP_WHITESPACE ();
13156           if (is_end_of_line[(unsigned char) *input_line_pointer])
13157             c = '\n';
13158         }
13159     }
13160   while (c == ',');
13161
13162   demand_empty_rest_of_line ();
13163 }
13164
13165 static void
13166 s_option (int x ATTRIBUTE_UNUSED)
13167 {
13168   char *opt;
13169   char c;
13170
13171   opt = input_line_pointer;
13172   c = get_symbol_end ();
13173
13174   if (*opt == 'O')
13175     {
13176       /* FIXME: What does this mean?  */
13177     }
13178   else if (strncmp (opt, "pic", 3) == 0)
13179     {
13180       int i;
13181
13182       i = atoi (opt + 3);
13183       if (i == 0)
13184         mips_pic = NO_PIC;
13185       else if (i == 2)
13186         {
13187         mips_pic = SVR4_PIC;
13188           mips_abicalls = TRUE;
13189         }
13190       else
13191         as_bad (_(".option pic%d not supported"), i);
13192
13193       if (mips_pic == SVR4_PIC)
13194         {
13195           if (g_switch_seen && g_switch_value != 0)
13196             as_warn (_("-G may not be used with SVR4 PIC code"));
13197           g_switch_value = 0;
13198           bfd_set_gp_size (stdoutput, 0);
13199         }
13200     }
13201   else
13202     as_warn (_("Unrecognized option \"%s\""), opt);
13203
13204   *input_line_pointer = c;
13205   demand_empty_rest_of_line ();
13206 }
13207
13208 /* This structure is used to hold a stack of .set values.  */
13209
13210 struct mips_option_stack
13211 {
13212   struct mips_option_stack *next;
13213   struct mips_set_options options;
13214 };
13215
13216 static struct mips_option_stack *mips_opts_stack;
13217
13218 /* Handle the .set pseudo-op.  */
13219
13220 static void
13221 s_mipsset (int x ATTRIBUTE_UNUSED)
13222 {
13223   char *name = input_line_pointer, ch;
13224
13225   while (!is_end_of_line[(unsigned char) *input_line_pointer])
13226     ++input_line_pointer;
13227   ch = *input_line_pointer;
13228   *input_line_pointer = '\0';
13229
13230   if (strcmp (name, "reorder") == 0)
13231     {
13232       if (mips_opts.noreorder)
13233         end_noreorder ();
13234     }
13235   else if (strcmp (name, "noreorder") == 0)
13236     {
13237       if (!mips_opts.noreorder)
13238         start_noreorder ();
13239     }
13240   else if (strncmp (name, "at=", 3) == 0)
13241     {
13242       char *s = name + 3;
13243
13244       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
13245         as_bad (_("Unrecognized register name `%s'"), s);
13246     }
13247   else if (strcmp (name, "at") == 0)
13248     {
13249       mips_opts.at = ATREG;
13250     }
13251   else if (strcmp (name, "noat") == 0)
13252     {
13253       mips_opts.at = ZERO;
13254     }
13255   else if (strcmp (name, "macro") == 0)
13256     {
13257       mips_opts.warn_about_macros = 0;
13258     }
13259   else if (strcmp (name, "nomacro") == 0)
13260     {
13261       if (mips_opts.noreorder == 0)
13262         as_bad (_("`noreorder' must be set before `nomacro'"));
13263       mips_opts.warn_about_macros = 1;
13264     }
13265   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
13266     {
13267       mips_opts.nomove = 0;
13268     }
13269   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
13270     {
13271       mips_opts.nomove = 1;
13272     }
13273   else if (strcmp (name, "bopt") == 0)
13274     {
13275       mips_opts.nobopt = 0;
13276     }
13277   else if (strcmp (name, "nobopt") == 0)
13278     {
13279       mips_opts.nobopt = 1;
13280     }
13281   else if (strcmp (name, "gp=default") == 0)
13282     mips_opts.gp32 = file_mips_gp32;
13283   else if (strcmp (name, "gp=32") == 0)
13284     mips_opts.gp32 = 1;
13285   else if (strcmp (name, "gp=64") == 0)
13286     {
13287       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
13288         as_warn (_("%s isa does not support 64-bit registers"),
13289                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13290       mips_opts.gp32 = 0;
13291     }
13292   else if (strcmp (name, "fp=default") == 0)
13293     mips_opts.fp32 = file_mips_fp32;
13294   else if (strcmp (name, "fp=32") == 0)
13295     mips_opts.fp32 = 1;
13296   else if (strcmp (name, "fp=64") == 0)
13297     {
13298       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13299         as_warn (_("%s isa does not support 64-bit floating point registers"),
13300                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13301       mips_opts.fp32 = 0;
13302     }
13303   else if (strcmp (name, "softfloat") == 0)
13304     mips_opts.soft_float = 1;
13305   else if (strcmp (name, "hardfloat") == 0)
13306     mips_opts.soft_float = 0;
13307   else if (strcmp (name, "singlefloat") == 0)
13308     mips_opts.single_float = 1;
13309   else if (strcmp (name, "doublefloat") == 0)
13310     mips_opts.single_float = 0;
13311   else if (strcmp (name, "mips16") == 0
13312            || strcmp (name, "MIPS-16") == 0)
13313     mips_opts.mips16 = 1;
13314   else if (strcmp (name, "nomips16") == 0
13315            || strcmp (name, "noMIPS-16") == 0)
13316     mips_opts.mips16 = 0;
13317   else if (strcmp (name, "smartmips") == 0)
13318     {
13319       if (!ISA_SUPPORTS_SMARTMIPS)
13320         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
13321                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13322       mips_opts.ase_smartmips = 1;
13323     }
13324   else if (strcmp (name, "nosmartmips") == 0)
13325     mips_opts.ase_smartmips = 0;
13326   else if (strcmp (name, "mips3d") == 0)
13327     mips_opts.ase_mips3d = 1;
13328   else if (strcmp (name, "nomips3d") == 0)
13329     mips_opts.ase_mips3d = 0;
13330   else if (strcmp (name, "mdmx") == 0)
13331     mips_opts.ase_mdmx = 1;
13332   else if (strcmp (name, "nomdmx") == 0)
13333     mips_opts.ase_mdmx = 0;
13334   else if (strcmp (name, "dsp") == 0)
13335     {
13336       if (!ISA_SUPPORTS_DSP_ASE)
13337         as_warn (_("%s ISA does not support DSP ASE"), 
13338                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13339       mips_opts.ase_dsp = 1;
13340       mips_opts.ase_dspr2 = 0;
13341     }
13342   else if (strcmp (name, "nodsp") == 0)
13343     {
13344       mips_opts.ase_dsp = 0;
13345       mips_opts.ase_dspr2 = 0;
13346     }
13347   else if (strcmp (name, "dspr2") == 0)
13348     {
13349       if (!ISA_SUPPORTS_DSPR2_ASE)
13350         as_warn (_("%s ISA does not support DSP R2 ASE"),
13351                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13352       mips_opts.ase_dspr2 = 1;
13353       mips_opts.ase_dsp = 1;
13354     }
13355   else if (strcmp (name, "nodspr2") == 0)
13356     {
13357       mips_opts.ase_dspr2 = 0;
13358       mips_opts.ase_dsp = 0;
13359     }
13360   else if (strcmp (name, "mt") == 0)
13361     {
13362       if (!ISA_SUPPORTS_MT_ASE)
13363         as_warn (_("%s ISA does not support MT ASE"), 
13364                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13365       mips_opts.ase_mt = 1;
13366     }
13367   else if (strcmp (name, "nomt") == 0)
13368     mips_opts.ase_mt = 0;
13369   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13370     {
13371       int reset = 0;
13372
13373       /* Permit the user to change the ISA and architecture on the fly.
13374          Needless to say, misuse can cause serious problems.  */
13375       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13376         {
13377           reset = 1;
13378           mips_opts.isa = file_mips_isa;
13379           mips_opts.arch = file_mips_arch;
13380         }
13381       else if (strncmp (name, "arch=", 5) == 0)
13382         {
13383           const struct mips_cpu_info *p;
13384
13385           p = mips_parse_cpu("internal use", name + 5);
13386           if (!p)
13387             as_bad (_("unknown architecture %s"), name + 5);
13388           else
13389             {
13390               mips_opts.arch = p->cpu;
13391               mips_opts.isa = p->isa;
13392             }
13393         }
13394       else if (strncmp (name, "mips", 4) == 0)
13395         {
13396           const struct mips_cpu_info *p;
13397
13398           p = mips_parse_cpu("internal use", name);
13399           if (!p)
13400             as_bad (_("unknown ISA level %s"), name + 4);
13401           else
13402             {
13403               mips_opts.arch = p->cpu;
13404               mips_opts.isa = p->isa;
13405             }
13406         }
13407       else
13408         as_bad (_("unknown ISA or architecture %s"), name);
13409
13410       switch (mips_opts.isa)
13411         {
13412         case  0:
13413           break;
13414         case ISA_MIPS1:
13415         case ISA_MIPS2:
13416         case ISA_MIPS32:
13417         case ISA_MIPS32R2:
13418           mips_opts.gp32 = 1;
13419           mips_opts.fp32 = 1;
13420           break;
13421         case ISA_MIPS3:
13422         case ISA_MIPS4:
13423         case ISA_MIPS5:
13424         case ISA_MIPS64:
13425         case ISA_MIPS64R2:
13426           mips_opts.gp32 = 0;
13427           mips_opts.fp32 = 0;
13428           break;
13429         default:
13430           as_bad (_("unknown ISA level %s"), name + 4);
13431           break;
13432         }
13433       if (reset)
13434         {
13435           mips_opts.gp32 = file_mips_gp32;
13436           mips_opts.fp32 = file_mips_fp32;
13437         }
13438     }
13439   else if (strcmp (name, "autoextend") == 0)
13440     mips_opts.noautoextend = 0;
13441   else if (strcmp (name, "noautoextend") == 0)
13442     mips_opts.noautoextend = 1;
13443   else if (strcmp (name, "push") == 0)
13444     {
13445       struct mips_option_stack *s;
13446
13447       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13448       s->next = mips_opts_stack;
13449       s->options = mips_opts;
13450       mips_opts_stack = s;
13451     }
13452   else if (strcmp (name, "pop") == 0)
13453     {
13454       struct mips_option_stack *s;
13455
13456       s = mips_opts_stack;
13457       if (s == NULL)
13458         as_bad (_(".set pop with no .set push"));
13459       else
13460         {
13461           /* If we're changing the reorder mode we need to handle
13462              delay slots correctly.  */
13463           if (s->options.noreorder && ! mips_opts.noreorder)
13464             start_noreorder ();
13465           else if (! s->options.noreorder && mips_opts.noreorder)
13466             end_noreorder ();
13467
13468           mips_opts = s->options;
13469           mips_opts_stack = s->next;
13470           free (s);
13471         }
13472     }
13473   else if (strcmp (name, "sym32") == 0)
13474     mips_opts.sym32 = TRUE;
13475   else if (strcmp (name, "nosym32") == 0)
13476     mips_opts.sym32 = FALSE;
13477   else if (strchr (name, ','))
13478     {
13479       /* Generic ".set" directive; use the generic handler.  */
13480       *input_line_pointer = ch;
13481       input_line_pointer = name;
13482       s_set (0);
13483       return;
13484     }
13485   else
13486     {
13487       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13488     }
13489   *input_line_pointer = ch;
13490   demand_empty_rest_of_line ();
13491 }
13492
13493 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13494    .option pic2.  It means to generate SVR4 PIC calls.  */
13495
13496 static void
13497 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13498 {
13499   mips_pic = SVR4_PIC;
13500   mips_abicalls = TRUE;
13501
13502   if (g_switch_seen && g_switch_value != 0)
13503     as_warn (_("-G may not be used with SVR4 PIC code"));
13504   g_switch_value = 0;
13505
13506   bfd_set_gp_size (stdoutput, 0);
13507   demand_empty_rest_of_line ();
13508 }
13509
13510 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13511    PIC code.  It sets the $gp register for the function based on the
13512    function address, which is in the register named in the argument.
13513    This uses a relocation against _gp_disp, which is handled specially
13514    by the linker.  The result is:
13515         lui     $gp,%hi(_gp_disp)
13516         addiu   $gp,$gp,%lo(_gp_disp)
13517         addu    $gp,$gp,.cpload argument
13518    The .cpload argument is normally $25 == $t9.
13519
13520    The -mno-shared option changes this to:
13521         lui     $gp,%hi(__gnu_local_gp)
13522         addiu   $gp,$gp,%lo(__gnu_local_gp)
13523    and the argument is ignored.  This saves an instruction, but the
13524    resulting code is not position independent; it uses an absolute
13525    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13526    can go into an ordinary executable, but not into a shared library.  */
13527
13528 static void
13529 s_cpload (int ignore ATTRIBUTE_UNUSED)
13530 {
13531   expressionS ex;
13532   int reg;
13533   int in_shared;
13534
13535   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13536      .cpload is ignored.  */
13537   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13538     {
13539       s_ignore (0);
13540       return;
13541     }
13542
13543   /* .cpload should be in a .set noreorder section.  */
13544   if (mips_opts.noreorder == 0)
13545     as_warn (_(".cpload not in noreorder section"));
13546
13547   reg = tc_get_register (0);
13548
13549   /* If we need to produce a 64-bit address, we are better off using
13550      the default instruction sequence.  */
13551   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13552
13553   ex.X_op = O_symbol;
13554   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13555                                          "__gnu_local_gp");
13556   ex.X_op_symbol = NULL;
13557   ex.X_add_number = 0;
13558
13559   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13560   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13561
13562   macro_start ();
13563   macro_build_lui (&ex, mips_gp_register);
13564   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13565                mips_gp_register, BFD_RELOC_LO16);
13566   if (in_shared)
13567     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13568                  mips_gp_register, reg);
13569   macro_end ();
13570
13571   demand_empty_rest_of_line ();
13572 }
13573
13574 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13575      .cpsetup $reg1, offset|$reg2, label
13576
13577    If offset is given, this results in:
13578      sd         $gp, offset($sp)
13579      lui        $gp, %hi(%neg(%gp_rel(label)))
13580      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13581      daddu      $gp, $gp, $reg1
13582
13583    If $reg2 is given, this results in:
13584      daddu      $reg2, $gp, $0
13585      lui        $gp, %hi(%neg(%gp_rel(label)))
13586      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13587      daddu      $gp, $gp, $reg1
13588    $reg1 is normally $25 == $t9.
13589
13590    The -mno-shared option replaces the last three instructions with
13591         lui     $gp,%hi(_gp)
13592         addiu   $gp,$gp,%lo(_gp)  */
13593
13594 static void
13595 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13596 {
13597   expressionS ex_off;
13598   expressionS ex_sym;
13599   int reg1;
13600
13601   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13602      We also need NewABI support.  */
13603   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13604     {
13605       s_ignore (0);
13606       return;
13607     }
13608
13609   reg1 = tc_get_register (0);
13610   SKIP_WHITESPACE ();
13611   if (*input_line_pointer != ',')
13612     {
13613       as_bad (_("missing argument separator ',' for .cpsetup"));
13614       return;
13615     }
13616   else
13617     ++input_line_pointer;
13618   SKIP_WHITESPACE ();
13619   if (*input_line_pointer == '$')
13620     {
13621       mips_cpreturn_register = tc_get_register (0);
13622       mips_cpreturn_offset = -1;
13623     }
13624   else
13625     {
13626       mips_cpreturn_offset = get_absolute_expression ();
13627       mips_cpreturn_register = -1;
13628     }
13629   SKIP_WHITESPACE ();
13630   if (*input_line_pointer != ',')
13631     {
13632       as_bad (_("missing argument separator ',' for .cpsetup"));
13633       return;
13634     }
13635   else
13636     ++input_line_pointer;
13637   SKIP_WHITESPACE ();
13638   expression (&ex_sym);
13639
13640   macro_start ();
13641   if (mips_cpreturn_register == -1)
13642     {
13643       ex_off.X_op = O_constant;
13644       ex_off.X_add_symbol = NULL;
13645       ex_off.X_op_symbol = NULL;
13646       ex_off.X_add_number = mips_cpreturn_offset;
13647
13648       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13649                    BFD_RELOC_LO16, SP);
13650     }
13651   else
13652     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13653                  mips_gp_register, 0);
13654
13655   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13656     {
13657       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13658                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13659                    BFD_RELOC_HI16_S);
13660
13661       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13662                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13663                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13664
13665       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13666                    mips_gp_register, reg1);
13667     }
13668   else
13669     {
13670       expressionS ex;
13671
13672       ex.X_op = O_symbol;
13673       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13674       ex.X_op_symbol = NULL;
13675       ex.X_add_number = 0;
13676
13677       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13678       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13679
13680       macro_build_lui (&ex, mips_gp_register);
13681       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13682                    mips_gp_register, BFD_RELOC_LO16);
13683     }
13684
13685   macro_end ();
13686
13687   demand_empty_rest_of_line ();
13688 }
13689
13690 static void
13691 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13692 {
13693   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13694      .cplocal is ignored.  */
13695   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13696     {
13697       s_ignore (0);
13698       return;
13699     }
13700
13701   mips_gp_register = tc_get_register (0);
13702   demand_empty_rest_of_line ();
13703 }
13704
13705 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13706    offset from $sp.  The offset is remembered, and after making a PIC
13707    call $gp is restored from that location.  */
13708
13709 static void
13710 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13711 {
13712   expressionS ex;
13713
13714   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13715      .cprestore is ignored.  */
13716   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13717     {
13718       s_ignore (0);
13719       return;
13720     }
13721
13722   mips_cprestore_offset = get_absolute_expression ();
13723   mips_cprestore_valid = 1;
13724
13725   ex.X_op = O_constant;
13726   ex.X_add_symbol = NULL;
13727   ex.X_op_symbol = NULL;
13728   ex.X_add_number = mips_cprestore_offset;
13729
13730   macro_start ();
13731   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13732                                 SP, HAVE_64BIT_ADDRESSES);
13733   macro_end ();
13734
13735   demand_empty_rest_of_line ();
13736 }
13737
13738 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13739    was given in the preceding .cpsetup, it results in:
13740      ld         $gp, offset($sp)
13741
13742    If a register $reg2 was given there, it results in:
13743      daddu      $gp, $reg2, $0  */
13744
13745 static void
13746 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13747 {
13748   expressionS ex;
13749
13750   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13751      We also need NewABI support.  */
13752   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13753     {
13754       s_ignore (0);
13755       return;
13756     }
13757
13758   macro_start ();
13759   if (mips_cpreturn_register == -1)
13760     {
13761       ex.X_op = O_constant;
13762       ex.X_add_symbol = NULL;
13763       ex.X_op_symbol = NULL;
13764       ex.X_add_number = mips_cpreturn_offset;
13765
13766       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13767     }
13768   else
13769     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13770                  mips_cpreturn_register, 0);
13771   macro_end ();
13772
13773   demand_empty_rest_of_line ();
13774 }
13775
13776 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13777    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13778    use in DWARF debug information.  */
13779
13780 static void
13781 s_dtprel_internal (size_t bytes)
13782 {
13783   expressionS ex;
13784   char *p;
13785
13786   expression (&ex);
13787
13788   if (ex.X_op != O_symbol)
13789     {
13790       as_bad (_("Unsupported use of %s"), (bytes == 8
13791                                            ? ".dtpreldword"
13792                                            : ".dtprelword"));
13793       ignore_rest_of_line ();
13794     }
13795
13796   p = frag_more (bytes);
13797   md_number_to_chars (p, 0, bytes);
13798   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13799                (bytes == 8
13800                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13801                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13802
13803   demand_empty_rest_of_line ();
13804 }
13805
13806 /* Handle .dtprelword.  */
13807
13808 static void
13809 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13810 {
13811   s_dtprel_internal (4);
13812 }
13813
13814 /* Handle .dtpreldword.  */
13815
13816 static void
13817 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13818 {
13819   s_dtprel_internal (8);
13820 }
13821
13822 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13823    code.  It sets the offset to use in gp_rel relocations.  */
13824
13825 static void
13826 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13827 {
13828   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13829      We also need NewABI support.  */
13830   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13831     {
13832       s_ignore (0);
13833       return;
13834     }
13835
13836   mips_gprel_offset = get_absolute_expression ();
13837
13838   demand_empty_rest_of_line ();
13839 }
13840
13841 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13842    code.  It generates a 32 bit GP relative reloc.  */
13843
13844 static void
13845 s_gpword (int ignore ATTRIBUTE_UNUSED)
13846 {
13847   segment_info_type *si;
13848   struct insn_label_list *l;
13849   symbolS *label;
13850   expressionS ex;
13851   char *p;
13852
13853   /* When not generating PIC code, this is treated as .word.  */
13854   if (mips_pic != SVR4_PIC)
13855     {
13856       s_cons (2);
13857       return;
13858     }
13859
13860   si = seg_info (now_seg);
13861   l = si->label_list;
13862   label = l != NULL ? l->label : NULL;
13863   mips_emit_delays ();
13864   if (auto_align)
13865     mips_align (2, 0, label);
13866
13867   expression (&ex);
13868   mips_clear_insn_labels ();
13869
13870   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13871     {
13872       as_bad (_("Unsupported use of .gpword"));
13873       ignore_rest_of_line ();
13874     }
13875
13876   p = frag_more (4);
13877   md_number_to_chars (p, 0, 4);
13878   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13879                BFD_RELOC_GPREL32);
13880
13881   demand_empty_rest_of_line ();
13882 }
13883
13884 static void
13885 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13886 {
13887   segment_info_type *si;
13888   struct insn_label_list *l;
13889   symbolS *label;
13890   expressionS ex;
13891   char *p;
13892
13893   /* When not generating PIC code, this is treated as .dword.  */
13894   if (mips_pic != SVR4_PIC)
13895     {
13896       s_cons (3);
13897       return;
13898     }
13899
13900   si = seg_info (now_seg);
13901   l = si->label_list;
13902   label = l != NULL ? l->label : NULL;
13903   mips_emit_delays ();
13904   if (auto_align)
13905     mips_align (3, 0, label);
13906
13907   expression (&ex);
13908   mips_clear_insn_labels ();
13909
13910   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13911     {
13912       as_bad (_("Unsupported use of .gpdword"));
13913       ignore_rest_of_line ();
13914     }
13915
13916   p = frag_more (8);
13917   md_number_to_chars (p, 0, 8);
13918   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13919                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13920
13921   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13922   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13923            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13924
13925   demand_empty_rest_of_line ();
13926 }
13927
13928 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13929    tables in SVR4 PIC code.  */
13930
13931 static void
13932 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13933 {
13934   int reg;
13935
13936   /* This is ignored when not generating SVR4 PIC code.  */
13937   if (mips_pic != SVR4_PIC)
13938     {
13939       s_ignore (0);
13940       return;
13941     }
13942
13943   /* Add $gp to the register named as an argument.  */
13944   macro_start ();
13945   reg = tc_get_register (0);
13946   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13947   macro_end ();
13948
13949   demand_empty_rest_of_line ();
13950 }
13951
13952 /* Handle the .insn pseudo-op.  This marks instruction labels in
13953    mips16 mode.  This permits the linker to handle them specially,
13954    such as generating jalx instructions when needed.  We also make
13955    them odd for the duration of the assembly, in order to generate the
13956    right sort of code.  We will make them even in the adjust_symtab
13957    routine, while leaving them marked.  This is convenient for the
13958    debugger and the disassembler.  The linker knows to make them odd
13959    again.  */
13960
13961 static void
13962 s_insn (int ignore ATTRIBUTE_UNUSED)
13963 {
13964   mips16_mark_labels ();
13965
13966   demand_empty_rest_of_line ();
13967 }
13968
13969 /* Handle a .stabn directive.  We need these in order to mark a label
13970    as being a mips16 text label correctly.  Sometimes the compiler
13971    will emit a label, followed by a .stabn, and then switch sections.
13972    If the label and .stabn are in mips16 mode, then the label is
13973    really a mips16 text label.  */
13974
13975 static void
13976 s_mips_stab (int type)
13977 {
13978   if (type == 'n')
13979     mips16_mark_labels ();
13980
13981   s_stab (type);
13982 }
13983
13984 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13985
13986 static void
13987 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13988 {
13989   char *name;
13990   int c;
13991   symbolS *symbolP;
13992   expressionS exp;
13993
13994   name = input_line_pointer;
13995   c = get_symbol_end ();
13996   symbolP = symbol_find_or_make (name);
13997   S_SET_WEAK (symbolP);
13998   *input_line_pointer = c;
13999
14000   SKIP_WHITESPACE ();
14001
14002   if (! is_end_of_line[(unsigned char) *input_line_pointer])
14003     {
14004       if (S_IS_DEFINED (symbolP))
14005         {
14006           as_bad (_("ignoring attempt to redefine symbol %s"),
14007                   S_GET_NAME (symbolP));
14008           ignore_rest_of_line ();
14009           return;
14010         }
14011
14012       if (*input_line_pointer == ',')
14013         {
14014           ++input_line_pointer;
14015           SKIP_WHITESPACE ();
14016         }
14017
14018       expression (&exp);
14019       if (exp.X_op != O_symbol)
14020         {
14021           as_bad (_("bad .weakext directive"));
14022           ignore_rest_of_line ();
14023           return;
14024         }
14025       symbol_set_value_expression (symbolP, &exp);
14026     }
14027
14028   demand_empty_rest_of_line ();
14029 }
14030
14031 /* Parse a register string into a number.  Called from the ECOFF code
14032    to parse .frame.  The argument is non-zero if this is the frame
14033    register, so that we can record it in mips_frame_reg.  */
14034
14035 int
14036 tc_get_register (int frame)
14037 {
14038   unsigned int reg;
14039
14040   SKIP_WHITESPACE ();
14041   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
14042     reg = 0;
14043   if (frame)
14044     {
14045       mips_frame_reg = reg != 0 ? reg : SP;
14046       mips_frame_reg_valid = 1;
14047       mips_cprestore_valid = 0;
14048     }
14049   return reg;
14050 }
14051
14052 valueT
14053 md_section_align (asection *seg, valueT addr)
14054 {
14055   int align = bfd_get_section_alignment (stdoutput, seg);
14056
14057   if (IS_ELF)
14058     {
14059       /* We don't need to align ELF sections to the full alignment.
14060          However, Irix 5 may prefer that we align them at least to a 16
14061          byte boundary.  We don't bother to align the sections if we
14062          are targeted for an embedded system.  */
14063       if (strncmp (TARGET_OS, "elf", 3) == 0)
14064         return addr;
14065       if (align > 4)
14066         align = 4;
14067     }
14068
14069   return ((addr + (1 << align) - 1) & (-1 << align));
14070 }
14071
14072 /* Utility routine, called from above as well.  If called while the
14073    input file is still being read, it's only an approximation.  (For
14074    example, a symbol may later become defined which appeared to be
14075    undefined earlier.)  */
14076
14077 static int
14078 nopic_need_relax (symbolS *sym, int before_relaxing)
14079 {
14080   if (sym == 0)
14081     return 0;
14082
14083   if (g_switch_value > 0)
14084     {
14085       const char *symname;
14086       int change;
14087
14088       /* Find out whether this symbol can be referenced off the $gp
14089          register.  It can be if it is smaller than the -G size or if
14090          it is in the .sdata or .sbss section.  Certain symbols can
14091          not be referenced off the $gp, although it appears as though
14092          they can.  */
14093       symname = S_GET_NAME (sym);
14094       if (symname != (const char *) NULL
14095           && (strcmp (symname, "eprol") == 0
14096               || strcmp (symname, "etext") == 0
14097               || strcmp (symname, "_gp") == 0
14098               || strcmp (symname, "edata") == 0
14099               || strcmp (symname, "_fbss") == 0
14100               || strcmp (symname, "_fdata") == 0
14101               || strcmp (symname, "_ftext") == 0
14102               || strcmp (symname, "end") == 0
14103               || strcmp (symname, "_gp_disp") == 0))
14104         change = 1;
14105       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
14106                && (0
14107 #ifndef NO_ECOFF_DEBUGGING
14108                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
14109                        && (symbol_get_obj (sym)->ecoff_extern_size
14110                            <= g_switch_value))
14111 #endif
14112                    /* We must defer this decision until after the whole
14113                       file has been read, since there might be a .extern
14114                       after the first use of this symbol.  */
14115                    || (before_relaxing
14116 #ifndef NO_ECOFF_DEBUGGING
14117                        && symbol_get_obj (sym)->ecoff_extern_size == 0
14118 #endif
14119                        && S_GET_VALUE (sym) == 0)
14120                    || (S_GET_VALUE (sym) != 0
14121                        && S_GET_VALUE (sym) <= g_switch_value)))
14122         change = 0;
14123       else
14124         {
14125           const char *segname;
14126
14127           segname = segment_name (S_GET_SEGMENT (sym));
14128           gas_assert (strcmp (segname, ".lit8") != 0
14129                   && strcmp (segname, ".lit4") != 0);
14130           change = (strcmp (segname, ".sdata") != 0
14131                     && strcmp (segname, ".sbss") != 0
14132                     && strncmp (segname, ".sdata.", 7) != 0
14133                     && strncmp (segname, ".sbss.", 6) != 0
14134                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
14135                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
14136         }
14137       return change;
14138     }
14139   else
14140     /* We are not optimizing for the $gp register.  */
14141     return 1;
14142 }
14143
14144
14145 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
14146
14147 static bfd_boolean
14148 pic_need_relax (symbolS *sym, asection *segtype)
14149 {
14150   asection *symsec;
14151
14152   /* Handle the case of a symbol equated to another symbol.  */
14153   while (symbol_equated_reloc_p (sym))
14154     {
14155       symbolS *n;
14156
14157       /* It's possible to get a loop here in a badly written program.  */
14158       n = symbol_get_value_expression (sym)->X_add_symbol;
14159       if (n == sym)
14160         break;
14161       sym = n;
14162     }
14163
14164   if (symbol_section_p (sym))
14165     return TRUE;
14166
14167   symsec = S_GET_SEGMENT (sym);
14168
14169   /* This must duplicate the test in adjust_reloc_syms.  */
14170   return (symsec != &bfd_und_section
14171           && symsec != &bfd_abs_section
14172           && !bfd_is_com_section (symsec)
14173           && !s_is_linkonce (sym, segtype)
14174 #ifdef OBJ_ELF
14175           /* A global or weak symbol is treated as external.  */
14176           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
14177 #endif
14178           );
14179 }
14180
14181
14182 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
14183    extended opcode.  SEC is the section the frag is in.  */
14184
14185 static int
14186 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
14187 {
14188   int type;
14189   const struct mips16_immed_operand *op;
14190   offsetT val;
14191   int mintiny, maxtiny;
14192   segT symsec;
14193   fragS *sym_frag;
14194
14195   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
14196     return 0;
14197   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
14198     return 1;
14199
14200   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14201   op = mips16_immed_operands;
14202   while (op->type != type)
14203     {
14204       ++op;
14205       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
14206     }
14207
14208   if (op->unsp)
14209     {
14210       if (type == '<' || type == '>' || type == '[' || type == ']')
14211         {
14212           mintiny = 1;
14213           maxtiny = 1 << op->nbits;
14214         }
14215       else
14216         {
14217           mintiny = 0;
14218           maxtiny = (1 << op->nbits) - 1;
14219         }
14220     }
14221   else
14222     {
14223       mintiny = - (1 << (op->nbits - 1));
14224       maxtiny = (1 << (op->nbits - 1)) - 1;
14225     }
14226
14227   sym_frag = symbol_get_frag (fragp->fr_symbol);
14228   val = S_GET_VALUE (fragp->fr_symbol);
14229   symsec = S_GET_SEGMENT (fragp->fr_symbol);
14230
14231   if (op->pcrel)
14232     {
14233       addressT addr;
14234
14235       /* We won't have the section when we are called from
14236          mips_relax_frag.  However, we will always have been called
14237          from md_estimate_size_before_relax first.  If this is a
14238          branch to a different section, we mark it as such.  If SEC is
14239          NULL, and the frag is not marked, then it must be a branch to
14240          the same section.  */
14241       if (sec == NULL)
14242         {
14243           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
14244             return 1;
14245         }
14246       else
14247         {
14248           /* Must have been called from md_estimate_size_before_relax.  */
14249           if (symsec != sec)
14250             {
14251               fragp->fr_subtype =
14252                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14253
14254               /* FIXME: We should support this, and let the linker
14255                  catch branches and loads that are out of range.  */
14256               as_bad_where (fragp->fr_file, fragp->fr_line,
14257                             _("unsupported PC relative reference to different section"));
14258
14259               return 1;
14260             }
14261           if (fragp != sym_frag && sym_frag->fr_address == 0)
14262             /* Assume non-extended on the first relaxation pass.
14263                The address we have calculated will be bogus if this is
14264                a forward branch to another frag, as the forward frag
14265                will have fr_address == 0.  */
14266             return 0;
14267         }
14268
14269       /* In this case, we know for sure that the symbol fragment is in
14270          the same section.  If the relax_marker of the symbol fragment
14271          differs from the relax_marker of this fragment, we have not
14272          yet adjusted the symbol fragment fr_address.  We want to add
14273          in STRETCH in order to get a better estimate of the address.
14274          This particularly matters because of the shift bits.  */
14275       if (stretch != 0
14276           && sym_frag->relax_marker != fragp->relax_marker)
14277         {
14278           fragS *f;
14279
14280           /* Adjust stretch for any alignment frag.  Note that if have
14281              been expanding the earlier code, the symbol may be
14282              defined in what appears to be an earlier frag.  FIXME:
14283              This doesn't handle the fr_subtype field, which specifies
14284              a maximum number of bytes to skip when doing an
14285              alignment.  */
14286           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
14287             {
14288               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14289                 {
14290                   if (stretch < 0)
14291                     stretch = - ((- stretch)
14292                                  & ~ ((1 << (int) f->fr_offset) - 1));
14293                   else
14294                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14295                   if (stretch == 0)
14296                     break;
14297                 }
14298             }
14299           if (f != NULL)
14300             val += stretch;
14301         }
14302
14303       addr = fragp->fr_address + fragp->fr_fix;
14304
14305       /* The base address rules are complicated.  The base address of
14306          a branch is the following instruction.  The base address of a
14307          PC relative load or add is the instruction itself, but if it
14308          is in a delay slot (in which case it can not be extended) use
14309          the address of the instruction whose delay slot it is in.  */
14310       if (type == 'p' || type == 'q')
14311         {
14312           addr += 2;
14313
14314           /* If we are currently assuming that this frag should be
14315              extended, then, the current address is two bytes
14316              higher.  */
14317           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14318             addr += 2;
14319
14320           /* Ignore the low bit in the target, since it will be set
14321              for a text label.  */
14322           if ((val & 1) != 0)
14323             --val;
14324         }
14325       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14326         addr -= 4;
14327       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14328         addr -= 2;
14329
14330       val -= addr & ~ ((1 << op->shift) - 1);
14331
14332       /* Branch offsets have an implicit 0 in the lowest bit.  */
14333       if (type == 'p' || type == 'q')
14334         val /= 2;
14335
14336       /* If any of the shifted bits are set, we must use an extended
14337          opcode.  If the address depends on the size of this
14338          instruction, this can lead to a loop, so we arrange to always
14339          use an extended opcode.  We only check this when we are in
14340          the main relaxation loop, when SEC is NULL.  */
14341       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14342         {
14343           fragp->fr_subtype =
14344             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14345           return 1;
14346         }
14347
14348       /* If we are about to mark a frag as extended because the value
14349          is precisely maxtiny + 1, then there is a chance of an
14350          infinite loop as in the following code:
14351              la $4,foo
14352              .skip      1020
14353              .align     2
14354            foo:
14355          In this case when the la is extended, foo is 0x3fc bytes
14356          away, so the la can be shrunk, but then foo is 0x400 away, so
14357          the la must be extended.  To avoid this loop, we mark the
14358          frag as extended if it was small, and is about to become
14359          extended with a value of maxtiny + 1.  */
14360       if (val == ((maxtiny + 1) << op->shift)
14361           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14362           && sec == NULL)
14363         {
14364           fragp->fr_subtype =
14365             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14366           return 1;
14367         }
14368     }
14369   else if (symsec != absolute_section && sec != NULL)
14370     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14371
14372   if ((val & ((1 << op->shift) - 1)) != 0
14373       || val < (mintiny << op->shift)
14374       || val > (maxtiny << op->shift))
14375     return 1;
14376   else
14377     return 0;
14378 }
14379
14380 /* Compute the length of a branch sequence, and adjust the
14381    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14382    worst-case length is computed, with UPDATE being used to indicate
14383    whether an unconditional (-1), branch-likely (+1) or regular (0)
14384    branch is to be computed.  */
14385 static int
14386 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14387 {
14388   bfd_boolean toofar;
14389   int length;
14390
14391   if (fragp
14392       && S_IS_DEFINED (fragp->fr_symbol)
14393       && sec == S_GET_SEGMENT (fragp->fr_symbol))
14394     {
14395       addressT addr;
14396       offsetT val;
14397
14398       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14399
14400       addr = fragp->fr_address + fragp->fr_fix + 4;
14401
14402       val -= addr;
14403
14404       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14405     }
14406   else if (fragp)
14407     /* If the symbol is not defined or it's in a different segment,
14408        assume the user knows what's going on and emit a short
14409        branch.  */
14410     toofar = FALSE;
14411   else
14412     toofar = TRUE;
14413
14414   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14415     fragp->fr_subtype
14416       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_AT (fragp->fr_subtype),
14417                              RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14418                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14419                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14420                              toofar);
14421
14422   length = 4;
14423   if (toofar)
14424     {
14425       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14426         length += 8;
14427
14428       if (mips_pic != NO_PIC)
14429         {
14430           /* Additional space for PIC loading of target address.  */
14431           length += 8;
14432           if (mips_opts.isa == ISA_MIPS1)
14433             /* Additional space for $at-stabilizing nop.  */
14434             length += 4;
14435         }
14436
14437       /* If branch is conditional.  */
14438       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14439         length += 8;
14440     }
14441
14442   return length;
14443 }
14444
14445 /* Estimate the size of a frag before relaxing.  Unless this is the
14446    mips16, we are not really relaxing here, and the final size is
14447    encoded in the subtype information.  For the mips16, we have to
14448    decide whether we are using an extended opcode or not.  */
14449
14450 int
14451 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14452 {
14453   int change;
14454
14455   if (RELAX_BRANCH_P (fragp->fr_subtype))
14456     {
14457
14458       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14459
14460       return fragp->fr_var;
14461     }
14462
14463   if (RELAX_MIPS16_P (fragp->fr_subtype))
14464     /* We don't want to modify the EXTENDED bit here; it might get us
14465        into infinite loops.  We change it only in mips_relax_frag().  */
14466     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14467
14468   if (mips_pic == NO_PIC)
14469     change = nopic_need_relax (fragp->fr_symbol, 0);
14470   else if (mips_pic == SVR4_PIC)
14471     change = pic_need_relax (fragp->fr_symbol, segtype);
14472   else if (mips_pic == VXWORKS_PIC)
14473     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14474     change = 0;
14475   else
14476     abort ();
14477
14478   if (change)
14479     {
14480       fragp->fr_subtype |= RELAX_USE_SECOND;
14481       return -RELAX_FIRST (fragp->fr_subtype);
14482     }
14483   else
14484     return -RELAX_SECOND (fragp->fr_subtype);
14485 }
14486
14487 /* This is called to see whether a reloc against a defined symbol
14488    should be converted into a reloc against a section.  */
14489
14490 int
14491 mips_fix_adjustable (fixS *fixp)
14492 {
14493   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14494       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14495     return 0;
14496
14497   if (fixp->fx_addsy == NULL)
14498     return 1;
14499
14500   /* If symbol SYM is in a mergeable section, relocations of the form
14501      SYM + 0 can usually be made section-relative.  The mergeable data
14502      is then identified by the section offset rather than by the symbol.
14503
14504      However, if we're generating REL LO16 relocations, the offset is split
14505      between the LO16 and parterning high part relocation.  The linker will
14506      need to recalculate the complete offset in order to correctly identify
14507      the merge data.
14508
14509      The linker has traditionally not looked for the parterning high part
14510      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14511      placed anywhere.  Rather than break backwards compatibility by changing
14512      this, it seems better not to force the issue, and instead keep the
14513      original symbol.  This will work with either linker behavior.  */
14514   if ((lo16_reloc_p (fixp->fx_r_type)
14515        || reloc_needs_lo_p (fixp->fx_r_type))
14516       && HAVE_IN_PLACE_ADDENDS
14517       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14518     return 0;
14519
14520   /* There is no place to store an in-place offset for JALR relocations.
14521      Likewise an in-range offset of PC-relative relocations may overflow
14522      the in-place relocatable field if recalculated against the start
14523      address of the symbol's containing section.  */
14524   if (HAVE_IN_PLACE_ADDENDS
14525       && (fixp->fx_pcrel || fixp->fx_r_type == BFD_RELOC_MIPS_JALR))
14526     return 0;
14527
14528 #ifdef OBJ_ELF
14529   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14530      to a floating-point stub.  The same is true for non-R_MIPS16_26
14531      relocations against MIPS16 functions; in this case, the stub becomes
14532      the function's canonical address.
14533
14534      Floating-point stubs are stored in unique .mips16.call.* or
14535      .mips16.fn.* sections.  If a stub T for function F is in section S,
14536      the first relocation in section S must be against F; this is how the
14537      linker determines the target function.  All relocations that might
14538      resolve to T must also be against F.  We therefore have the following
14539      restrictions, which are given in an intentionally-redundant way:
14540
14541        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14542           symbols.
14543
14544        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14545           if that stub might be used.
14546
14547        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14548           symbols.
14549
14550        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14551           that stub might be used.
14552
14553      There is a further restriction:
14554
14555        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14556           on targets with in-place addends; the relocation field cannot
14557           encode the low bit.
14558
14559      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14560      against a MIPS16 symbol.
14561
14562      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14563      relocation against some symbol R, no relocation against R may be
14564      reduced.  (Note that this deals with (2) as well as (1) because
14565      relocations against global symbols will never be reduced on ELF
14566      targets.)  This approach is a little simpler than trying to detect
14567      stub sections, and gives the "all or nothing" per-symbol consistency
14568      that we have for MIPS16 symbols.  */
14569   if (IS_ELF
14570       && fixp->fx_subsy == NULL
14571       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14572           || *symbol_get_tc (fixp->fx_addsy)))
14573     return 0;
14574 #endif
14575
14576   return 1;
14577 }
14578
14579 /* Translate internal representation of relocation info to BFD target
14580    format.  */
14581
14582 arelent **
14583 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14584 {
14585   static arelent *retval[4];
14586   arelent *reloc;
14587   bfd_reloc_code_real_type code;
14588
14589   memset (retval, 0, sizeof(retval));
14590   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14591   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14592   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14593   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14594
14595   if (fixp->fx_pcrel)
14596     {
14597       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14598
14599       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14600          Relocations want only the symbol offset.  */
14601       reloc->addend = fixp->fx_addnumber + reloc->address;
14602       if (!IS_ELF)
14603         {
14604           /* A gruesome hack which is a result of the gruesome gas
14605              reloc handling.  What's worse, for COFF (as opposed to
14606              ECOFF), we might need yet another copy of reloc->address.
14607              See bfd_install_relocation.  */
14608           reloc->addend += reloc->address;
14609         }
14610     }
14611   else
14612     reloc->addend = fixp->fx_addnumber;
14613
14614   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14615      entry to be used in the relocation's section offset.  */
14616   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14617     {
14618       reloc->address = reloc->addend;
14619       reloc->addend = 0;
14620     }
14621
14622   code = fixp->fx_r_type;
14623
14624   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14625   if (reloc->howto == NULL)
14626     {
14627       as_bad_where (fixp->fx_file, fixp->fx_line,
14628                     _("Can not represent %s relocation in this object file format"),
14629                     bfd_get_reloc_code_name (code));
14630       retval[0] = NULL;
14631     }
14632
14633   return retval;
14634 }
14635
14636 /* Relax a machine dependent frag.  This returns the amount by which
14637    the current size of the frag should change.  */
14638
14639 int
14640 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14641 {
14642   if (RELAX_BRANCH_P (fragp->fr_subtype))
14643     {
14644       offsetT old_var = fragp->fr_var;
14645
14646       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14647
14648       return fragp->fr_var - old_var;
14649     }
14650
14651   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14652     return 0;
14653
14654   if (mips16_extended_frag (fragp, NULL, stretch))
14655     {
14656       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14657         return 0;
14658       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14659       return 2;
14660     }
14661   else
14662     {
14663       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14664         return 0;
14665       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14666       return -2;
14667     }
14668
14669   return 0;
14670 }
14671
14672 /* Convert a machine dependent frag.  */
14673
14674 void
14675 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14676 {
14677   if (RELAX_BRANCH_P (fragp->fr_subtype))
14678     {
14679       bfd_byte *buf;
14680       unsigned long insn;
14681       expressionS exp;
14682       fixS *fixp;
14683
14684       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14685
14686       if (target_big_endian)
14687         insn = bfd_getb32 (buf);
14688       else
14689         insn = bfd_getl32 (buf);
14690
14691       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14692         {
14693           /* We generate a fixup instead of applying it right now
14694              because, if there are linker relaxations, we're going to
14695              need the relocations.  */
14696           exp.X_op = O_symbol;
14697           exp.X_add_symbol = fragp->fr_symbol;
14698           exp.X_add_number = fragp->fr_offset;
14699
14700           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14701                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14702           fixp->fx_file = fragp->fr_file;
14703           fixp->fx_line = fragp->fr_line;
14704
14705           md_number_to_chars ((char *) buf, insn, 4);
14706           buf += 4;
14707         }
14708       else
14709         {
14710           int i;
14711
14712           as_warn_where (fragp->fr_file, fragp->fr_line,
14713                          _("Relaxed out-of-range branch into a jump"));
14714
14715           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14716             goto uncond;
14717
14718           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14719             {
14720               /* Reverse the branch.  */
14721               switch ((insn >> 28) & 0xf)
14722                 {
14723                 case 4:
14724                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14725                      have the condition reversed by tweaking a single
14726                      bit, and their opcodes all have 0x4???????.  */
14727                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14728                   insn ^= 0x00010000;
14729                   break;
14730
14731                 case 0:
14732                   /* bltz       0x04000000      bgez    0x04010000
14733                      bltzal     0x04100000      bgezal  0x04110000  */
14734                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14735                   insn ^= 0x00010000;
14736                   break;
14737
14738                 case 1:
14739                   /* beq        0x10000000      bne     0x14000000
14740                      blez       0x18000000      bgtz    0x1c000000  */
14741                   insn ^= 0x04000000;
14742                   break;
14743
14744                 default:
14745                   abort ();
14746                 }
14747             }
14748
14749           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14750             {
14751               /* Clear the and-link bit.  */
14752               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14753
14754               /* bltzal         0x04100000      bgezal  0x04110000
14755                  bltzall        0x04120000      bgezall 0x04130000  */
14756               insn &= ~0x00100000;
14757             }
14758
14759           /* Branch over the branch (if the branch was likely) or the
14760              full jump (not likely case).  Compute the offset from the
14761              current instruction to branch to.  */
14762           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14763             i = 16;
14764           else
14765             {
14766               /* How many bytes in instructions we've already emitted?  */
14767               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14768               /* How many bytes in instructions from here to the end?  */
14769               i = fragp->fr_var - i;
14770             }
14771           /* Convert to instruction count.  */
14772           i >>= 2;
14773           /* Branch counts from the next instruction.  */
14774           i--;
14775           insn |= i;
14776           /* Branch over the jump.  */
14777           md_number_to_chars ((char *) buf, insn, 4);
14778           buf += 4;
14779
14780           /* nop */
14781           md_number_to_chars ((char *) buf, 0, 4);
14782           buf += 4;
14783
14784           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14785             {
14786               /* beql $0, $0, 2f */
14787               insn = 0x50000000;
14788               /* Compute the PC offset from the current instruction to
14789                  the end of the variable frag.  */
14790               /* How many bytes in instructions we've already emitted?  */
14791               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14792               /* How many bytes in instructions from here to the end?  */
14793               i = fragp->fr_var - i;
14794               /* Convert to instruction count.  */
14795               i >>= 2;
14796               /* Don't decrement i, because we want to branch over the
14797                  delay slot.  */
14798
14799               insn |= i;
14800               md_number_to_chars ((char *) buf, insn, 4);
14801               buf += 4;
14802
14803               md_number_to_chars ((char *) buf, 0, 4);
14804               buf += 4;
14805             }
14806
14807         uncond:
14808           if (mips_pic == NO_PIC)
14809             {
14810               /* j or jal.  */
14811               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14812                       ? 0x0c000000 : 0x08000000);
14813               exp.X_op = O_symbol;
14814               exp.X_add_symbol = fragp->fr_symbol;
14815               exp.X_add_number = fragp->fr_offset;
14816
14817               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14818                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14819               fixp->fx_file = fragp->fr_file;
14820               fixp->fx_line = fragp->fr_line;
14821
14822               md_number_to_chars ((char *) buf, insn, 4);
14823               buf += 4;
14824             }
14825           else
14826             {
14827               unsigned long at = RELAX_BRANCH_AT (fragp->fr_subtype);
14828
14829               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14830               insn = HAVE_64BIT_ADDRESSES ? 0xdf800000 : 0x8f800000;
14831               insn |= at << OP_SH_RT;
14832               exp.X_op = O_symbol;
14833               exp.X_add_symbol = fragp->fr_symbol;
14834               exp.X_add_number = fragp->fr_offset;
14835
14836               if (fragp->fr_offset)
14837                 {
14838                   exp.X_add_symbol = make_expr_symbol (&exp);
14839                   exp.X_add_number = 0;
14840                 }
14841
14842               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14843                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14844               fixp->fx_file = fragp->fr_file;
14845               fixp->fx_line = fragp->fr_line;
14846
14847               md_number_to_chars ((char *) buf, insn, 4);
14848               buf += 4;
14849
14850               if (mips_opts.isa == ISA_MIPS1)
14851                 {
14852                   /* nop */
14853                   md_number_to_chars ((char *) buf, 0, 4);
14854                   buf += 4;
14855                 }
14856
14857               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14858               insn = HAVE_64BIT_ADDRESSES ? 0x64000000 : 0x24000000;
14859               insn |= at << OP_SH_RS | at << OP_SH_RT;
14860
14861               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14862                                   4, &exp, FALSE, BFD_RELOC_LO16);
14863               fixp->fx_file = fragp->fr_file;
14864               fixp->fx_line = fragp->fr_line;
14865
14866               md_number_to_chars ((char *) buf, insn, 4);
14867               buf += 4;
14868
14869               /* j(al)r $at.  */
14870               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14871                 insn = 0x0000f809;
14872               else
14873                 insn = 0x00000008;
14874               insn |= at << OP_SH_RS;
14875
14876               md_number_to_chars ((char *) buf, insn, 4);
14877               buf += 4;
14878             }
14879         }
14880
14881       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14882               + fragp->fr_fix + fragp->fr_var);
14883
14884       fragp->fr_fix += fragp->fr_var;
14885
14886       return;
14887     }
14888
14889   if (RELAX_MIPS16_P (fragp->fr_subtype))
14890     {
14891       int type;
14892       const struct mips16_immed_operand *op;
14893       bfd_boolean small, ext;
14894       offsetT val;
14895       bfd_byte *buf;
14896       unsigned long insn;
14897       bfd_boolean use_extend;
14898       unsigned short extend;
14899
14900       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14901       op = mips16_immed_operands;
14902       while (op->type != type)
14903         ++op;
14904
14905       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14906         {
14907           small = FALSE;
14908           ext = TRUE;
14909         }
14910       else
14911         {
14912           small = TRUE;
14913           ext = FALSE;
14914         }
14915
14916       val = resolve_symbol_value (fragp->fr_symbol);
14917       if (op->pcrel)
14918         {
14919           addressT addr;
14920
14921           addr = fragp->fr_address + fragp->fr_fix;
14922
14923           /* The rules for the base address of a PC relative reloc are
14924              complicated; see mips16_extended_frag.  */
14925           if (type == 'p' || type == 'q')
14926             {
14927               addr += 2;
14928               if (ext)
14929                 addr += 2;
14930               /* Ignore the low bit in the target, since it will be
14931                  set for a text label.  */
14932               if ((val & 1) != 0)
14933                 --val;
14934             }
14935           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14936             addr -= 4;
14937           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14938             addr -= 2;
14939
14940           addr &= ~ (addressT) ((1 << op->shift) - 1);
14941           val -= addr;
14942
14943           /* Make sure the section winds up with the alignment we have
14944              assumed.  */
14945           if (op->shift > 0)
14946             record_alignment (asec, op->shift);
14947         }
14948
14949       if (ext
14950           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14951               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14952         as_warn_where (fragp->fr_file, fragp->fr_line,
14953                        _("extended instruction in delay slot"));
14954
14955       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14956
14957       if (target_big_endian)
14958         insn = bfd_getb16 (buf);
14959       else
14960         insn = bfd_getl16 (buf);
14961
14962       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14963                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14964                     small, ext, &insn, &use_extend, &extend);
14965
14966       if (use_extend)
14967         {
14968           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14969           fragp->fr_fix += 2;
14970           buf += 2;
14971         }
14972
14973       md_number_to_chars ((char *) buf, insn, 2);
14974       fragp->fr_fix += 2;
14975       buf += 2;
14976     }
14977   else
14978     {
14979       int first, second;
14980       fixS *fixp;
14981
14982       first = RELAX_FIRST (fragp->fr_subtype);
14983       second = RELAX_SECOND (fragp->fr_subtype);
14984       fixp = (fixS *) fragp->fr_opcode;
14985
14986       /* Possibly emit a warning if we've chosen the longer option.  */
14987       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14988           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14989         {
14990           const char *msg = macro_warning (fragp->fr_subtype);
14991           if (msg != 0)
14992             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14993         }
14994
14995       /* Go through all the fixups for the first sequence.  Disable them
14996          (by marking them as done) if we're going to use the second
14997          sequence instead.  */
14998       while (fixp
14999              && fixp->fx_frag == fragp
15000              && fixp->fx_where < fragp->fr_fix - second)
15001         {
15002           if (fragp->fr_subtype & RELAX_USE_SECOND)
15003             fixp->fx_done = 1;
15004           fixp = fixp->fx_next;
15005         }
15006
15007       /* Go through the fixups for the second sequence.  Disable them if
15008          we're going to use the first sequence, otherwise adjust their
15009          addresses to account for the relaxation.  */
15010       while (fixp && fixp->fx_frag == fragp)
15011         {
15012           if (fragp->fr_subtype & RELAX_USE_SECOND)
15013             fixp->fx_where -= first;
15014           else
15015             fixp->fx_done = 1;
15016           fixp = fixp->fx_next;
15017         }
15018
15019       /* Now modify the frag contents.  */
15020       if (fragp->fr_subtype & RELAX_USE_SECOND)
15021         {
15022           char *start;
15023
15024           start = fragp->fr_literal + fragp->fr_fix - first - second;
15025           memmove (start, start + first, second);
15026           fragp->fr_fix -= first;
15027         }
15028       else
15029         fragp->fr_fix -= second;
15030     }
15031 }
15032
15033 #ifdef OBJ_ELF
15034
15035 /* This function is called after the relocs have been generated.
15036    We've been storing mips16 text labels as odd.  Here we convert them
15037    back to even for the convenience of the debugger.  */
15038
15039 void
15040 mips_frob_file_after_relocs (void)
15041 {
15042   asymbol **syms;
15043   unsigned int count, i;
15044
15045   if (!IS_ELF)
15046     return;
15047
15048   syms = bfd_get_outsymbols (stdoutput);
15049   count = bfd_get_symcount (stdoutput);
15050   for (i = 0; i < count; i++, syms++)
15051     {
15052       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
15053           && ((*syms)->value & 1) != 0)
15054         {
15055           (*syms)->value &= ~1;
15056           /* If the symbol has an odd size, it was probably computed
15057              incorrectly, so adjust that as well.  */
15058           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
15059             ++elf_symbol (*syms)->internal_elf_sym.st_size;
15060         }
15061     }
15062 }
15063
15064 #endif
15065
15066 /* This function is called whenever a label is defined, including fake
15067    labels instantiated off the dot special symbol.  It is used when
15068    handling branch delays; if a branch has a label, we assume we cannot
15069    move it.  This also bumps the value of the symbol by 1 in compressed
15070    code.  */
15071
15072 void
15073 mips_record_label (symbolS *sym)
15074 {
15075   segment_info_type *si = seg_info (now_seg);
15076   struct insn_label_list *l;
15077
15078   if (free_insn_labels == NULL)
15079     l = (struct insn_label_list *) xmalloc (sizeof *l);
15080   else
15081     {
15082       l = free_insn_labels;
15083       free_insn_labels = l->next;
15084     }
15085
15086   l->label = sym;
15087   l->next = si->label_list;
15088   si->label_list = l;
15089 }
15090
15091 /* This function is called as tc_frob_label() whenever a label is defined
15092    and adds a DWARF-2 record we only want for true labels.  */
15093
15094 void
15095 mips_define_label (symbolS *sym)
15096 {
15097   mips_record_label (sym);
15098 #ifdef OBJ_ELF
15099   dwarf2_emit_label (sym);
15100 #endif
15101 }
15102 \f
15103 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
15104
15105 /* Some special processing for a MIPS ELF file.  */
15106
15107 void
15108 mips_elf_final_processing (void)
15109 {
15110   /* Write out the register information.  */
15111   if (mips_abi != N64_ABI)
15112     {
15113       Elf32_RegInfo s;
15114
15115       s.ri_gprmask = mips_gprmask;
15116       s.ri_cprmask[0] = mips_cprmask[0];
15117       s.ri_cprmask[1] = mips_cprmask[1];
15118       s.ri_cprmask[2] = mips_cprmask[2];
15119       s.ri_cprmask[3] = mips_cprmask[3];
15120       /* The gp_value field is set by the MIPS ELF backend.  */
15121
15122       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
15123                                        ((Elf32_External_RegInfo *)
15124                                         mips_regmask_frag));
15125     }
15126   else
15127     {
15128       Elf64_Internal_RegInfo s;
15129
15130       s.ri_gprmask = mips_gprmask;
15131       s.ri_pad = 0;
15132       s.ri_cprmask[0] = mips_cprmask[0];
15133       s.ri_cprmask[1] = mips_cprmask[1];
15134       s.ri_cprmask[2] = mips_cprmask[2];
15135       s.ri_cprmask[3] = mips_cprmask[3];
15136       /* The gp_value field is set by the MIPS ELF backend.  */
15137
15138       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
15139                                        ((Elf64_External_RegInfo *)
15140                                         mips_regmask_frag));
15141     }
15142
15143   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
15144      sort of BFD interface for this.  */
15145   if (mips_any_noreorder)
15146     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
15147   if (mips_pic != NO_PIC)
15148     {
15149     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
15150       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15151     }
15152   if (mips_abicalls)
15153     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
15154
15155   /* Set MIPS ELF flags for ASEs.  */
15156   /* We may need to define a new flag for DSP ASE, and set this flag when
15157      file_ase_dsp is true.  */
15158   /* Same for DSP R2.  */
15159   /* We may need to define a new flag for MT ASE, and set this flag when
15160      file_ase_mt is true.  */
15161   if (file_ase_mips16)
15162     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
15163 #if 0 /* XXX FIXME */
15164   if (file_ase_mips3d)
15165     elf_elfheader (stdoutput)->e_flags |= ???;
15166 #endif
15167   if (file_ase_mdmx)
15168     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
15169
15170   /* Set the MIPS ELF ABI flags.  */
15171   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
15172     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
15173   else if (mips_abi == O64_ABI)
15174     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
15175   else if (mips_abi == EABI_ABI)
15176     {
15177       if (!file_mips_gp32)
15178         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
15179       else
15180         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
15181     }
15182   else if (mips_abi == N32_ABI)
15183     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
15184
15185   /* Nothing to do for N64_ABI.  */
15186
15187   if (mips_32bitmode)
15188     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
15189
15190 #if 0 /* XXX FIXME */
15191   /* 32 bit code with 64 bit FP registers.  */
15192   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
15193     elf_elfheader (stdoutput)->e_flags |= ???;
15194 #endif
15195 }
15196
15197 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
15198 \f
15199 typedef struct proc {
15200   symbolS *func_sym;
15201   symbolS *func_end_sym;
15202   unsigned long reg_mask;
15203   unsigned long reg_offset;
15204   unsigned long fpreg_mask;
15205   unsigned long fpreg_offset;
15206   unsigned long frame_offset;
15207   unsigned long frame_reg;
15208   unsigned long pc_reg;
15209 } procS;
15210
15211 static procS cur_proc;
15212 static procS *cur_proc_ptr;
15213 static int numprocs;
15214
15215 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
15216    nop as "0".  */
15217
15218 char
15219 mips_nop_opcode (void)
15220 {
15221   return seg_info (now_seg)->tc_segment_info_data.mips16;
15222 }
15223
15224 /* Fill in an rs_align_code fragment.  This only needs to do something
15225    for MIPS16 code, where 0 is not a nop.  */
15226
15227 void
15228 mips_handle_align (fragS *fragp)
15229 {
15230   char *p;
15231   int bytes, size, excess;
15232   valueT opcode;
15233
15234   if (fragp->fr_type != rs_align_code)
15235     return;
15236
15237   p = fragp->fr_literal + fragp->fr_fix;
15238   if (*p)
15239     {
15240       opcode = mips16_nop_insn.insn_opcode;
15241       size = 2;
15242     }
15243   else
15244     {
15245       opcode = nop_insn.insn_opcode;
15246       size = 4;
15247     }
15248
15249   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
15250   excess = bytes % size;
15251   if (excess != 0)
15252     {
15253       /* If we're not inserting a whole number of instructions,
15254          pad the end of the fixed part of the frag with zeros.  */
15255       memset (p, 0, excess);
15256       p += excess;
15257       fragp->fr_fix += excess;
15258     }
15259
15260   md_number_to_chars (p, opcode, size);
15261   fragp->fr_var = size;
15262 }
15263
15264 static void
15265 md_obj_begin (void)
15266 {
15267 }
15268
15269 static void
15270 md_obj_end (void)
15271 {
15272   /* Check for premature end, nesting errors, etc.  */
15273   if (cur_proc_ptr)
15274     as_warn (_("missing .end at end of assembly"));
15275 }
15276
15277 static long
15278 get_number (void)
15279 {
15280   int negative = 0;
15281   long val = 0;
15282
15283   if (*input_line_pointer == '-')
15284     {
15285       ++input_line_pointer;
15286       negative = 1;
15287     }
15288   if (!ISDIGIT (*input_line_pointer))
15289     as_bad (_("expected simple number"));
15290   if (input_line_pointer[0] == '0')
15291     {
15292       if (input_line_pointer[1] == 'x')
15293         {
15294           input_line_pointer += 2;
15295           while (ISXDIGIT (*input_line_pointer))
15296             {
15297               val <<= 4;
15298               val |= hex_value (*input_line_pointer++);
15299             }
15300           return negative ? -val : val;
15301         }
15302       else
15303         {
15304           ++input_line_pointer;
15305           while (ISDIGIT (*input_line_pointer))
15306             {
15307               val <<= 3;
15308               val |= *input_line_pointer++ - '0';
15309             }
15310           return negative ? -val : val;
15311         }
15312     }
15313   if (!ISDIGIT (*input_line_pointer))
15314     {
15315       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15316               *input_line_pointer, *input_line_pointer);
15317       as_warn (_("invalid number"));
15318       return -1;
15319     }
15320   while (ISDIGIT (*input_line_pointer))
15321     {
15322       val *= 10;
15323       val += *input_line_pointer++ - '0';
15324     }
15325   return negative ? -val : val;
15326 }
15327
15328 /* The .file directive; just like the usual .file directive, but there
15329    is an initial number which is the ECOFF file index.  In the non-ECOFF
15330    case .file implies DWARF-2.  */
15331
15332 static void
15333 s_mips_file (int x ATTRIBUTE_UNUSED)
15334 {
15335   static int first_file_directive = 0;
15336
15337   if (ECOFF_DEBUGGING)
15338     {
15339       get_number ();
15340       s_app_file (0);
15341     }
15342   else
15343     {
15344       char *filename;
15345
15346       filename = dwarf2_directive_file (0);
15347
15348       /* Versions of GCC up to 3.1 start files with a ".file"
15349          directive even for stabs output.  Make sure that this
15350          ".file" is handled.  Note that you need a version of GCC
15351          after 3.1 in order to support DWARF-2 on MIPS.  */
15352       if (filename != NULL && ! first_file_directive)
15353         {
15354           (void) new_logical_line (filename, -1);
15355           s_app_file_string (filename, 0);
15356         }
15357       first_file_directive = 1;
15358     }
15359 }
15360
15361 /* The .loc directive, implying DWARF-2.  */
15362
15363 static void
15364 s_mips_loc (int x ATTRIBUTE_UNUSED)
15365 {
15366   if (!ECOFF_DEBUGGING)
15367     dwarf2_directive_loc (0);
15368 }
15369
15370 /* The .end directive.  */
15371
15372 static void
15373 s_mips_end (int x ATTRIBUTE_UNUSED)
15374 {
15375   symbolS *p;
15376
15377   /* Following functions need their own .frame and .cprestore directives.  */
15378   mips_frame_reg_valid = 0;
15379   mips_cprestore_valid = 0;
15380
15381   if (!is_end_of_line[(unsigned char) *input_line_pointer])
15382     {
15383       p = get_symbol ();
15384       demand_empty_rest_of_line ();
15385     }
15386   else
15387     p = NULL;
15388
15389   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15390     as_warn (_(".end not in text section"));
15391
15392   if (!cur_proc_ptr)
15393     {
15394       as_warn (_(".end directive without a preceding .ent directive."));
15395       demand_empty_rest_of_line ();
15396       return;
15397     }
15398
15399   if (p != NULL)
15400     {
15401       gas_assert (S_GET_NAME (p));
15402       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15403         as_warn (_(".end symbol does not match .ent symbol."));
15404
15405       if (debug_type == DEBUG_STABS)
15406         stabs_generate_asm_endfunc (S_GET_NAME (p),
15407                                     S_GET_NAME (p));
15408     }
15409   else
15410     as_warn (_(".end directive missing or unknown symbol"));
15411
15412 #ifdef OBJ_ELF
15413   /* Create an expression to calculate the size of the function.  */
15414   if (p && cur_proc_ptr)
15415     {
15416       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15417       expressionS *exp = xmalloc (sizeof (expressionS));
15418
15419       obj->size = exp;
15420       exp->X_op = O_subtract;
15421       exp->X_add_symbol = symbol_temp_new_now ();
15422       exp->X_op_symbol = p;
15423       exp->X_add_number = 0;
15424
15425       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15426     }
15427
15428   /* Generate a .pdr section.  */
15429   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15430     {
15431       segT saved_seg = now_seg;
15432       subsegT saved_subseg = now_subseg;
15433       expressionS exp;
15434       char *fragp;
15435
15436 #ifdef md_flush_pending_output
15437       md_flush_pending_output ();
15438 #endif
15439
15440       gas_assert (pdr_seg);
15441       subseg_set (pdr_seg, 0);
15442
15443       /* Write the symbol.  */
15444       exp.X_op = O_symbol;
15445       exp.X_add_symbol = p;
15446       exp.X_add_number = 0;
15447       emit_expr (&exp, 4);
15448
15449       fragp = frag_more (7 * 4);
15450
15451       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15452       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15453       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15454       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15455       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15456       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15457       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15458
15459       subseg_set (saved_seg, saved_subseg);
15460     }
15461 #endif /* OBJ_ELF */
15462
15463   cur_proc_ptr = NULL;
15464 }
15465
15466 /* The .aent and .ent directives.  */
15467
15468 static void
15469 s_mips_ent (int aent)
15470 {
15471   symbolS *symbolP;
15472
15473   symbolP = get_symbol ();
15474   if (*input_line_pointer == ',')
15475     ++input_line_pointer;
15476   SKIP_WHITESPACE ();
15477   if (ISDIGIT (*input_line_pointer)
15478       || *input_line_pointer == '-')
15479     get_number ();
15480
15481   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15482     as_warn (_(".ent or .aent not in text section."));
15483
15484   if (!aent && cur_proc_ptr)
15485     as_warn (_("missing .end"));
15486
15487   if (!aent)
15488     {
15489       /* This function needs its own .frame and .cprestore directives.  */
15490       mips_frame_reg_valid = 0;
15491       mips_cprestore_valid = 0;
15492
15493       cur_proc_ptr = &cur_proc;
15494       memset (cur_proc_ptr, '\0', sizeof (procS));
15495
15496       cur_proc_ptr->func_sym = symbolP;
15497
15498       ++numprocs;
15499
15500       if (debug_type == DEBUG_STABS)
15501         stabs_generate_asm_func (S_GET_NAME (symbolP),
15502                                  S_GET_NAME (symbolP));
15503     }
15504
15505   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15506
15507   demand_empty_rest_of_line ();
15508 }
15509
15510 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15511    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15512    s_mips_frame is used so that we can set the PDR information correctly.
15513    We can't use the ecoff routines because they make reference to the ecoff
15514    symbol table (in the mdebug section).  */
15515
15516 static void
15517 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15518 {
15519 #ifdef OBJ_ELF
15520   if (IS_ELF && !ECOFF_DEBUGGING)
15521     {
15522       long val;
15523
15524       if (cur_proc_ptr == (procS *) NULL)
15525         {
15526           as_warn (_(".frame outside of .ent"));
15527           demand_empty_rest_of_line ();
15528           return;
15529         }
15530
15531       cur_proc_ptr->frame_reg = tc_get_register (1);
15532
15533       SKIP_WHITESPACE ();
15534       if (*input_line_pointer++ != ','
15535           || get_absolute_expression_and_terminator (&val) != ',')
15536         {
15537           as_warn (_("Bad .frame directive"));
15538           --input_line_pointer;
15539           demand_empty_rest_of_line ();
15540           return;
15541         }
15542
15543       cur_proc_ptr->frame_offset = val;
15544       cur_proc_ptr->pc_reg = tc_get_register (0);
15545
15546       demand_empty_rest_of_line ();
15547     }
15548   else
15549 #endif /* OBJ_ELF */
15550     s_ignore (ignore);
15551 }
15552
15553 /* The .fmask and .mask directives. If the mdebug section is present
15554    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15555    embedded targets, s_mips_mask is used so that we can set the PDR
15556    information correctly. We can't use the ecoff routines because they
15557    make reference to the ecoff symbol table (in the mdebug section).  */
15558
15559 static void
15560 s_mips_mask (int reg_type)
15561 {
15562 #ifdef OBJ_ELF
15563   if (IS_ELF && !ECOFF_DEBUGGING)
15564     {
15565       long mask, off;
15566
15567       if (cur_proc_ptr == (procS *) NULL)
15568         {
15569           as_warn (_(".mask/.fmask outside of .ent"));
15570           demand_empty_rest_of_line ();
15571           return;
15572         }
15573
15574       if (get_absolute_expression_and_terminator (&mask) != ',')
15575         {
15576           as_warn (_("Bad .mask/.fmask directive"));
15577           --input_line_pointer;
15578           demand_empty_rest_of_line ();
15579           return;
15580         }
15581
15582       off = get_absolute_expression ();
15583
15584       if (reg_type == 'F')
15585         {
15586           cur_proc_ptr->fpreg_mask = mask;
15587           cur_proc_ptr->fpreg_offset = off;
15588         }
15589       else
15590         {
15591           cur_proc_ptr->reg_mask = mask;
15592           cur_proc_ptr->reg_offset = off;
15593         }
15594
15595       demand_empty_rest_of_line ();
15596     }
15597   else
15598 #endif /* OBJ_ELF */
15599     s_ignore (reg_type);
15600 }
15601
15602 /* A table describing all the processors gas knows about.  Names are
15603    matched in the order listed.
15604
15605    To ease comparison, please keep this table in the same order as
15606    gcc's mips_cpu_info_table[].  */
15607 static const struct mips_cpu_info mips_cpu_info_table[] =
15608 {
15609   /* Entries for generic ISAs */
15610   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15611   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15612   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15613   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15614   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15615   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15616   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15617   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15618   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15619
15620   /* MIPS I */
15621   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15622   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15623   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15624
15625   /* MIPS II */
15626   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15627
15628   /* MIPS III */
15629   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15630   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15631   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15632   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15633   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15634   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15635   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15636   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15637   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15638   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15639   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15640   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15641   /* ST Microelectronics Loongson 2E and 2F cores */
15642   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15643   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15644
15645   /* MIPS IV */
15646   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15647   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15648   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15649   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15650   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15651   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15652   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15653   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15654   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15655   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15656   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15657   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15658   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15659   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15660   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15661
15662   /* MIPS 32 */
15663   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15664   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15665   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15666   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15667
15668   /* MIPS 32 Release 2 */
15669   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15670   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15671   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15672   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15673   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15674   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15675   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15676   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15677   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15678   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15679   /* Deprecated forms of the above.  */
15680   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15681   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15682   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15683   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15684   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15685   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15686   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15687   /* Deprecated forms of the above.  */
15688   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15689   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15690   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15691   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15692                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15693   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15694                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15695   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15696                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15697   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15698                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15699   /* Deprecated forms of the above.  */
15700   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15701                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15702   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15703                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15704   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15705   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15706                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15707   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15708                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15709   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15710                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15711   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15712                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15713   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15714                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15715   /* Deprecated forms of the above.  */
15716   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15717                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15718   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15719                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15720   /* 1004K cores are multiprocessor versions of the 34K.  */
15721   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15722                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15723   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15724                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15725   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15726                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15727   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15728                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15729
15730   /* MIPS 64 */
15731   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15732   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15733   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15734   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15735
15736   /* Broadcom SB-1 CPU core */
15737   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15738                                                 ISA_MIPS64,     CPU_SB1 },
15739   /* Broadcom SB-1A CPU core */
15740   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15741                                                 ISA_MIPS64,     CPU_SB1 },
15742   
15743   { "loongson3a",     0,                        ISA_MIPS64,     CPU_LOONGSON_3A },
15744
15745   /* MIPS 64 Release 2 */
15746
15747   /* Cavium Networks Octeon CPU core */
15748   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15749
15750   /* RMI Xlr */
15751   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15752
15753   /* End marker */
15754   { NULL, 0, 0, 0 }
15755 };
15756
15757
15758 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15759    with a final "000" replaced by "k".  Ignore case.
15760
15761    Note: this function is shared between GCC and GAS.  */
15762
15763 static bfd_boolean
15764 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15765 {
15766   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15767     given++, canonical++;
15768
15769   return ((*given == 0 && *canonical == 0)
15770           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15771 }
15772
15773
15774 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15775    CPU name.  We've traditionally allowed a lot of variation here.
15776
15777    Note: this function is shared between GCC and GAS.  */
15778
15779 static bfd_boolean
15780 mips_matching_cpu_name_p (const char *canonical, const char *given)
15781 {
15782   /* First see if the name matches exactly, or with a final "000"
15783      turned into "k".  */
15784   if (mips_strict_matching_cpu_name_p (canonical, given))
15785     return TRUE;
15786
15787   /* If not, try comparing based on numerical designation alone.
15788      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15789   if (TOLOWER (*given) == 'r')
15790     given++;
15791   if (!ISDIGIT (*given))
15792     return FALSE;
15793
15794   /* Skip over some well-known prefixes in the canonical name,
15795      hoping to find a number there too.  */
15796   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15797     canonical += 2;
15798   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15799     canonical += 2;
15800   else if (TOLOWER (canonical[0]) == 'r')
15801     canonical += 1;
15802
15803   return mips_strict_matching_cpu_name_p (canonical, given);
15804 }
15805
15806
15807 /* Parse an option that takes the name of a processor as its argument.
15808    OPTION is the name of the option and CPU_STRING is the argument.
15809    Return the corresponding processor enumeration if the CPU_STRING is
15810    recognized, otherwise report an error and return null.
15811
15812    A similar function exists in GCC.  */
15813
15814 static const struct mips_cpu_info *
15815 mips_parse_cpu (const char *option, const char *cpu_string)
15816 {
15817   const struct mips_cpu_info *p;
15818
15819   /* 'from-abi' selects the most compatible architecture for the given
15820      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15821      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15822      version.  Look first at the -mgp options, if given, otherwise base
15823      the choice on MIPS_DEFAULT_64BIT.
15824
15825      Treat NO_ABI like the EABIs.  One reason to do this is that the
15826      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15827      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15828      'mips64', just as we did in the days before 'from-abi'.  */
15829   if (strcasecmp (cpu_string, "from-abi") == 0)
15830     {
15831       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15832         return mips_cpu_info_from_isa (ISA_MIPS1);
15833
15834       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15835         return mips_cpu_info_from_isa (ISA_MIPS3);
15836
15837       if (file_mips_gp32 >= 0)
15838         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15839
15840       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15841                                      ? ISA_MIPS3
15842                                      : ISA_MIPS1);
15843     }
15844
15845   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15846   if (strcasecmp (cpu_string, "default") == 0)
15847     return 0;
15848
15849   for (p = mips_cpu_info_table; p->name != 0; p++)
15850     if (mips_matching_cpu_name_p (p->name, cpu_string))
15851       return p;
15852
15853   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15854   return 0;
15855 }
15856
15857 /* Return the canonical processor information for ISA (a member of the
15858    ISA_MIPS* enumeration).  */
15859
15860 static const struct mips_cpu_info *
15861 mips_cpu_info_from_isa (int isa)
15862 {
15863   int i;
15864
15865   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15866     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15867         && isa == mips_cpu_info_table[i].isa)
15868       return (&mips_cpu_info_table[i]);
15869
15870   return NULL;
15871 }
15872
15873 static const struct mips_cpu_info *
15874 mips_cpu_info_from_arch (int arch)
15875 {
15876   int i;
15877
15878   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15879     if (arch == mips_cpu_info_table[i].cpu)
15880       return (&mips_cpu_info_table[i]);
15881
15882   return NULL;
15883 }
15884 \f
15885 static void
15886 show (FILE *stream, const char *string, int *col_p, int *first_p)
15887 {
15888   if (*first_p)
15889     {
15890       fprintf (stream, "%24s", "");
15891       *col_p = 24;
15892     }
15893   else
15894     {
15895       fprintf (stream, ", ");
15896       *col_p += 2;
15897     }
15898
15899   if (*col_p + strlen (string) > 72)
15900     {
15901       fprintf (stream, "\n%24s", "");
15902       *col_p = 24;
15903     }
15904
15905   fprintf (stream, "%s", string);
15906   *col_p += strlen (string);
15907
15908   *first_p = 0;
15909 }
15910
15911 void
15912 md_show_usage (FILE *stream)
15913 {
15914   int column, first;
15915   size_t i;
15916
15917   fprintf (stream, _("\
15918 MIPS options:\n\
15919 -EB                     generate big endian output\n\
15920 -EL                     generate little endian output\n\
15921 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15922 -G NUM                  allow referencing objects up to NUM bytes\n\
15923                         implicitly with the gp register [default 8]\n"));
15924   fprintf (stream, _("\
15925 -mips1                  generate MIPS ISA I instructions\n\
15926 -mips2                  generate MIPS ISA II instructions\n\
15927 -mips3                  generate MIPS ISA III instructions\n\
15928 -mips4                  generate MIPS ISA IV instructions\n\
15929 -mips5                  generate MIPS ISA V instructions\n\
15930 -mips32                 generate MIPS32 ISA instructions\n\
15931 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15932 -mips64                 generate MIPS64 ISA instructions\n\
15933 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15934 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15935
15936   first = 1;
15937
15938   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15939     show (stream, mips_cpu_info_table[i].name, &column, &first);
15940   show (stream, "from-abi", &column, &first);
15941   fputc ('\n', stream);
15942
15943   fprintf (stream, _("\
15944 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15945 -no-mCPU                don't generate code specific to CPU.\n\
15946                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15947
15948   first = 1;
15949
15950   show (stream, "3900", &column, &first);
15951   show (stream, "4010", &column, &first);
15952   show (stream, "4100", &column, &first);
15953   show (stream, "4650", &column, &first);
15954   fputc ('\n', stream);
15955
15956   fprintf (stream, _("\
15957 -mips16                 generate mips16 instructions\n\
15958 -no-mips16              do not generate mips16 instructions\n"));
15959   fprintf (stream, _("\
15960 -msmartmips             generate smartmips instructions\n\
15961 -mno-smartmips          do not generate smartmips instructions\n"));  
15962   fprintf (stream, _("\
15963 -mdsp                   generate DSP instructions\n\
15964 -mno-dsp                do not generate DSP instructions\n"));
15965   fprintf (stream, _("\
15966 -mdspr2                 generate DSP R2 instructions\n\
15967 -mno-dspr2              do not generate DSP R2 instructions\n"));
15968   fprintf (stream, _("\
15969 -mmt                    generate MT instructions\n\
15970 -mno-mt                 do not generate MT instructions\n"));
15971   fprintf (stream, _("\
15972 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15973 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15974 -mfix-vr4120            work around certain VR4120 errata\n\
15975 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15976 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15977 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15978 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15979 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15980 -msym32                 assume all symbols have 32-bit values\n\
15981 -O0                     remove unneeded NOPs, do not swap branches\n\
15982 -O                      remove unneeded NOPs and swap branches\n\
15983 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15984 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15985   fprintf (stream, _("\
15986 -mhard-float            allow floating-point instructions\n\
15987 -msoft-float            do not allow floating-point instructions\n\
15988 -msingle-float          only allow 32-bit floating-point operations\n\
15989 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15990 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15991                      ));
15992 #ifdef OBJ_ELF
15993   fprintf (stream, _("\
15994 -KPIC, -call_shared     generate SVR4 position independent code\n\
15995 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15996 -mvxworks-pic           generate VxWorks position independent code\n\
15997 -non_shared             do not generate code that can operate with DSOs\n\
15998 -xgot                   assume a 32 bit GOT\n\
15999 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
16000 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
16001                         position dependent (non shared) code\n\
16002 -mabi=ABI               create ABI conformant object file for:\n"));
16003
16004   first = 1;
16005
16006   show (stream, "32", &column, &first);
16007   show (stream, "o64", &column, &first);
16008   show (stream, "n32", &column, &first);
16009   show (stream, "64", &column, &first);
16010   show (stream, "eabi", &column, &first);
16011
16012   fputc ('\n', stream);
16013
16014   fprintf (stream, _("\
16015 -32                     create o32 ABI object file (default)\n\
16016 -n32                    create n32 ABI object file\n\
16017 -64                     create 64 ABI object file\n"));
16018 #endif
16019 }
16020
16021 #ifdef TE_IRIX
16022 enum dwarf2_format
16023 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
16024 {
16025   if (HAVE_64BIT_SYMBOLS)
16026     return dwarf2_format_64bit_irix;
16027   else
16028     return dwarf2_format_32bit;
16029 }
16030 #endif
16031
16032 int
16033 mips_dwarf2_addr_size (void)
16034 {
16035   if (HAVE_64BIT_OBJECTS)
16036     return 8;
16037   else
16038     return 4;
16039 }
16040
16041 /* Standard calling conventions leave the CFA at SP on entry.  */
16042 void
16043 mips_cfi_frame_initial_instructions (void)
16044 {
16045   cfi_add_CFA_def_cfa_register (SP);
16046 }
16047
16048 int
16049 tc_mips_regname_to_dw2regnum (char *regname)
16050 {
16051   unsigned int regnum = -1;
16052   unsigned int reg;
16053
16054   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
16055     regnum = reg;
16056
16057   return regnum;
16058 }