opcodes/
[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 /* Information about an instruction, including its format, operands
125    and fixups.  */
126 struct mips_cl_insn
127 {
128   /* The opcode's entry in mips_opcodes or mips16_opcodes.  */
129   const struct mips_opcode *insn_mo;
130
131   /* True if this is a mips16 instruction and if we want the extended
132      form of INSN_MO.  */
133   bfd_boolean use_extend;
134
135   /* The 16-bit extension instruction to use when USE_EXTEND is true.  */
136   unsigned short extend;
137
138   /* The 16-bit or 32-bit bitstring of the instruction itself.  This is
139      a copy of INSN_MO->match with the operands filled in.  */
140   unsigned long insn_opcode;
141
142   /* The frag that contains the instruction.  */
143   struct frag *frag;
144
145   /* The offset into FRAG of the first instruction byte.  */
146   long where;
147
148   /* The relocs associated with the instruction, if any.  */
149   fixS *fixp[3];
150
151   /* True if this entry cannot be moved from its current position.  */
152   unsigned int fixed_p : 1;
153
154   /* True if this instruction occurred in a .set noreorder block.  */
155   unsigned int noreorder_p : 1;
156
157   /* True for mips16 instructions that jump to an absolute address.  */
158   unsigned int mips16_absolute_jump_p : 1;
159 };
160
161 /* The ABI to use.  */
162 enum mips_abi_level
163 {
164   NO_ABI = 0,
165   O32_ABI,
166   O64_ABI,
167   N32_ABI,
168   N64_ABI,
169   EABI_ABI
170 };
171
172 /* MIPS ABI we are using for this output file.  */
173 static enum mips_abi_level mips_abi = NO_ABI;
174
175 /* Whether or not we have code that can call pic code.  */
176 int mips_abicalls = FALSE;
177
178 /* Whether or not we have code which can be put into a shared
179    library.  */
180 static bfd_boolean mips_in_shared = TRUE;
181
182 /* This is the set of options which may be modified by the .set
183    pseudo-op.  We use a struct so that .set push and .set pop are more
184    reliable.  */
185
186 struct mips_set_options
187 {
188   /* MIPS ISA (Instruction Set Architecture) level.  This is set to -1
189      if it has not been initialized.  Changed by `.set mipsN', and the
190      -mipsN command line option, and the default CPU.  */
191   int isa;
192   /* Enabled Application Specific Extensions (ASEs).  These are set to -1
193      if they have not been initialized.  Changed by `.set <asename>', by
194      command line options, and based on the default architecture.  */
195   int ase_mips3d;
196   int ase_mdmx;
197   int ase_smartmips;
198   int ase_dsp;
199   int ase_dspr2;
200   int ase_mt;
201   /* Whether we are assembling for the mips16 processor.  0 if we are
202      not, 1 if we are, and -1 if the value has not been initialized.
203      Changed by `.set mips16' and `.set nomips16', and the -mips16 and
204      -nomips16 command line options, and the default CPU.  */
205   int mips16;
206   /* Non-zero if we should not reorder instructions.  Changed by `.set
207      reorder' and `.set noreorder'.  */
208   int noreorder;
209   /* Non-zero if we should not permit the register designated "assembler
210      temporary" to be used in instructions.  The value is the register
211      number, normally $at ($1).  Changed by `.set at=REG', `.set noat'
212      (same as `.set at=$0') and `.set at' (same as `.set at=$1').  */
213   unsigned int at;
214   /* Non-zero if we should warn when a macro instruction expands into
215      more than one machine instruction.  Changed by `.set nomacro' and
216      `.set macro'.  */
217   int warn_about_macros;
218   /* Non-zero if we should not move instructions.  Changed by `.set
219      move', `.set volatile', `.set nomove', and `.set novolatile'.  */
220   int nomove;
221   /* Non-zero if we should not optimize branches by moving the target
222      of the branch into the delay slot.  Actually, we don't perform
223      this optimization anyhow.  Changed by `.set bopt' and `.set
224      nobopt'.  */
225   int nobopt;
226   /* Non-zero if we should not autoextend mips16 instructions.
227      Changed by `.set autoextend' and `.set noautoextend'.  */
228   int noautoextend;
229   /* Restrict general purpose registers and floating point registers
230      to 32 bit.  This is initially determined when -mgp32 or -mfp32
231      is passed but can changed if the assembler code uses .set mipsN.  */
232   int gp32;
233   int fp32;
234   /* MIPS architecture (CPU) type.  Changed by .set arch=FOO, the -march
235      command line option, and the default CPU.  */
236   int arch;
237   /* True if ".set sym32" is in effect.  */
238   bfd_boolean sym32;
239   /* True if floating-point operations are not allowed.  Changed by .set
240      softfloat or .set hardfloat, by command line options -msoft-float or
241      -mhard-float.  The default is false.  */
242   bfd_boolean soft_float;
243
244   /* True if only single-precision floating-point operations are allowed.
245      Changed by .set singlefloat or .set doublefloat, command-line options
246      -msingle-float or -mdouble-float.  The default is false.  */
247   bfd_boolean single_float;
248 };
249
250 /* This is the struct we use to hold the current set of options.  Note
251    that we must set the isa field to ISA_UNKNOWN and the ASE fields to
252    -1 to indicate that they have not been initialized.  */
253
254 /* True if -mgp32 was passed.  */
255 static int file_mips_gp32 = -1;
256
257 /* True if -mfp32 was passed.  */
258 static int file_mips_fp32 = -1;
259
260 /* 1 if -msoft-float, 0 if -mhard-float.  The default is 0.  */
261 static int file_mips_soft_float = 0;
262
263 /* 1 if -msingle-float, 0 if -mdouble-float.  The default is 0.   */
264 static int file_mips_single_float = 0;
265
266 static struct mips_set_options mips_opts =
267 {
268   /* isa */ ISA_UNKNOWN, /* ase_mips3d */ -1, /* ase_mdmx */ -1,
269   /* ase_smartmips */ 0, /* ase_dsp */ -1, /* ase_dspr2 */ -1, /* ase_mt */ -1,
270   /* mips16 */ -1, /* noreorder */ 0, /* at */ ATREG,
271   /* warn_about_macros */ 0, /* nomove */ 0, /* nobopt */ 0,
272   /* noautoextend */ 0, /* gp32 */ 0, /* fp32 */ 0, /* arch */ CPU_UNKNOWN,
273   /* sym32 */ FALSE, /* soft_float */ FALSE, /* single_float */ FALSE
274 };
275
276 /* These variables are filled in with the masks of registers used.
277    The object format code reads them and puts them in the appropriate
278    place.  */
279 unsigned long mips_gprmask;
280 unsigned long mips_cprmask[4];
281
282 /* MIPS ISA we are using for this output file.  */
283 static int file_mips_isa = ISA_UNKNOWN;
284
285 /* True if -mips16 was passed or implied by arguments passed on the
286    command line (e.g., by -march).  */
287 static int file_ase_mips16;
288
289 #define ISA_SUPPORTS_MIPS16E (mips_opts.isa == ISA_MIPS32               \
290                               || mips_opts.isa == ISA_MIPS32R2          \
291                               || mips_opts.isa == ISA_MIPS64            \
292                               || mips_opts.isa == ISA_MIPS64R2)
293
294 /* True if we want to create R_MIPS_JALR for jalr $25.  */
295 #ifdef TE_IRIX
296 #define MIPS_JALR_HINT_P(EXPR) HAVE_NEWABI
297 #else
298 /* As a GNU extension, we use R_MIPS_JALR for o32 too.  However,
299    because there's no place for any addend, the only acceptable
300    expression is a bare symbol.  */
301 #define MIPS_JALR_HINT_P(EXPR) \
302   (!HAVE_IN_PLACE_ADDENDS \
303    || ((EXPR)->X_op == O_symbol && (EXPR)->X_add_number == 0))
304 #endif
305
306 /* True if -mips3d was passed or implied by arguments passed on the
307    command line (e.g., by -march).  */
308 static int file_ase_mips3d;
309
310 /* True if -mdmx was passed or implied by arguments passed on the
311    command line (e.g., by -march).  */
312 static int file_ase_mdmx;
313
314 /* True if -msmartmips was passed or implied by arguments passed on the
315    command line (e.g., by -march).  */
316 static int file_ase_smartmips;
317
318 #define ISA_SUPPORTS_SMARTMIPS (mips_opts.isa == ISA_MIPS32             \
319                                 || mips_opts.isa == ISA_MIPS32R2)
320
321 /* True if -mdsp was passed or implied by arguments passed on the
322    command line (e.g., by -march).  */
323 static int file_ase_dsp;
324
325 #define ISA_SUPPORTS_DSP_ASE (mips_opts.isa == ISA_MIPS32R2             \
326                               || mips_opts.isa == ISA_MIPS64R2)
327
328 #define ISA_SUPPORTS_DSP64_ASE (mips_opts.isa == ISA_MIPS64R2)
329
330 /* True if -mdspr2 was passed or implied by arguments passed on the
331    command line (e.g., by -march).  */
332 static int file_ase_dspr2;
333
334 #define ISA_SUPPORTS_DSPR2_ASE (mips_opts.isa == ISA_MIPS32R2           \
335                                 || mips_opts.isa == ISA_MIPS64R2)
336
337 /* True if -mmt was passed or implied by arguments passed on the
338    command line (e.g., by -march).  */
339 static int file_ase_mt;
340
341 #define ISA_SUPPORTS_MT_ASE (mips_opts.isa == ISA_MIPS32R2              \
342                              || mips_opts.isa == ISA_MIPS64R2)
343
344 /* The argument of the -march= flag.  The architecture we are assembling.  */
345 static int file_mips_arch = CPU_UNKNOWN;
346 static const char *mips_arch_string;
347
348 /* The argument of the -mtune= flag.  The architecture for which we
349    are optimizing.  */
350 static int mips_tune = CPU_UNKNOWN;
351 static const char *mips_tune_string;
352
353 /* True when generating 32-bit code for a 64-bit processor.  */
354 static int mips_32bitmode = 0;
355
356 /* True if the given ABI requires 32-bit registers.  */
357 #define ABI_NEEDS_32BIT_REGS(ABI) ((ABI) == O32_ABI)
358
359 /* Likewise 64-bit registers.  */
360 #define ABI_NEEDS_64BIT_REGS(ABI)       \
361   ((ABI) == N32_ABI                     \
362    || (ABI) == N64_ABI                  \
363    || (ABI) == O64_ABI)
364
365 /*  Return true if ISA supports 64 bit wide gp registers.  */
366 #define ISA_HAS_64BIT_REGS(ISA)         \
367   ((ISA) == ISA_MIPS3                   \
368    || (ISA) == ISA_MIPS4                \
369    || (ISA) == ISA_MIPS5                \
370    || (ISA) == ISA_MIPS64               \
371    || (ISA) == ISA_MIPS64R2)
372
373 /*  Return true if ISA supports 64 bit wide float registers.  */
374 #define ISA_HAS_64BIT_FPRS(ISA)         \
375   ((ISA) == ISA_MIPS3                   \
376    || (ISA) == ISA_MIPS4                \
377    || (ISA) == ISA_MIPS5                \
378    || (ISA) == ISA_MIPS32R2             \
379    || (ISA) == ISA_MIPS64               \
380    || (ISA) == ISA_MIPS64R2)
381
382 /* Return true if ISA supports 64-bit right rotate (dror et al.)
383    instructions.  */
384 #define ISA_HAS_DROR(ISA)               \
385   ((ISA) == ISA_MIPS64R2)
386
387 /* Return true if ISA supports 32-bit right rotate (ror et al.)
388    instructions.  */
389 #define ISA_HAS_ROR(ISA)                \
390   ((ISA) == ISA_MIPS32R2                \
391    || (ISA) == ISA_MIPS64R2             \
392    || mips_opts.ase_smartmips)
393
394 /* Return true if ISA supports single-precision floats in odd registers.  */
395 #define ISA_HAS_ODD_SINGLE_FPR(ISA)     \
396   ((ISA) == ISA_MIPS32                  \
397    || (ISA) == ISA_MIPS32R2             \
398    || (ISA) == ISA_MIPS64               \
399    || (ISA) == ISA_MIPS64R2)
400
401 /* Return true if ISA supports move to/from high part of a 64-bit
402    floating-point register. */
403 #define ISA_HAS_MXHC1(ISA)              \
404   ((ISA) == ISA_MIPS32R2                \
405    || (ISA) == ISA_MIPS64R2)
406
407 #define HAVE_32BIT_GPRS                            \
408     (mips_opts.gp32 || !ISA_HAS_64BIT_REGS (mips_opts.isa))
409
410 #define HAVE_32BIT_FPRS                            \
411     (mips_opts.fp32 || !ISA_HAS_64BIT_FPRS (mips_opts.isa))
412
413 #define HAVE_64BIT_GPRS (!HAVE_32BIT_GPRS)
414 #define HAVE_64BIT_FPRS (!HAVE_32BIT_FPRS)
415
416 #define HAVE_NEWABI (mips_abi == N32_ABI || mips_abi == N64_ABI)
417
418 #define HAVE_64BIT_OBJECTS (mips_abi == N64_ABI)
419
420 /* True if relocations are stored in-place.  */
421 #define HAVE_IN_PLACE_ADDENDS (!HAVE_NEWABI)
422
423 /* The ABI-derived address size.  */
424 #define HAVE_64BIT_ADDRESSES \
425   (HAVE_64BIT_GPRS && (mips_abi == EABI_ABI || mips_abi == N64_ABI))
426 #define HAVE_32BIT_ADDRESSES (!HAVE_64BIT_ADDRESSES)
427
428 /* The size of symbolic constants (i.e., expressions of the form
429    "SYMBOL" or "SYMBOL + OFFSET").  */
430 #define HAVE_32BIT_SYMBOLS \
431   (HAVE_32BIT_ADDRESSES || !HAVE_64BIT_OBJECTS || mips_opts.sym32)
432 #define HAVE_64BIT_SYMBOLS (!HAVE_32BIT_SYMBOLS)
433
434 /* Addresses are loaded in different ways, depending on the address size
435    in use.  The n32 ABI Documentation also mandates the use of additions
436    with overflow checking, but existing implementations don't follow it.  */
437 #define ADDRESS_ADD_INSN                                                \
438    (HAVE_32BIT_ADDRESSES ? "addu" : "daddu")
439
440 #define ADDRESS_ADDI_INSN                                               \
441    (HAVE_32BIT_ADDRESSES ? "addiu" : "daddiu")
442
443 #define ADDRESS_LOAD_INSN                                               \
444    (HAVE_32BIT_ADDRESSES ? "lw" : "ld")
445
446 #define ADDRESS_STORE_INSN                                              \
447    (HAVE_32BIT_ADDRESSES ? "sw" : "sd")
448
449 /* Return true if the given CPU supports the MIPS16 ASE.  */
450 #define CPU_HAS_MIPS16(cpu)                                             \
451    (strncmp (TARGET_CPU, "mips16", sizeof ("mips16") - 1) == 0          \
452     || strncmp (TARGET_CANONICAL, "mips-lsi-elf", sizeof ("mips-lsi-elf") - 1) == 0)
453
454 /* True if CPU has a dror instruction.  */
455 #define CPU_HAS_DROR(CPU)       ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500)
456
457 /* True if CPU has a ror instruction.  */
458 #define CPU_HAS_ROR(CPU)        CPU_HAS_DROR (CPU)
459
460 /* True if CPU has seq/sne and seqi/snei instructions.  */
461 #define CPU_HAS_SEQ(CPU)        ((CPU) == CPU_OCTEON)
462
463 /* True if CPU does not implement the all the coprocessor insns.  For these
464    CPUs only those COP insns are accepted that are explicitly marked to be
465    available on the CPU.  ISA membership for COP insns is ignored.  */
466 #define NO_ISA_COP(CPU)         ((CPU) == CPU_OCTEON)
467
468 /* True if mflo and mfhi can be immediately followed by instructions
469    which write to the HI and LO registers.
470
471    According to MIPS specifications, MIPS ISAs I, II, and III need
472    (at least) two instructions between the reads of HI/LO and
473    instructions which write them, and later ISAs do not.  Contradicting
474    the MIPS specifications, some MIPS IV processor user manuals (e.g.
475    the UM for the NEC Vr5000) document needing the instructions between
476    HI/LO reads and writes, as well.  Therefore, we declare only MIPS32,
477    MIPS64 and later ISAs to have the interlocks, plus any specific
478    earlier-ISA CPUs for which CPU documentation declares that the
479    instructions are really interlocked.  */
480 #define hilo_interlocks \
481   (mips_opts.isa == ISA_MIPS32                        \
482    || mips_opts.isa == ISA_MIPS32R2                   \
483    || mips_opts.isa == ISA_MIPS64                     \
484    || mips_opts.isa == ISA_MIPS64R2                   \
485    || mips_opts.arch == CPU_R4010                     \
486    || mips_opts.arch == CPU_R10000                    \
487    || mips_opts.arch == CPU_R12000                    \
488    || mips_opts.arch == CPU_R14000                    \
489    || mips_opts.arch == CPU_R16000                    \
490    || mips_opts.arch == CPU_RM7000                    \
491    || mips_opts.arch == CPU_VR5500                    \
492    )
493
494 /* Whether the processor uses hardware interlocks to protect reads
495    from the GPRs after they are loaded from memory, and thus does not
496    require nops to be inserted.  This applies to instructions marked
497    INSN_LOAD_MEMORY_DELAY.  These nops are only required at MIPS ISA
498    level I.  */
499 #define gpr_interlocks \
500   (mips_opts.isa != ISA_MIPS1  \
501    || mips_opts.arch == CPU_R3900)
502
503 /* Whether the processor uses hardware interlocks to avoid delays
504    required by coprocessor instructions, and thus does not require
505    nops to be inserted.  This applies to instructions marked
506    INSN_LOAD_COPROC_DELAY, INSN_COPROC_MOVE_DELAY, and to delays
507    between instructions marked INSN_WRITE_COND_CODE and ones marked
508    INSN_READ_COND_CODE.  These nops are only required at MIPS ISA
509    levels I, II, and III.  */
510 /* Itbl support may require additional care here.  */
511 #define cop_interlocks                                \
512   ((mips_opts.isa != ISA_MIPS1                        \
513     && mips_opts.isa != ISA_MIPS2                     \
514     && mips_opts.isa != ISA_MIPS3)                    \
515    || mips_opts.arch == CPU_R4300                     \
516    )
517
518 /* Whether the processor uses hardware interlocks to protect reads
519    from coprocessor registers after they are loaded from memory, and
520    thus does not require nops to be inserted.  This applies to
521    instructions marked INSN_COPROC_MEMORY_DELAY.  These nops are only
522    requires at MIPS ISA level I.  */
523 #define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1)
524
525 /* Is this a mfhi or mflo instruction?  */
526 #define MF_HILO_INSN(PINFO) \
527   ((PINFO & INSN_READ_HI) || (PINFO & INSN_READ_LO))
528
529 /* Returns true for a (non floating-point) coprocessor instruction.  Reading
530    or writing the condition code is only possible on the coprocessors and
531    these insns are not marked with INSN_COP.  Thus for these insns use the
532    condition-code flags.  */
533 #define COP_INSN(PINFO)                                                 \
534   (PINFO != INSN_MACRO                                                  \
535    && ((PINFO) & (FP_S | FP_D)) == 0                                    \
536    && ((PINFO) & (INSN_COP | INSN_READ_COND_CODE | INSN_WRITE_COND_CODE)))
537
538 /* MIPS PIC level.  */
539
540 enum mips_pic_level mips_pic;
541
542 /* 1 if we should generate 32 bit offsets from the $gp register in
543    SVR4_PIC mode.  Currently has no meaning in other modes.  */
544 static int mips_big_got = 0;
545
546 /* 1 if trap instructions should used for overflow rather than break
547    instructions.  */
548 static int mips_trap = 0;
549
550 /* 1 if double width floating point constants should not be constructed
551    by assembling two single width halves into two single width floating
552    point registers which just happen to alias the double width destination
553    register.  On some architectures this aliasing can be disabled by a bit
554    in the status register, and the setting of this bit cannot be determined
555    automatically at assemble time.  */
556 static int mips_disable_float_construction;
557
558 /* Non-zero if any .set noreorder directives were used.  */
559
560 static int mips_any_noreorder;
561
562 /* Non-zero if nops should be inserted when the register referenced in
563    an mfhi/mflo instruction is read in the next two instructions.  */
564 static int mips_7000_hilo_fix;
565
566 /* The size of objects in the small data section.  */
567 static unsigned int g_switch_value = 8;
568 /* Whether the -G option was used.  */
569 static int g_switch_seen = 0;
570
571 #define N_RMASK 0xc4
572 #define N_VFP   0xd4
573
574 /* If we can determine in advance that GP optimization won't be
575    possible, we can skip the relaxation stuff that tries to produce
576    GP-relative references.  This makes delay slot optimization work
577    better.
578
579    This function can only provide a guess, but it seems to work for
580    gcc output.  It needs to guess right for gcc, otherwise gcc
581    will put what it thinks is a GP-relative instruction in a branch
582    delay slot.
583
584    I don't know if a fix is needed for the SVR4_PIC mode.  I've only
585    fixed it for the non-PIC mode.  KR 95/04/07  */
586 static int nopic_need_relax (symbolS *, int);
587
588 /* handle of the OPCODE hash table */
589 static struct hash_control *op_hash = NULL;
590
591 /* The opcode hash table we use for the mips16.  */
592 static struct hash_control *mips16_op_hash = NULL;
593
594 /* This array holds the chars that always start a comment.  If the
595     pre-processor is disabled, these aren't very useful */
596 const char comment_chars[] = "#";
597
598 /* This array holds the chars that only start a comment at the beginning of
599    a line.  If the line seems to have the form '# 123 filename'
600    .line and .file directives will appear in the pre-processed output */
601 /* Note that input_file.c hand checks for '#' at the beginning of the
602    first line of the input file.  This is because the compiler outputs
603    #NO_APP at the beginning of its output.  */
604 /* Also note that C style comments are always supported.  */
605 const char line_comment_chars[] = "#";
606
607 /* This array holds machine specific line separator characters.  */
608 const char line_separator_chars[] = ";";
609
610 /* Chars that can be used to separate mant from exp in floating point nums */
611 const char EXP_CHARS[] = "eE";
612
613 /* Chars that mean this number is a floating point constant */
614 /* As in 0f12.456 */
615 /* or    0d1.2345e12 */
616 const char FLT_CHARS[] = "rRsSfFdDxXpP";
617
618 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
619    changed in read.c .  Ideally it shouldn't have to know about it at all,
620    but nothing is ideal around here.
621  */
622
623 static char *insn_error;
624
625 static int auto_align = 1;
626
627 /* When outputting SVR4 PIC code, the assembler needs to know the
628    offset in the stack frame from which to restore the $gp register.
629    This is set by the .cprestore pseudo-op, and saved in this
630    variable.  */
631 static offsetT mips_cprestore_offset = -1;
632
633 /* Similar for NewABI PIC code, where $gp is callee-saved.  NewABI has some
634    more optimizations, it can use a register value instead of a memory-saved
635    offset and even an other register than $gp as global pointer.  */
636 static offsetT mips_cpreturn_offset = -1;
637 static int mips_cpreturn_register = -1;
638 static int mips_gp_register = GP;
639 static int mips_gprel_offset = 0;
640
641 /* Whether mips_cprestore_offset has been set in the current function
642    (or whether it has already been warned about, if not).  */
643 static int mips_cprestore_valid = 0;
644
645 /* This is the register which holds the stack frame, as set by the
646    .frame pseudo-op.  This is needed to implement .cprestore.  */
647 static int mips_frame_reg = SP;
648
649 /* Whether mips_frame_reg has been set in the current function
650    (or whether it has already been warned about, if not).  */
651 static int mips_frame_reg_valid = 0;
652
653 /* To output NOP instructions correctly, we need to keep information
654    about the previous two instructions.  */
655
656 /* Whether we are optimizing.  The default value of 2 means to remove
657    unneeded NOPs and swap branch instructions when possible.  A value
658    of 1 means to not swap branches.  A value of 0 means to always
659    insert NOPs.  */
660 static int mips_optimize = 2;
661
662 /* Debugging level.  -g sets this to 2.  -gN sets this to N.  -g0 is
663    equivalent to seeing no -g option at all.  */
664 static int mips_debug = 0;
665
666 /* The maximum number of NOPs needed to avoid the VR4130 mflo/mfhi errata.  */
667 #define MAX_VR4130_NOPS 4
668
669 /* The maximum number of NOPs needed to fill delay slots.  */
670 #define MAX_DELAY_NOPS 2
671
672 /* The maximum number of NOPs needed for any purpose.  */
673 #define MAX_NOPS 4
674
675 /* A list of previous instructions, with index 0 being the most recent.
676    We need to look back MAX_NOPS instructions when filling delay slots
677    or working around processor errata.  We need to look back one
678    instruction further if we're thinking about using history[0] to
679    fill a branch delay slot.  */
680 static struct mips_cl_insn history[1 + MAX_NOPS];
681
682 /* Nop instructions used by emit_nop.  */
683 static struct mips_cl_insn nop_insn, mips16_nop_insn;
684
685 /* The appropriate nop for the current mode.  */
686 #define NOP_INSN (mips_opts.mips16 ? &mips16_nop_insn : &nop_insn)
687
688 /* If this is set, it points to a frag holding nop instructions which
689    were inserted before the start of a noreorder section.  If those
690    nops turn out to be unnecessary, the size of the frag can be
691    decreased.  */
692 static fragS *prev_nop_frag;
693
694 /* The number of nop instructions we created in prev_nop_frag.  */
695 static int prev_nop_frag_holds;
696
697 /* The number of nop instructions that we know we need in
698    prev_nop_frag.  */
699 static int prev_nop_frag_required;
700
701 /* The number of instructions we've seen since prev_nop_frag.  */
702 static int prev_nop_frag_since;
703
704 /* For ECOFF and ELF, relocations against symbols are done in two
705    parts, with a HI relocation and a LO relocation.  Each relocation
706    has only 16 bits of space to store an addend.  This means that in
707    order for the linker to handle carries correctly, it must be able
708    to locate both the HI and the LO relocation.  This means that the
709    relocations must appear in order in the relocation table.
710
711    In order to implement this, we keep track of each unmatched HI
712    relocation.  We then sort them so that they immediately precede the
713    corresponding LO relocation.  */
714
715 struct mips_hi_fixup
716 {
717   /* Next HI fixup.  */
718   struct mips_hi_fixup *next;
719   /* This fixup.  */
720   fixS *fixp;
721   /* The section this fixup is in.  */
722   segT seg;
723 };
724
725 /* The list of unmatched HI relocs.  */
726
727 static struct mips_hi_fixup *mips_hi_fixup_list;
728
729 /* The frag containing the last explicit relocation operator.
730    Null if explicit relocations have not been used.  */
731
732 static fragS *prev_reloc_op_frag;
733
734 /* Map normal MIPS register numbers to mips16 register numbers.  */
735
736 #define X ILLEGAL_REG
737 static const int mips32_to_16_reg_map[] =
738 {
739   X, X, 2, 3, 4, 5, 6, 7,
740   X, X, X, X, X, X, X, X,
741   0, 1, X, X, X, X, X, X,
742   X, X, X, X, X, X, X, X
743 };
744 #undef X
745
746 /* Map mips16 register numbers to normal MIPS register numbers.  */
747
748 static const unsigned int mips16_to_32_reg_map[] =
749 {
750   16, 17, 2, 3, 4, 5, 6, 7
751 };
752
753 /* Classifies the kind of instructions we're interested in when
754    implementing -mfix-vr4120.  */
755 enum fix_vr4120_class
756 {
757   FIX_VR4120_MACC,
758   FIX_VR4120_DMACC,
759   FIX_VR4120_MULT,
760   FIX_VR4120_DMULT,
761   FIX_VR4120_DIV,
762   FIX_VR4120_MTHILO,
763   NUM_FIX_VR4120_CLASSES
764 };
765
766 /* ...likewise -mfix-loongson2f-jump.  */
767 static bfd_boolean mips_fix_loongson2f_jump;
768
769 /* ...likewise -mfix-loongson2f-nop.  */
770 static bfd_boolean mips_fix_loongson2f_nop;
771
772 /* True if -mfix-loongson2f-nop or -mfix-loongson2f-jump passed.  */
773 static bfd_boolean mips_fix_loongson2f;
774
775 /* Given two FIX_VR4120_* values X and Y, bit Y of element X is set if
776    there must be at least one other instruction between an instruction
777    of type X and an instruction of type Y.  */
778 static unsigned int vr4120_conflicts[NUM_FIX_VR4120_CLASSES];
779
780 /* True if -mfix-vr4120 is in force.  */
781 static int mips_fix_vr4120;
782
783 /* ...likewise -mfix-vr4130.  */
784 static int mips_fix_vr4130;
785
786 /* ...likewise -mfix-24k.  */
787 static int mips_fix_24k;
788
789 /* ...likewise -mfix-cn63xxp1 */
790 static bfd_boolean mips_fix_cn63xxp1;
791
792 /* We don't relax branches by default, since this causes us to expand
793    `la .l2 - .l1' if there's a branch between .l1 and .l2, because we
794    fail to compute the offset before expanding the macro to the most
795    efficient expansion.  */
796
797 static int mips_relax_branch;
798 \f
799 /* The expansion of many macros depends on the type of symbol that
800    they refer to.  For example, when generating position-dependent code,
801    a macro that refers to a symbol may have two different expansions,
802    one which uses GP-relative addresses and one which uses absolute
803    addresses.  When generating SVR4-style PIC, a macro may have
804    different expansions for local and global symbols.
805
806    We handle these situations by generating both sequences and putting
807    them in variant frags.  In position-dependent code, the first sequence
808    will be the GP-relative one and the second sequence will be the
809    absolute one.  In SVR4 PIC, the first sequence will be for global
810    symbols and the second will be for local symbols.
811
812    The frag's "subtype" is RELAX_ENCODE (FIRST, SECOND), where FIRST and
813    SECOND are the lengths of the two sequences in bytes.  These fields
814    can be extracted using RELAX_FIRST() and RELAX_SECOND().  In addition,
815    the subtype has the following flags:
816
817    RELAX_USE_SECOND
818         Set if it has been decided that we should use the second
819         sequence instead of the first.
820
821    RELAX_SECOND_LONGER
822         Set in the first variant frag if the macro's second implementation
823         is longer than its first.  This refers to the macro as a whole,
824         not an individual relaxation.
825
826    RELAX_NOMACRO
827         Set in the first variant frag if the macro appeared in a .set nomacro
828         block and if one alternative requires a warning but the other does not.
829
830    RELAX_DELAY_SLOT
831         Like RELAX_NOMACRO, but indicates that the macro appears in a branch
832         delay slot.
833
834    The frag's "opcode" points to the first fixup for relaxable code.
835
836    Relaxable macros are generated using a sequence such as:
837
838       relax_start (SYMBOL);
839       ... generate first expansion ...
840       relax_switch ();
841       ... generate second expansion ...
842       relax_end ();
843
844    The code and fixups for the unwanted alternative are discarded
845    by md_convert_frag.  */
846 #define RELAX_ENCODE(FIRST, SECOND) (((FIRST) << 8) | (SECOND))
847
848 #define RELAX_FIRST(X) (((X) >> 8) & 0xff)
849 #define RELAX_SECOND(X) ((X) & 0xff)
850 #define RELAX_USE_SECOND 0x10000
851 #define RELAX_SECOND_LONGER 0x20000
852 #define RELAX_NOMACRO 0x40000
853 #define RELAX_DELAY_SLOT 0x80000
854
855 /* Branch without likely bit.  If label is out of range, we turn:
856
857         beq reg1, reg2, label
858         delay slot
859
860    into
861
862         bne reg1, reg2, 0f
863         nop
864         j label
865      0: delay slot
866
867    with the following opcode replacements:
868
869         beq <-> bne
870         blez <-> bgtz
871         bltz <-> bgez
872         bc1f <-> bc1t
873
874         bltzal <-> bgezal  (with jal label instead of j label)
875
876    Even though keeping the delay slot instruction in the delay slot of
877    the branch would be more efficient, it would be very tricky to do
878    correctly, because we'd have to introduce a variable frag *after*
879    the delay slot instruction, and expand that instead.  Let's do it
880    the easy way for now, even if the branch-not-taken case now costs
881    one additional instruction.  Out-of-range branches are not supposed
882    to be common, anyway.
883
884    Branch likely.  If label is out of range, we turn:
885
886         beql reg1, reg2, label
887         delay slot (annulled if branch not taken)
888
889    into
890
891         beql reg1, reg2, 1f
892         nop
893         beql $0, $0, 2f
894         nop
895      1: j[al] label
896         delay slot (executed only if branch taken)
897      2:
898
899    It would be possible to generate a shorter sequence by losing the
900    likely bit, generating something like:
901
902         bne reg1, reg2, 0f
903         nop
904         j[al] label
905         delay slot (executed only if branch taken)
906      0:
907
908         beql -> bne
909         bnel -> beq
910         blezl -> bgtz
911         bgtzl -> blez
912         bltzl -> bgez
913         bgezl -> bltz
914         bc1fl -> bc1t
915         bc1tl -> bc1f
916
917         bltzall -> bgezal  (with jal label instead of j label)
918         bgezall -> bltzal  (ditto)
919
920
921    but it's not clear that it would actually improve performance.  */
922 #define RELAX_BRANCH_ENCODE(uncond, likely, link, toofar) \
923   ((relax_substateT) \
924    (0xc0000000 \
925     | ((toofar) ? 1 : 0) \
926     | ((link) ? 2 : 0) \
927     | ((likely) ? 4 : 0) \
928     | ((uncond) ? 8 : 0)))
929 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
930 #define RELAX_BRANCH_UNCOND(i) (((i) & 8) != 0)
931 #define RELAX_BRANCH_LIKELY(i) (((i) & 4) != 0)
932 #define RELAX_BRANCH_LINK(i) (((i) & 2) != 0)
933 #define RELAX_BRANCH_TOOFAR(i) (((i) & 1) != 0)
934
935 /* For mips16 code, we use an entirely different form of relaxation.
936    mips16 supports two versions of most instructions which take
937    immediate values: a small one which takes some small value, and a
938    larger one which takes a 16 bit value.  Since branches also follow
939    this pattern, relaxing these values is required.
940
941    We can assemble both mips16 and normal MIPS code in a single
942    object.  Therefore, we need to support this type of relaxation at
943    the same time that we support the relaxation described above.  We
944    use the high bit of the subtype field to distinguish these cases.
945
946    The information we store for this type of relaxation is the
947    argument code found in the opcode file for this relocation, whether
948    the user explicitly requested a small or extended form, and whether
949    the relocation is in a jump or jal delay slot.  That tells us the
950    size of the value, and how it should be stored.  We also store
951    whether the fragment is considered to be extended or not.  We also
952    store whether this is known to be a branch to a different section,
953    whether we have tried to relax this frag yet, and whether we have
954    ever extended a PC relative fragment because of a shift count.  */
955 #define RELAX_MIPS16_ENCODE(type, small, ext, dslot, jal_dslot) \
956   (0x80000000                                                   \
957    | ((type) & 0xff)                                            \
958    | ((small) ? 0x100 : 0)                                      \
959    | ((ext) ? 0x200 : 0)                                        \
960    | ((dslot) ? 0x400 : 0)                                      \
961    | ((jal_dslot) ? 0x800 : 0))
962 #define RELAX_MIPS16_P(i) (((i) & 0xc0000000) == 0x80000000)
963 #define RELAX_MIPS16_TYPE(i) ((i) & 0xff)
964 #define RELAX_MIPS16_USER_SMALL(i) (((i) & 0x100) != 0)
965 #define RELAX_MIPS16_USER_EXT(i) (((i) & 0x200) != 0)
966 #define RELAX_MIPS16_DSLOT(i) (((i) & 0x400) != 0)
967 #define RELAX_MIPS16_JAL_DSLOT(i) (((i) & 0x800) != 0)
968 #define RELAX_MIPS16_EXTENDED(i) (((i) & 0x1000) != 0)
969 #define RELAX_MIPS16_MARK_EXTENDED(i) ((i) | 0x1000)
970 #define RELAX_MIPS16_CLEAR_EXTENDED(i) ((i) &~ 0x1000)
971 #define RELAX_MIPS16_LONG_BRANCH(i) (((i) & 0x2000) != 0)
972 #define RELAX_MIPS16_MARK_LONG_BRANCH(i) ((i) | 0x2000)
973 #define RELAX_MIPS16_CLEAR_LONG_BRANCH(i) ((i) &~ 0x2000)
974
975 /* Is the given value a sign-extended 32-bit value?  */
976 #define IS_SEXT_32BIT_NUM(x)                                            \
977   (((x) &~ (offsetT) 0x7fffffff) == 0                                   \
978    || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
979
980 /* Is the given value a sign-extended 16-bit value?  */
981 #define IS_SEXT_16BIT_NUM(x)                                            \
982   (((x) &~ (offsetT) 0x7fff) == 0                                       \
983    || (((x) &~ (offsetT) 0x7fff) == ~ (offsetT) 0x7fff))
984
985 /* Is the given value a zero-extended 32-bit value?  Or a negated one?  */
986 #define IS_ZEXT_32BIT_NUM(x)                                            \
987   (((x) &~ (offsetT) 0xffffffff) == 0                                   \
988    || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
989
990 /* Replace bits MASK << SHIFT of STRUCT with the equivalent bits in
991    VALUE << SHIFT.  VALUE is evaluated exactly once.  */
992 #define INSERT_BITS(STRUCT, VALUE, MASK, SHIFT) \
993   (STRUCT) = (((STRUCT) & ~((MASK) << (SHIFT))) \
994               | (((VALUE) & (MASK)) << (SHIFT)))
995
996 /* Extract bits MASK << SHIFT from STRUCT and shift them right
997    SHIFT places.  */
998 #define EXTRACT_BITS(STRUCT, MASK, SHIFT) \
999   (((STRUCT) >> (SHIFT)) & (MASK))
1000
1001 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
1002    INSN is a mips_cl_insn structure and VALUE is evaluated exactly once.
1003
1004    include/opcode/mips.h specifies operand fields using the macros
1005    OP_MASK_<FIELD> and OP_SH_<FIELD>.  The MIPS16 equivalents start
1006    with "MIPS16OP" instead of "OP".  */
1007 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
1008   INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
1009 #define MIPS16_INSERT_OPERAND(FIELD, INSN, VALUE) \
1010   INSERT_BITS ((INSN).insn_opcode, VALUE, \
1011                 MIPS16OP_MASK_##FIELD, MIPS16OP_SH_##FIELD)
1012
1013 /* Extract the operand given by FIELD from mips_cl_insn INSN.  */
1014 #define EXTRACT_OPERAND(FIELD, INSN) \
1015   EXTRACT_BITS ((INSN).insn_opcode, OP_MASK_##FIELD, OP_SH_##FIELD)
1016 #define MIPS16_EXTRACT_OPERAND(FIELD, INSN) \
1017   EXTRACT_BITS ((INSN).insn_opcode, \
1018                 MIPS16OP_MASK_##FIELD, \
1019                 MIPS16OP_SH_##FIELD)
1020 \f
1021 /* Global variables used when generating relaxable macros.  See the
1022    comment above RELAX_ENCODE for more details about how relaxation
1023    is used.  */
1024 static struct {
1025   /* 0 if we're not emitting a relaxable macro.
1026      1 if we're emitting the first of the two relaxation alternatives.
1027      2 if we're emitting the second alternative.  */
1028   int sequence;
1029
1030   /* The first relaxable fixup in the current frag.  (In other words,
1031      the first fixup that refers to relaxable code.)  */
1032   fixS *first_fixup;
1033
1034   /* sizes[0] says how many bytes of the first alternative are stored in
1035      the current frag.  Likewise sizes[1] for the second alternative.  */
1036   unsigned int sizes[2];
1037
1038   /* The symbol on which the choice of sequence depends.  */
1039   symbolS *symbol;
1040 } mips_relax;
1041 \f
1042 /* Global variables used to decide whether a macro needs a warning.  */
1043 static struct {
1044   /* True if the macro is in a branch delay slot.  */
1045   bfd_boolean delay_slot_p;
1046
1047   /* For relaxable macros, sizes[0] is the length of the first alternative
1048      in bytes and sizes[1] is the length of the second alternative.
1049      For non-relaxable macros, both elements give the length of the
1050      macro in bytes.  */
1051   unsigned int sizes[2];
1052
1053   /* The first variant frag for this macro.  */
1054   fragS *first_frag;
1055 } mips_macro_warning;
1056 \f
1057 /* Prototypes for static functions.  */
1058
1059 #define internalError()                                                 \
1060     as_fatal (_("internal Error, line %d, %s"), __LINE__, __FILE__)
1061
1062 enum mips_regclass { MIPS_GR_REG, MIPS_FP_REG, MIPS16_REG };
1063
1064 static void append_insn
1065   (struct mips_cl_insn *, expressionS *, bfd_reloc_code_real_type *);
1066 static void mips_no_prev_insn (void);
1067 static void macro_build (expressionS *, const char *, const char *, ...);
1068 static void mips16_macro_build
1069   (expressionS *, const char *, const char *, va_list *);
1070 static void load_register (int, expressionS *, int);
1071 static void macro_start (void);
1072 static void macro_end (void);
1073 static void macro (struct mips_cl_insn * ip);
1074 static void mips16_macro (struct mips_cl_insn * ip);
1075 #ifdef LOSING_COMPILER
1076 static void macro2 (struct mips_cl_insn * ip);
1077 #endif
1078 static void mips_ip (char *str, struct mips_cl_insn * ip);
1079 static void mips16_ip (char *str, struct mips_cl_insn * ip);
1080 static void mips16_immed
1081   (char *, unsigned int, int, offsetT, bfd_boolean, bfd_boolean, bfd_boolean,
1082    unsigned long *, bfd_boolean *, unsigned short *);
1083 static size_t my_getSmallExpression
1084   (expressionS *, bfd_reloc_code_real_type *, char *);
1085 static void my_getExpression (expressionS *, char *);
1086 static void s_align (int);
1087 static void s_change_sec (int);
1088 static void s_change_section (int);
1089 static void s_cons (int);
1090 static void s_float_cons (int);
1091 static void s_mips_globl (int);
1092 static void s_option (int);
1093 static void s_mipsset (int);
1094 static void s_abicalls (int);
1095 static void s_cpload (int);
1096 static void s_cpsetup (int);
1097 static void s_cplocal (int);
1098 static void s_cprestore (int);
1099 static void s_cpreturn (int);
1100 static void s_dtprelword (int);
1101 static void s_dtpreldword (int);
1102 static void s_gpvalue (int);
1103 static void s_gpword (int);
1104 static void s_gpdword (int);
1105 static void s_cpadd (int);
1106 static void s_insn (int);
1107 static void md_obj_begin (void);
1108 static void md_obj_end (void);
1109 static void s_mips_ent (int);
1110 static void s_mips_end (int);
1111 static void s_mips_frame (int);
1112 static void s_mips_mask (int reg_type);
1113 static void s_mips_stab (int);
1114 static void s_mips_weakext (int);
1115 static void s_mips_file (int);
1116 static void s_mips_loc (int);
1117 static bfd_boolean pic_need_relax (symbolS *, asection *);
1118 static int relaxed_branch_length (fragS *, asection *, int);
1119 static int validate_mips_insn (const struct mips_opcode *);
1120
1121 /* Table and functions used to map between CPU/ISA names, and
1122    ISA levels, and CPU numbers.  */
1123
1124 struct mips_cpu_info
1125 {
1126   const char *name;           /* CPU or ISA name.  */
1127   int flags;                  /* ASEs available, or ISA flag.  */
1128   int isa;                    /* ISA level.  */
1129   int cpu;                    /* CPU number (default CPU if ISA).  */
1130 };
1131
1132 #define MIPS_CPU_IS_ISA         0x0001  /* Is this an ISA?  (If 0, a CPU.) */
1133 #define MIPS_CPU_ASE_SMARTMIPS  0x0002  /* CPU implements SmartMIPS ASE */
1134 #define MIPS_CPU_ASE_DSP        0x0004  /* CPU implements DSP ASE */
1135 #define MIPS_CPU_ASE_MT         0x0008  /* CPU implements MT ASE */
1136 #define MIPS_CPU_ASE_MIPS3D     0x0010  /* CPU implements MIPS-3D ASE */
1137 #define MIPS_CPU_ASE_MDMX       0x0020  /* CPU implements MDMX ASE */
1138 #define MIPS_CPU_ASE_DSPR2      0x0040  /* CPU implements DSP R2 ASE */
1139
1140 static const struct mips_cpu_info *mips_parse_cpu (const char *, const char *);
1141 static const struct mips_cpu_info *mips_cpu_info_from_isa (int);
1142 static const struct mips_cpu_info *mips_cpu_info_from_arch (int);
1143 \f
1144 /* Pseudo-op table.
1145
1146    The following pseudo-ops from the Kane and Heinrich MIPS book
1147    should be defined here, but are currently unsupported: .alias,
1148    .galive, .gjaldef, .gjrlive, .livereg, .noalias.
1149
1150    The following pseudo-ops from the Kane and Heinrich MIPS book are
1151    specific to the type of debugging information being generated, and
1152    should be defined by the object format: .aent, .begin, .bend,
1153    .bgnb, .end, .endb, .ent, .fmask, .frame, .loc, .mask, .verstamp,
1154    .vreg.
1155
1156    The following pseudo-ops from the Kane and Heinrich MIPS book are
1157    not MIPS CPU specific, but are also not specific to the object file
1158    format.  This file is probably the best place to define them, but
1159    they are not currently supported: .asm0, .endr, .lab, .struct.  */
1160
1161 static const pseudo_typeS mips_pseudo_table[] =
1162 {
1163   /* MIPS specific pseudo-ops.  */
1164   {"option", s_option, 0},
1165   {"set", s_mipsset, 0},
1166   {"rdata", s_change_sec, 'r'},
1167   {"sdata", s_change_sec, 's'},
1168   {"livereg", s_ignore, 0},
1169   {"abicalls", s_abicalls, 0},
1170   {"cpload", s_cpload, 0},
1171   {"cpsetup", s_cpsetup, 0},
1172   {"cplocal", s_cplocal, 0},
1173   {"cprestore", s_cprestore, 0},
1174   {"cpreturn", s_cpreturn, 0},
1175   {"dtprelword", s_dtprelword, 0},
1176   {"dtpreldword", s_dtpreldword, 0},
1177   {"gpvalue", s_gpvalue, 0},
1178   {"gpword", s_gpword, 0},
1179   {"gpdword", s_gpdword, 0},
1180   {"cpadd", s_cpadd, 0},
1181   {"insn", s_insn, 0},
1182
1183   /* Relatively generic pseudo-ops that happen to be used on MIPS
1184      chips.  */
1185   {"asciiz", stringer, 8 + 1},
1186   {"bss", s_change_sec, 'b'},
1187   {"err", s_err, 0},
1188   {"half", s_cons, 1},
1189   {"dword", s_cons, 3},
1190   {"weakext", s_mips_weakext, 0},
1191   {"origin", s_org, 0},
1192   {"repeat", s_rept, 0},
1193
1194   /* For MIPS this is non-standard, but we define it for consistency.  */
1195   {"sbss", s_change_sec, 'B'},
1196
1197   /* These pseudo-ops are defined in read.c, but must be overridden
1198      here for one reason or another.  */
1199   {"align", s_align, 0},
1200   {"byte", s_cons, 0},
1201   {"data", s_change_sec, 'd'},
1202   {"double", s_float_cons, 'd'},
1203   {"float", s_float_cons, 'f'},
1204   {"globl", s_mips_globl, 0},
1205   {"global", s_mips_globl, 0},
1206   {"hword", s_cons, 1},
1207   {"int", s_cons, 2},
1208   {"long", s_cons, 2},
1209   {"octa", s_cons, 4},
1210   {"quad", s_cons, 3},
1211   {"section", s_change_section, 0},
1212   {"short", s_cons, 1},
1213   {"single", s_float_cons, 'f'},
1214   {"stabn", s_mips_stab, 'n'},
1215   {"text", s_change_sec, 't'},
1216   {"word", s_cons, 2},
1217
1218   { "extern", ecoff_directive_extern, 0},
1219
1220   { NULL, NULL, 0 },
1221 };
1222
1223 static const pseudo_typeS mips_nonecoff_pseudo_table[] =
1224 {
1225   /* These pseudo-ops should be defined by the object file format.
1226      However, a.out doesn't support them, so we have versions here.  */
1227   {"aent", s_mips_ent, 1},
1228   {"bgnb", s_ignore, 0},
1229   {"end", s_mips_end, 0},
1230   {"endb", s_ignore, 0},
1231   {"ent", s_mips_ent, 0},
1232   {"file", s_mips_file, 0},
1233   {"fmask", s_mips_mask, 'F'},
1234   {"frame", s_mips_frame, 0},
1235   {"loc", s_mips_loc, 0},
1236   {"mask", s_mips_mask, 'R'},
1237   {"verstamp", s_ignore, 0},
1238   { NULL, NULL, 0 },
1239 };
1240
1241 extern void pop_insert (const pseudo_typeS *);
1242
1243 void
1244 mips_pop_insert (void)
1245 {
1246   pop_insert (mips_pseudo_table);
1247   if (! ECOFF_DEBUGGING)
1248     pop_insert (mips_nonecoff_pseudo_table);
1249 }
1250 \f
1251 /* Symbols labelling the current insn.  */
1252
1253 struct insn_label_list
1254 {
1255   struct insn_label_list *next;
1256   symbolS *label;
1257 };
1258
1259 static struct insn_label_list *free_insn_labels;
1260 #define label_list tc_segment_info_data.labels
1261
1262 static void mips_clear_insn_labels (void);
1263
1264 static inline void
1265 mips_clear_insn_labels (void)
1266 {
1267   register struct insn_label_list **pl;
1268   segment_info_type *si;
1269
1270   if (now_seg)
1271     {
1272       for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1273         ;
1274       
1275       si = seg_info (now_seg);
1276       *pl = si->label_list;
1277       si->label_list = NULL;
1278     }
1279 }
1280
1281 \f
1282 static char *expr_end;
1283
1284 /* Expressions which appear in instructions.  These are set by
1285    mips_ip.  */
1286
1287 static expressionS imm_expr;
1288 static expressionS imm2_expr;
1289 static expressionS offset_expr;
1290
1291 /* Relocs associated with imm_expr and offset_expr.  */
1292
1293 static bfd_reloc_code_real_type imm_reloc[3]
1294   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1295 static bfd_reloc_code_real_type offset_reloc[3]
1296   = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
1297
1298 /* These are set by mips16_ip if an explicit extension is used.  */
1299
1300 static bfd_boolean mips16_small, mips16_ext;
1301
1302 #ifdef OBJ_ELF
1303 /* The pdr segment for per procedure frame/regmask info.  Not used for
1304    ECOFF debugging.  */
1305
1306 static segT pdr_seg;
1307 #endif
1308
1309 /* The default target format to use.  */
1310
1311 const char *
1312 mips_target_format (void)
1313 {
1314   switch (OUTPUT_FLAVOR)
1315     {
1316     case bfd_target_ecoff_flavour:
1317       return target_big_endian ? "ecoff-bigmips" : ECOFF_LITTLE_FORMAT;
1318     case bfd_target_coff_flavour:
1319       return "pe-mips";
1320     case bfd_target_elf_flavour:
1321 #ifdef TE_VXWORKS
1322       if (!HAVE_64BIT_OBJECTS && !HAVE_NEWABI)
1323         return (target_big_endian
1324                 ? "elf32-bigmips-vxworks"
1325                 : "elf32-littlemips-vxworks");
1326 #endif
1327 #ifdef TE_TMIPS
1328       /* This is traditional mips.  */
1329       return (target_big_endian
1330               ? (HAVE_64BIT_OBJECTS
1331                  ? "elf64-tradbigmips"
1332                  : (HAVE_NEWABI
1333                     ? "elf32-ntradbigmips" : "elf32-tradbigmips"))
1334               : (HAVE_64BIT_OBJECTS
1335                  ? "elf64-tradlittlemips"
1336                  : (HAVE_NEWABI
1337                     ? "elf32-ntradlittlemips" : "elf32-tradlittlemips")));
1338 #else
1339       return (target_big_endian
1340               ? (HAVE_64BIT_OBJECTS
1341                  ? "elf64-bigmips"
1342                  : (HAVE_NEWABI
1343                     ? "elf32-nbigmips" : "elf32-bigmips"))
1344               : (HAVE_64BIT_OBJECTS
1345                  ? "elf64-littlemips"
1346                  : (HAVE_NEWABI
1347                     ? "elf32-nlittlemips" : "elf32-littlemips")));
1348 #endif
1349     default:
1350       abort ();
1351       return NULL;
1352     }
1353 }
1354
1355 /* Return the length of instruction INSN.  */
1356
1357 static inline unsigned int
1358 insn_length (const struct mips_cl_insn *insn)
1359 {
1360   if (!mips_opts.mips16)
1361     return 4;
1362   return insn->mips16_absolute_jump_p || insn->use_extend ? 4 : 2;
1363 }
1364
1365 /* Initialise INSN from opcode entry MO.  Leave its position unspecified.  */
1366
1367 static void
1368 create_insn (struct mips_cl_insn *insn, const struct mips_opcode *mo)
1369 {
1370   size_t i;
1371
1372   insn->insn_mo = mo;
1373   insn->use_extend = FALSE;
1374   insn->extend = 0;
1375   insn->insn_opcode = mo->match;
1376   insn->frag = NULL;
1377   insn->where = 0;
1378   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1379     insn->fixp[i] = NULL;
1380   insn->fixed_p = (mips_opts.noreorder > 0);
1381   insn->noreorder_p = (mips_opts.noreorder > 0);
1382   insn->mips16_absolute_jump_p = 0;
1383 }
1384
1385 /* Record the current MIPS16 mode in now_seg.  */
1386
1387 static void
1388 mips_record_mips16_mode (void)
1389 {
1390   segment_info_type *si;
1391
1392   si = seg_info (now_seg);
1393   if (si->tc_segment_info_data.mips16 != mips_opts.mips16)
1394     si->tc_segment_info_data.mips16 = mips_opts.mips16;
1395 }
1396
1397 /* Install INSN at the location specified by its "frag" and "where" fields.  */
1398
1399 static void
1400 install_insn (const struct mips_cl_insn *insn)
1401 {
1402   char *f = insn->frag->fr_literal + insn->where;
1403   if (!mips_opts.mips16)
1404     md_number_to_chars (f, insn->insn_opcode, 4);
1405   else if (insn->mips16_absolute_jump_p)
1406     {
1407       md_number_to_chars (f, insn->insn_opcode >> 16, 2);
1408       md_number_to_chars (f + 2, insn->insn_opcode & 0xffff, 2);
1409     }
1410   else
1411     {
1412       if (insn->use_extend)
1413         {
1414           md_number_to_chars (f, 0xf000 | insn->extend, 2);
1415           f += 2;
1416         }
1417       md_number_to_chars (f, insn->insn_opcode, 2);
1418     }
1419   mips_record_mips16_mode ();
1420 }
1421
1422 /* Move INSN to offset WHERE in FRAG.  Adjust the fixups accordingly
1423    and install the opcode in the new location.  */
1424
1425 static void
1426 move_insn (struct mips_cl_insn *insn, fragS *frag, long where)
1427 {
1428   size_t i;
1429
1430   insn->frag = frag;
1431   insn->where = where;
1432   for (i = 0; i < ARRAY_SIZE (insn->fixp); i++)
1433     if (insn->fixp[i] != NULL)
1434       {
1435         insn->fixp[i]->fx_frag = frag;
1436         insn->fixp[i]->fx_where = where;
1437       }
1438   install_insn (insn);
1439 }
1440
1441 /* Add INSN to the end of the output.  */
1442
1443 static void
1444 add_fixed_insn (struct mips_cl_insn *insn)
1445 {
1446   char *f = frag_more (insn_length (insn));
1447   move_insn (insn, frag_now, f - frag_now->fr_literal);
1448 }
1449
1450 /* Start a variant frag and move INSN to the start of the variant part,
1451    marking it as fixed.  The other arguments are as for frag_var.  */
1452
1453 static void
1454 add_relaxed_insn (struct mips_cl_insn *insn, int max_chars, int var,
1455                   relax_substateT subtype, symbolS *symbol, offsetT offset)
1456 {
1457   frag_grow (max_chars);
1458   move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
1459   insn->fixed_p = 1;
1460   frag_var (rs_machine_dependent, max_chars, var,
1461             subtype, symbol, offset, NULL);
1462 }
1463
1464 /* Insert N copies of INSN into the history buffer, starting at
1465    position FIRST.  Neither FIRST nor N need to be clipped.  */
1466
1467 static void
1468 insert_into_history (unsigned int first, unsigned int n,
1469                      const struct mips_cl_insn *insn)
1470 {
1471   if (mips_relax.sequence != 2)
1472     {
1473       unsigned int i;
1474
1475       for (i = ARRAY_SIZE (history); i-- > first;)
1476         if (i >= first + n)
1477           history[i] = history[i - n];
1478         else
1479           history[i] = *insn;
1480     }
1481 }
1482
1483 /* Emit a nop instruction, recording it in the history buffer.  */
1484
1485 static void
1486 emit_nop (void)
1487 {
1488   add_fixed_insn (NOP_INSN);
1489   insert_into_history (0, 1, NOP_INSN);
1490 }
1491
1492 /* Initialize vr4120_conflicts.  There is a bit of duplication here:
1493    the idea is to make it obvious at a glance that each errata is
1494    included.  */
1495
1496 static void
1497 init_vr4120_conflicts (void)
1498 {
1499 #define CONFLICT(FIRST, SECOND) \
1500     vr4120_conflicts[FIX_VR4120_##FIRST] |= 1 << FIX_VR4120_##SECOND
1501
1502   /* Errata 21 - [D]DIV[U] after [D]MACC */
1503   CONFLICT (MACC, DIV);
1504   CONFLICT (DMACC, DIV);
1505
1506   /* Errata 23 - Continuous DMULT[U]/DMACC instructions.  */
1507   CONFLICT (DMULT, DMULT);
1508   CONFLICT (DMULT, DMACC);
1509   CONFLICT (DMACC, DMULT);
1510   CONFLICT (DMACC, DMACC);
1511
1512   /* Errata 24 - MT{LO,HI} after [D]MACC */
1513   CONFLICT (MACC, MTHILO);
1514   CONFLICT (DMACC, MTHILO);
1515
1516   /* VR4181A errata MD(1): "If a MULT, MULTU, DMULT or DMULTU
1517      instruction is executed immediately after a MACC or DMACC
1518      instruction, the result of [either instruction] is incorrect."  */
1519   CONFLICT (MACC, MULT);
1520   CONFLICT (MACC, DMULT);
1521   CONFLICT (DMACC, MULT);
1522   CONFLICT (DMACC, DMULT);
1523
1524   /* VR4181A errata MD(4): "If a MACC or DMACC instruction is
1525      executed immediately after a DMULT, DMULTU, DIV, DIVU,
1526      DDIV or DDIVU instruction, the result of the MACC or
1527      DMACC instruction is incorrect.".  */
1528   CONFLICT (DMULT, MACC);
1529   CONFLICT (DMULT, DMACC);
1530   CONFLICT (DIV, MACC);
1531   CONFLICT (DIV, DMACC);
1532
1533 #undef CONFLICT
1534 }
1535
1536 struct regname {
1537   const char *name;
1538   unsigned int num;
1539 };
1540
1541 #define RTYPE_MASK      0x1ff00
1542 #define RTYPE_NUM       0x00100
1543 #define RTYPE_FPU       0x00200
1544 #define RTYPE_FCC       0x00400
1545 #define RTYPE_VEC       0x00800
1546 #define RTYPE_GP        0x01000
1547 #define RTYPE_CP0       0x02000
1548 #define RTYPE_PC        0x04000
1549 #define RTYPE_ACC       0x08000
1550 #define RTYPE_CCC       0x10000
1551 #define RNUM_MASK       0x000ff
1552 #define RWARN           0x80000
1553
1554 #define GENERIC_REGISTER_NUMBERS \
1555     {"$0",      RTYPE_NUM | 0},  \
1556     {"$1",      RTYPE_NUM | 1},  \
1557     {"$2",      RTYPE_NUM | 2},  \
1558     {"$3",      RTYPE_NUM | 3},  \
1559     {"$4",      RTYPE_NUM | 4},  \
1560     {"$5",      RTYPE_NUM | 5},  \
1561     {"$6",      RTYPE_NUM | 6},  \
1562     {"$7",      RTYPE_NUM | 7},  \
1563     {"$8",      RTYPE_NUM | 8},  \
1564     {"$9",      RTYPE_NUM | 9},  \
1565     {"$10",     RTYPE_NUM | 10}, \
1566     {"$11",     RTYPE_NUM | 11}, \
1567     {"$12",     RTYPE_NUM | 12}, \
1568     {"$13",     RTYPE_NUM | 13}, \
1569     {"$14",     RTYPE_NUM | 14}, \
1570     {"$15",     RTYPE_NUM | 15}, \
1571     {"$16",     RTYPE_NUM | 16}, \
1572     {"$17",     RTYPE_NUM | 17}, \
1573     {"$18",     RTYPE_NUM | 18}, \
1574     {"$19",     RTYPE_NUM | 19}, \
1575     {"$20",     RTYPE_NUM | 20}, \
1576     {"$21",     RTYPE_NUM | 21}, \
1577     {"$22",     RTYPE_NUM | 22}, \
1578     {"$23",     RTYPE_NUM | 23}, \
1579     {"$24",     RTYPE_NUM | 24}, \
1580     {"$25",     RTYPE_NUM | 25}, \
1581     {"$26",     RTYPE_NUM | 26}, \
1582     {"$27",     RTYPE_NUM | 27}, \
1583     {"$28",     RTYPE_NUM | 28}, \
1584     {"$29",     RTYPE_NUM | 29}, \
1585     {"$30",     RTYPE_NUM | 30}, \
1586     {"$31",     RTYPE_NUM | 31} 
1587
1588 #define FPU_REGISTER_NAMES       \
1589     {"$f0",     RTYPE_FPU | 0},  \
1590     {"$f1",     RTYPE_FPU | 1},  \
1591     {"$f2",     RTYPE_FPU | 2},  \
1592     {"$f3",     RTYPE_FPU | 3},  \
1593     {"$f4",     RTYPE_FPU | 4},  \
1594     {"$f5",     RTYPE_FPU | 5},  \
1595     {"$f6",     RTYPE_FPU | 6},  \
1596     {"$f7",     RTYPE_FPU | 7},  \
1597     {"$f8",     RTYPE_FPU | 8},  \
1598     {"$f9",     RTYPE_FPU | 9},  \
1599     {"$f10",    RTYPE_FPU | 10}, \
1600     {"$f11",    RTYPE_FPU | 11}, \
1601     {"$f12",    RTYPE_FPU | 12}, \
1602     {"$f13",    RTYPE_FPU | 13}, \
1603     {"$f14",    RTYPE_FPU | 14}, \
1604     {"$f15",    RTYPE_FPU | 15}, \
1605     {"$f16",    RTYPE_FPU | 16}, \
1606     {"$f17",    RTYPE_FPU | 17}, \
1607     {"$f18",    RTYPE_FPU | 18}, \
1608     {"$f19",    RTYPE_FPU | 19}, \
1609     {"$f20",    RTYPE_FPU | 20}, \
1610     {"$f21",    RTYPE_FPU | 21}, \
1611     {"$f22",    RTYPE_FPU | 22}, \
1612     {"$f23",    RTYPE_FPU | 23}, \
1613     {"$f24",    RTYPE_FPU | 24}, \
1614     {"$f25",    RTYPE_FPU | 25}, \
1615     {"$f26",    RTYPE_FPU | 26}, \
1616     {"$f27",    RTYPE_FPU | 27}, \
1617     {"$f28",    RTYPE_FPU | 28}, \
1618     {"$f29",    RTYPE_FPU | 29}, \
1619     {"$f30",    RTYPE_FPU | 30}, \
1620     {"$f31",    RTYPE_FPU | 31}
1621
1622 #define FPU_CONDITION_CODE_NAMES \
1623     {"$fcc0",   RTYPE_FCC | 0},  \
1624     {"$fcc1",   RTYPE_FCC | 1},  \
1625     {"$fcc2",   RTYPE_FCC | 2},  \
1626     {"$fcc3",   RTYPE_FCC | 3},  \
1627     {"$fcc4",   RTYPE_FCC | 4},  \
1628     {"$fcc5",   RTYPE_FCC | 5},  \
1629     {"$fcc6",   RTYPE_FCC | 6},  \
1630     {"$fcc7",   RTYPE_FCC | 7}
1631
1632 #define COPROC_CONDITION_CODE_NAMES         \
1633     {"$cc0",    RTYPE_FCC | RTYPE_CCC | 0}, \
1634     {"$cc1",    RTYPE_FCC | RTYPE_CCC | 1}, \
1635     {"$cc2",    RTYPE_FCC | RTYPE_CCC | 2}, \
1636     {"$cc3",    RTYPE_FCC | RTYPE_CCC | 3}, \
1637     {"$cc4",    RTYPE_FCC | RTYPE_CCC | 4}, \
1638     {"$cc5",    RTYPE_FCC | RTYPE_CCC | 5}, \
1639     {"$cc6",    RTYPE_FCC | RTYPE_CCC | 6}, \
1640     {"$cc7",    RTYPE_FCC | RTYPE_CCC | 7}
1641
1642 #define N32N64_SYMBOLIC_REGISTER_NAMES \
1643     {"$a4",     RTYPE_GP | 8},  \
1644     {"$a5",     RTYPE_GP | 9},  \
1645     {"$a6",     RTYPE_GP | 10}, \
1646     {"$a7",     RTYPE_GP | 11}, \
1647     {"$ta0",    RTYPE_GP | 8},  /* alias for $a4 */ \
1648     {"$ta1",    RTYPE_GP | 9},  /* alias for $a5 */ \
1649     {"$ta2",    RTYPE_GP | 10}, /* alias for $a6 */ \
1650     {"$ta3",    RTYPE_GP | 11}, /* alias for $a7 */ \
1651     {"$t0",     RTYPE_GP | 12}, \
1652     {"$t1",     RTYPE_GP | 13}, \
1653     {"$t2",     RTYPE_GP | 14}, \
1654     {"$t3",     RTYPE_GP | 15}
1655
1656 #define O32_SYMBOLIC_REGISTER_NAMES \
1657     {"$t0",     RTYPE_GP | 8},  \
1658     {"$t1",     RTYPE_GP | 9},  \
1659     {"$t2",     RTYPE_GP | 10}, \
1660     {"$t3",     RTYPE_GP | 11}, \
1661     {"$t4",     RTYPE_GP | 12}, \
1662     {"$t5",     RTYPE_GP | 13}, \
1663     {"$t6",     RTYPE_GP | 14}, \
1664     {"$t7",     RTYPE_GP | 15}, \
1665     {"$ta0",    RTYPE_GP | 12}, /* alias for $t4 */ \
1666     {"$ta1",    RTYPE_GP | 13}, /* alias for $t5 */ \
1667     {"$ta2",    RTYPE_GP | 14}, /* alias for $t6 */ \
1668     {"$ta3",    RTYPE_GP | 15}  /* alias for $t7 */ 
1669
1670 /* Remaining symbolic register names */
1671 #define SYMBOLIC_REGISTER_NAMES \
1672     {"$zero",   RTYPE_GP | 0},  \
1673     {"$at",     RTYPE_GP | 1},  \
1674     {"$AT",     RTYPE_GP | 1},  \
1675     {"$v0",     RTYPE_GP | 2},  \
1676     {"$v1",     RTYPE_GP | 3},  \
1677     {"$a0",     RTYPE_GP | 4},  \
1678     {"$a1",     RTYPE_GP | 5},  \
1679     {"$a2",     RTYPE_GP | 6},  \
1680     {"$a3",     RTYPE_GP | 7},  \
1681     {"$s0",     RTYPE_GP | 16}, \
1682     {"$s1",     RTYPE_GP | 17}, \
1683     {"$s2",     RTYPE_GP | 18}, \
1684     {"$s3",     RTYPE_GP | 19}, \
1685     {"$s4",     RTYPE_GP | 20}, \
1686     {"$s5",     RTYPE_GP | 21}, \
1687     {"$s6",     RTYPE_GP | 22}, \
1688     {"$s7",     RTYPE_GP | 23}, \
1689     {"$t8",     RTYPE_GP | 24}, \
1690     {"$t9",     RTYPE_GP | 25}, \
1691     {"$k0",     RTYPE_GP | 26}, \
1692     {"$kt0",    RTYPE_GP | 26}, \
1693     {"$k1",     RTYPE_GP | 27}, \
1694     {"$kt1",    RTYPE_GP | 27}, \
1695     {"$gp",     RTYPE_GP | 28}, \
1696     {"$sp",     RTYPE_GP | 29}, \
1697     {"$s8",     RTYPE_GP | 30}, \
1698     {"$fp",     RTYPE_GP | 30}, \
1699     {"$ra",     RTYPE_GP | 31}
1700
1701 #define MIPS16_SPECIAL_REGISTER_NAMES \
1702     {"$pc",     RTYPE_PC | 0}
1703
1704 #define MDMX_VECTOR_REGISTER_NAMES \
1705     /* {"$v0",  RTYPE_VEC | 0},  clash with REG 2 above */ \
1706     /* {"$v1",  RTYPE_VEC | 1},  clash with REG 3 above */ \
1707     {"$v2",     RTYPE_VEC | 2},  \
1708     {"$v3",     RTYPE_VEC | 3},  \
1709     {"$v4",     RTYPE_VEC | 4},  \
1710     {"$v5",     RTYPE_VEC | 5},  \
1711     {"$v6",     RTYPE_VEC | 6},  \
1712     {"$v7",     RTYPE_VEC | 7},  \
1713     {"$v8",     RTYPE_VEC | 8},  \
1714     {"$v9",     RTYPE_VEC | 9},  \
1715     {"$v10",    RTYPE_VEC | 10}, \
1716     {"$v11",    RTYPE_VEC | 11}, \
1717     {"$v12",    RTYPE_VEC | 12}, \
1718     {"$v13",    RTYPE_VEC | 13}, \
1719     {"$v14",    RTYPE_VEC | 14}, \
1720     {"$v15",    RTYPE_VEC | 15}, \
1721     {"$v16",    RTYPE_VEC | 16}, \
1722     {"$v17",    RTYPE_VEC | 17}, \
1723     {"$v18",    RTYPE_VEC | 18}, \
1724     {"$v19",    RTYPE_VEC | 19}, \
1725     {"$v20",    RTYPE_VEC | 20}, \
1726     {"$v21",    RTYPE_VEC | 21}, \
1727     {"$v22",    RTYPE_VEC | 22}, \
1728     {"$v23",    RTYPE_VEC | 23}, \
1729     {"$v24",    RTYPE_VEC | 24}, \
1730     {"$v25",    RTYPE_VEC | 25}, \
1731     {"$v26",    RTYPE_VEC | 26}, \
1732     {"$v27",    RTYPE_VEC | 27}, \
1733     {"$v28",    RTYPE_VEC | 28}, \
1734     {"$v29",    RTYPE_VEC | 29}, \
1735     {"$v30",    RTYPE_VEC | 30}, \
1736     {"$v31",    RTYPE_VEC | 31}
1737
1738 #define MIPS_DSP_ACCUMULATOR_NAMES \
1739     {"$ac0",    RTYPE_ACC | 0}, \
1740     {"$ac1",    RTYPE_ACC | 1}, \
1741     {"$ac2",    RTYPE_ACC | 2}, \
1742     {"$ac3",    RTYPE_ACC | 3}
1743
1744 static const struct regname reg_names[] = {
1745   GENERIC_REGISTER_NUMBERS,
1746   FPU_REGISTER_NAMES,
1747   FPU_CONDITION_CODE_NAMES,
1748   COPROC_CONDITION_CODE_NAMES,
1749
1750   /* The $txx registers depends on the abi,
1751      these will be added later into the symbol table from
1752      one of the tables below once mips_abi is set after 
1753      parsing of arguments from the command line. */
1754   SYMBOLIC_REGISTER_NAMES,
1755
1756   MIPS16_SPECIAL_REGISTER_NAMES,
1757   MDMX_VECTOR_REGISTER_NAMES,
1758   MIPS_DSP_ACCUMULATOR_NAMES,
1759   {0, 0}
1760 };
1761
1762 static const struct regname reg_names_o32[] = {
1763   O32_SYMBOLIC_REGISTER_NAMES,
1764   {0, 0}
1765 };
1766
1767 static const struct regname reg_names_n32n64[] = {
1768   N32N64_SYMBOLIC_REGISTER_NAMES,
1769   {0, 0}
1770 };
1771
1772 static int
1773 reg_lookup (char **s, unsigned int types, unsigned int *regnop)
1774 {
1775   symbolS *symbolP;
1776   char *e;
1777   char save_c;
1778   int reg = -1;
1779
1780   /* Find end of name.  */
1781   e = *s;
1782   if (is_name_beginner (*e))
1783     ++e;
1784   while (is_part_of_name (*e))
1785     ++e;
1786
1787   /* Terminate name.  */
1788   save_c = *e;
1789   *e = '\0';
1790
1791   /* Look for a register symbol.  */
1792   if ((symbolP = symbol_find (*s)) && S_GET_SEGMENT (symbolP) == reg_section)
1793     {
1794       int r = S_GET_VALUE (symbolP);
1795       if (r & types)
1796         reg = r & RNUM_MASK;
1797       else if ((types & RTYPE_VEC) && (r & ~1) == (RTYPE_GP | 2))
1798         /* Convert GP reg $v0/1 to MDMX reg $v0/1!  */
1799         reg = (r & RNUM_MASK) - 2;
1800     }
1801   /* Else see if this is a register defined in an itbl entry.  */
1802   else if ((types & RTYPE_GP) && itbl_have_entries)
1803     {
1804       char *n = *s;
1805       unsigned long r;
1806
1807       if (*n == '$')
1808         ++n;
1809       if (itbl_get_reg_val (n, &r))
1810         reg = r & RNUM_MASK;
1811     }
1812
1813   /* Advance to next token if a register was recognised.  */
1814   if (reg >= 0)
1815     *s = e;
1816   else if (types & RWARN)
1817     as_warn (_("Unrecognized register name `%s'"), *s);
1818
1819   *e = save_c;
1820   if (regnop)
1821     *regnop = reg;
1822   return reg >= 0;
1823 }
1824
1825 /* Return TRUE if opcode MO is valid on the currently selected ISA and
1826    architecture.  Use is_opcode_valid_16 for MIPS16 opcodes.  */
1827
1828 static bfd_boolean
1829 is_opcode_valid (const struct mips_opcode *mo)
1830 {
1831   int isa = mips_opts.isa;
1832   int fp_s, fp_d;
1833
1834   if (mips_opts.ase_mdmx)
1835     isa |= INSN_MDMX;
1836   if (mips_opts.ase_dsp)
1837     isa |= INSN_DSP;
1838   if (mips_opts.ase_dsp && ISA_SUPPORTS_DSP64_ASE)
1839     isa |= INSN_DSP64;
1840   if (mips_opts.ase_dspr2)
1841     isa |= INSN_DSPR2;
1842   if (mips_opts.ase_mt)
1843     isa |= INSN_MT;
1844   if (mips_opts.ase_mips3d)
1845     isa |= INSN_MIPS3D;
1846   if (mips_opts.ase_smartmips)
1847     isa |= INSN_SMARTMIPS;
1848
1849   /* Don't accept instructions based on the ISA if the CPU does not implement
1850      all the coprocessor insns. */
1851   if (NO_ISA_COP (mips_opts.arch)
1852       && COP_INSN (mo->pinfo))
1853     isa = 0;
1854
1855   if (!OPCODE_IS_MEMBER (mo, isa, mips_opts.arch))
1856     return FALSE;
1857
1858   /* Check whether the instruction or macro requires single-precision or
1859      double-precision floating-point support.  Note that this information is
1860      stored differently in the opcode table for insns and macros.  */
1861   if (mo->pinfo == INSN_MACRO)
1862     {
1863       fp_s = mo->pinfo2 & INSN2_M_FP_S;
1864       fp_d = mo->pinfo2 & INSN2_M_FP_D;
1865     }
1866   else
1867     {
1868       fp_s = mo->pinfo & FP_S;
1869       fp_d = mo->pinfo & FP_D;
1870     }
1871
1872   if (fp_d && (mips_opts.soft_float || mips_opts.single_float))
1873     return FALSE;
1874
1875   if (fp_s && mips_opts.soft_float)
1876     return FALSE;
1877
1878   return TRUE;
1879 }
1880
1881 /* Return TRUE if the MIPS16 opcode MO is valid on the currently
1882    selected ISA and architecture.  */
1883
1884 static bfd_boolean
1885 is_opcode_valid_16 (const struct mips_opcode *mo)
1886 {
1887   return OPCODE_IS_MEMBER (mo, mips_opts.isa, mips_opts.arch) ? TRUE : FALSE;
1888 }
1889
1890 /* This function is called once, at assembler startup time.  It should set up
1891    all the tables, etc. that the MD part of the assembler will need.  */
1892
1893 void
1894 md_begin (void)
1895 {
1896   const char *retval = NULL;
1897   int i = 0;
1898   int broken = 0;
1899
1900   if (mips_pic != NO_PIC)
1901     {
1902       if (g_switch_seen && g_switch_value != 0)
1903         as_bad (_("-G may not be used in position-independent code"));
1904       g_switch_value = 0;
1905     }
1906
1907   if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, file_mips_arch))
1908     as_warn (_("Could not set architecture and machine"));
1909
1910   op_hash = hash_new ();
1911
1912   for (i = 0; i < NUMOPCODES;)
1913     {
1914       const char *name = mips_opcodes[i].name;
1915
1916       retval = hash_insert (op_hash, name, (void *) &mips_opcodes[i]);
1917       if (retval != NULL)
1918         {
1919           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
1920                    mips_opcodes[i].name, retval);
1921           /* Probably a memory allocation problem?  Give up now.  */
1922           as_fatal (_("Broken assembler.  No assembly attempted."));
1923         }
1924       do
1925         {
1926           if (mips_opcodes[i].pinfo != INSN_MACRO)
1927             {
1928               if (!validate_mips_insn (&mips_opcodes[i]))
1929                 broken = 1;
1930               if (nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1931                 {
1932                   create_insn (&nop_insn, mips_opcodes + i);
1933                   if (mips_fix_loongson2f_nop)
1934                     nop_insn.insn_opcode = LOONGSON2F_NOP_INSN;
1935                   nop_insn.fixed_p = 1;
1936                 }
1937             }
1938           ++i;
1939         }
1940       while ((i < NUMOPCODES) && !strcmp (mips_opcodes[i].name, name));
1941     }
1942
1943   mips16_op_hash = hash_new ();
1944
1945   i = 0;
1946   while (i < bfd_mips16_num_opcodes)
1947     {
1948       const char *name = mips16_opcodes[i].name;
1949
1950       retval = hash_insert (mips16_op_hash, name, (void *) &mips16_opcodes[i]);
1951       if (retval != NULL)
1952         as_fatal (_("internal: can't hash `%s': %s"),
1953                   mips16_opcodes[i].name, retval);
1954       do
1955         {
1956           if (mips16_opcodes[i].pinfo != INSN_MACRO
1957               && ((mips16_opcodes[i].match & mips16_opcodes[i].mask)
1958                   != mips16_opcodes[i].match))
1959             {
1960               fprintf (stderr, _("internal error: bad mips16 opcode: %s %s\n"),
1961                        mips16_opcodes[i].name, mips16_opcodes[i].args);
1962               broken = 1;
1963             }
1964           if (mips16_nop_insn.insn_mo == NULL && strcmp (name, "nop") == 0)
1965             {
1966               create_insn (&mips16_nop_insn, mips16_opcodes + i);
1967               mips16_nop_insn.fixed_p = 1;
1968             }
1969           ++i;
1970         }
1971       while (i < bfd_mips16_num_opcodes
1972              && strcmp (mips16_opcodes[i].name, name) == 0);
1973     }
1974
1975   if (broken)
1976     as_fatal (_("Broken assembler.  No assembly attempted."));
1977
1978   /* We add all the general register names to the symbol table.  This
1979      helps us detect invalid uses of them.  */
1980   for (i = 0; reg_names[i].name; i++) 
1981     symbol_table_insert (symbol_new (reg_names[i].name, reg_section,
1982                                      reg_names[i].num, /* & RNUM_MASK, */
1983                                      &zero_address_frag));
1984   if (HAVE_NEWABI)
1985     for (i = 0; reg_names_n32n64[i].name; i++) 
1986       symbol_table_insert (symbol_new (reg_names_n32n64[i].name, reg_section,
1987                                        reg_names_n32n64[i].num, /* & RNUM_MASK, */
1988                                        &zero_address_frag));
1989   else
1990     for (i = 0; reg_names_o32[i].name; i++) 
1991       symbol_table_insert (symbol_new (reg_names_o32[i].name, reg_section,
1992                                        reg_names_o32[i].num, /* & RNUM_MASK, */
1993                                        &zero_address_frag));
1994
1995   mips_no_prev_insn ();
1996
1997   mips_gprmask = 0;
1998   mips_cprmask[0] = 0;
1999   mips_cprmask[1] = 0;
2000   mips_cprmask[2] = 0;
2001   mips_cprmask[3] = 0;
2002
2003   /* set the default alignment for the text section (2**2) */
2004   record_alignment (text_section, 2);
2005
2006   bfd_set_gp_size (stdoutput, g_switch_value);
2007
2008 #ifdef OBJ_ELF
2009   if (IS_ELF)
2010     {
2011       /* On a native system other than VxWorks, sections must be aligned
2012          to 16 byte boundaries.  When configured for an embedded ELF
2013          target, we don't bother.  */
2014       if (strncmp (TARGET_OS, "elf", 3) != 0
2015           && strncmp (TARGET_OS, "vxworks", 7) != 0)
2016         {
2017           (void) bfd_set_section_alignment (stdoutput, text_section, 4);
2018           (void) bfd_set_section_alignment (stdoutput, data_section, 4);
2019           (void) bfd_set_section_alignment (stdoutput, bss_section, 4);
2020         }
2021
2022       /* Create a .reginfo section for register masks and a .mdebug
2023          section for debugging information.  */
2024       {
2025         segT seg;
2026         subsegT subseg;
2027         flagword flags;
2028         segT sec;
2029
2030         seg = now_seg;
2031         subseg = now_subseg;
2032
2033         /* The ABI says this section should be loaded so that the
2034            running program can access it.  However, we don't load it
2035            if we are configured for an embedded target */
2036         flags = SEC_READONLY | SEC_DATA;
2037         if (strncmp (TARGET_OS, "elf", 3) != 0)
2038           flags |= SEC_ALLOC | SEC_LOAD;
2039
2040         if (mips_abi != N64_ABI)
2041           {
2042             sec = subseg_new (".reginfo", (subsegT) 0);
2043
2044             bfd_set_section_flags (stdoutput, sec, flags);
2045             bfd_set_section_alignment (stdoutput, sec, HAVE_NEWABI ? 3 : 2);
2046
2047             mips_regmask_frag = frag_more (sizeof (Elf32_External_RegInfo));
2048           }
2049         else
2050           {
2051             /* The 64-bit ABI uses a .MIPS.options section rather than
2052                .reginfo section.  */
2053             sec = subseg_new (".MIPS.options", (subsegT) 0);
2054             bfd_set_section_flags (stdoutput, sec, flags);
2055             bfd_set_section_alignment (stdoutput, sec, 3);
2056
2057             /* Set up the option header.  */
2058             {
2059               Elf_Internal_Options opthdr;
2060               char *f;
2061
2062               opthdr.kind = ODK_REGINFO;
2063               opthdr.size = (sizeof (Elf_External_Options)
2064                              + sizeof (Elf64_External_RegInfo));
2065               opthdr.section = 0;
2066               opthdr.info = 0;
2067               f = frag_more (sizeof (Elf_External_Options));
2068               bfd_mips_elf_swap_options_out (stdoutput, &opthdr,
2069                                              (Elf_External_Options *) f);
2070
2071               mips_regmask_frag = frag_more (sizeof (Elf64_External_RegInfo));
2072             }
2073           }
2074
2075         if (ECOFF_DEBUGGING)
2076           {
2077             sec = subseg_new (".mdebug", (subsegT) 0);
2078             (void) bfd_set_section_flags (stdoutput, sec,
2079                                           SEC_HAS_CONTENTS | SEC_READONLY);
2080             (void) bfd_set_section_alignment (stdoutput, sec, 2);
2081           }
2082         else if (mips_flag_pdr)
2083           {
2084             pdr_seg = subseg_new (".pdr", (subsegT) 0);
2085             (void) bfd_set_section_flags (stdoutput, pdr_seg,
2086                                           SEC_READONLY | SEC_RELOC
2087                                           | SEC_DEBUGGING);
2088             (void) bfd_set_section_alignment (stdoutput, pdr_seg, 2);
2089           }
2090
2091         subseg_set (seg, subseg);
2092       }
2093     }
2094 #endif /* OBJ_ELF */
2095
2096   if (! ECOFF_DEBUGGING)
2097     md_obj_begin ();
2098
2099   if (mips_fix_vr4120)
2100     init_vr4120_conflicts ();
2101 }
2102
2103 void
2104 md_mips_end (void)
2105 {
2106   if (! ECOFF_DEBUGGING)
2107     md_obj_end ();
2108 }
2109
2110 void
2111 md_assemble (char *str)
2112 {
2113   struct mips_cl_insn insn;
2114   bfd_reloc_code_real_type unused_reloc[3]
2115     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
2116
2117   imm_expr.X_op = O_absent;
2118   imm2_expr.X_op = O_absent;
2119   offset_expr.X_op = O_absent;
2120   imm_reloc[0] = BFD_RELOC_UNUSED;
2121   imm_reloc[1] = BFD_RELOC_UNUSED;
2122   imm_reloc[2] = BFD_RELOC_UNUSED;
2123   offset_reloc[0] = BFD_RELOC_UNUSED;
2124   offset_reloc[1] = BFD_RELOC_UNUSED;
2125   offset_reloc[2] = BFD_RELOC_UNUSED;
2126
2127   if (mips_opts.mips16)
2128     mips16_ip (str, &insn);
2129   else
2130     {
2131       mips_ip (str, &insn);
2132       DBG ((_("returned from mips_ip(%s) insn_opcode = 0x%x\n"),
2133             str, insn.insn_opcode));
2134     }
2135
2136   if (insn_error)
2137     {
2138       as_bad ("%s `%s'", insn_error, str);
2139       return;
2140     }
2141
2142   if (insn.insn_mo->pinfo == INSN_MACRO)
2143     {
2144       macro_start ();
2145       if (mips_opts.mips16)
2146         mips16_macro (&insn);
2147       else
2148         macro (&insn);
2149       macro_end ();
2150     }
2151   else
2152     {
2153       if (imm_expr.X_op != O_absent)
2154         append_insn (&insn, &imm_expr, imm_reloc);
2155       else if (offset_expr.X_op != O_absent)
2156         append_insn (&insn, &offset_expr, offset_reloc);
2157       else
2158         append_insn (&insn, NULL, unused_reloc);
2159     }
2160 }
2161
2162 /* Convenience functions for abstracting away the differences between
2163    MIPS16 and non-MIPS16 relocations.  */
2164
2165 static inline bfd_boolean
2166 mips16_reloc_p (bfd_reloc_code_real_type reloc)
2167 {
2168   switch (reloc)
2169     {
2170     case BFD_RELOC_MIPS16_JMP:
2171     case BFD_RELOC_MIPS16_GPREL:
2172     case BFD_RELOC_MIPS16_GOT16:
2173     case BFD_RELOC_MIPS16_CALL16:
2174     case BFD_RELOC_MIPS16_HI16_S:
2175     case BFD_RELOC_MIPS16_HI16:
2176     case BFD_RELOC_MIPS16_LO16:
2177       return TRUE;
2178
2179     default:
2180       return FALSE;
2181     }
2182 }
2183
2184 static inline bfd_boolean
2185 got16_reloc_p (bfd_reloc_code_real_type reloc)
2186 {
2187   return reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16;
2188 }
2189
2190 static inline bfd_boolean
2191 hi16_reloc_p (bfd_reloc_code_real_type reloc)
2192 {
2193   return reloc == BFD_RELOC_HI16_S || reloc == BFD_RELOC_MIPS16_HI16_S;
2194 }
2195
2196 static inline bfd_boolean
2197 lo16_reloc_p (bfd_reloc_code_real_type reloc)
2198 {
2199   return reloc == BFD_RELOC_LO16 || reloc == BFD_RELOC_MIPS16_LO16;
2200 }
2201
2202 /* Return true if the given relocation might need a matching %lo().
2203    This is only "might" because SVR4 R_MIPS_GOT16 relocations only
2204    need a matching %lo() when applied to local symbols.  */
2205
2206 static inline bfd_boolean
2207 reloc_needs_lo_p (bfd_reloc_code_real_type reloc)
2208 {
2209   return (HAVE_IN_PLACE_ADDENDS
2210           && (hi16_reloc_p (reloc)
2211               /* VxWorks R_MIPS_GOT16 relocs never need a matching %lo();
2212                  all GOT16 relocations evaluate to "G".  */
2213               || (got16_reloc_p (reloc) && mips_pic != VXWORKS_PIC)));
2214 }
2215
2216 /* Return the type of %lo() reloc needed by RELOC, given that
2217    reloc_needs_lo_p.  */
2218
2219 static inline bfd_reloc_code_real_type
2220 matching_lo_reloc (bfd_reloc_code_real_type reloc)
2221 {
2222   return mips16_reloc_p (reloc) ? BFD_RELOC_MIPS16_LO16 : BFD_RELOC_LO16;
2223 }
2224
2225 /* Return true if the given fixup is followed by a matching R_MIPS_LO16
2226    relocation.  */
2227
2228 static inline bfd_boolean
2229 fixup_has_matching_lo_p (fixS *fixp)
2230 {
2231   return (fixp->fx_next != NULL
2232           && fixp->fx_next->fx_r_type == matching_lo_reloc (fixp->fx_r_type)
2233           && fixp->fx_addsy == fixp->fx_next->fx_addsy
2234           && fixp->fx_offset == fixp->fx_next->fx_offset);
2235 }
2236
2237 /* See whether instruction IP reads register REG.  CLASS is the type
2238    of register.  */
2239
2240 static int
2241 insn_uses_reg (const struct mips_cl_insn *ip, unsigned int reg,
2242                enum mips_regclass regclass)
2243 {
2244   if (regclass == MIPS16_REG)
2245     {
2246       gas_assert (mips_opts.mips16);
2247       reg = mips16_to_32_reg_map[reg];
2248       regclass = MIPS_GR_REG;
2249     }
2250
2251   /* Don't report on general register ZERO, since it never changes.  */
2252   if (regclass == MIPS_GR_REG && reg == ZERO)
2253     return 0;
2254
2255   if (regclass == MIPS_FP_REG)
2256     {
2257       gas_assert (! mips_opts.mips16);
2258       /* If we are called with either $f0 or $f1, we must check $f0.
2259          This is not optimal, because it will introduce an unnecessary
2260          NOP between "lwc1 $f0" and "swc1 $f1".  To fix this we would
2261          need to distinguish reading both $f0 and $f1 or just one of
2262          them.  Note that we don't have to check the other way,
2263          because there is no instruction that sets both $f0 and $f1
2264          and requires a delay.  */
2265       if ((ip->insn_mo->pinfo & INSN_READ_FPR_S)
2266           && ((EXTRACT_OPERAND (FS, *ip) & ~(unsigned) 1)
2267               == (reg &~ (unsigned) 1)))
2268         return 1;
2269       if ((ip->insn_mo->pinfo & INSN_READ_FPR_T)
2270           && ((EXTRACT_OPERAND (FT, *ip) & ~(unsigned) 1)
2271               == (reg &~ (unsigned) 1)))
2272         return 1;
2273     }
2274   else if (! mips_opts.mips16)
2275     {
2276       if ((ip->insn_mo->pinfo & INSN_READ_GPR_S)
2277           && EXTRACT_OPERAND (RS, *ip) == reg)
2278         return 1;
2279       if ((ip->insn_mo->pinfo & INSN_READ_GPR_T)
2280           && EXTRACT_OPERAND (RT, *ip) == reg)
2281         return 1;
2282     }
2283   else
2284     {
2285       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_X)
2286           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, *ip)] == reg)
2287         return 1;
2288       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Y)
2289           && mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RY, *ip)] == reg)
2290         return 1;
2291       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_Z)
2292           && (mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip)]
2293               == reg))
2294         return 1;
2295       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_T) && reg == TREG)
2296         return 1;
2297       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_SP) && reg == SP)
2298         return 1;
2299       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_31) && reg == RA)
2300         return 1;
2301       if ((ip->insn_mo->pinfo & MIPS16_INSN_READ_GPR_X)
2302           && MIPS16_EXTRACT_OPERAND (REGR32, *ip) == reg)
2303         return 1;
2304     }
2305
2306   return 0;
2307 }
2308
2309 /* This function returns true if modifying a register requires a
2310    delay.  */
2311
2312 static int
2313 reg_needs_delay (unsigned int reg)
2314 {
2315   unsigned long prev_pinfo;
2316
2317   prev_pinfo = history[0].insn_mo->pinfo;
2318   if (! mips_opts.noreorder
2319       && (((prev_pinfo & INSN_LOAD_MEMORY_DELAY)
2320            && ! gpr_interlocks)
2321           || ((prev_pinfo & INSN_LOAD_COPROC_DELAY)
2322               && ! cop_interlocks)))
2323     {
2324       /* A load from a coprocessor or from memory.  All load delays
2325          delay the use of general register rt for one instruction.  */
2326       /* Itbl support may require additional care here.  */
2327       know (prev_pinfo & INSN_WRITE_GPR_T);
2328       if (reg == EXTRACT_OPERAND (RT, history[0]))
2329         return 1;
2330     }
2331
2332   return 0;
2333 }
2334
2335 /* Move all labels in insn_labels to the current insertion point.  */
2336
2337 static void
2338 mips_move_labels (void)
2339 {
2340   segment_info_type *si = seg_info (now_seg);
2341   struct insn_label_list *l;
2342   valueT val;
2343
2344   for (l = si->label_list; l != NULL; l = l->next)
2345     {
2346       gas_assert (S_GET_SEGMENT (l->label) == now_seg);
2347       symbol_set_frag (l->label, frag_now);
2348       val = (valueT) frag_now_fix ();
2349       /* mips16 text labels are stored as odd.  */
2350       if (mips_opts.mips16)
2351         ++val;
2352       S_SET_VALUE (l->label, val);
2353     }
2354 }
2355
2356 static bfd_boolean
2357 s_is_linkonce (symbolS *sym, segT from_seg)
2358 {
2359   bfd_boolean linkonce = FALSE;
2360   segT symseg = S_GET_SEGMENT (sym);
2361
2362   if (symseg != from_seg && !S_IS_LOCAL (sym))
2363     {
2364       if ((bfd_get_section_flags (stdoutput, symseg) & SEC_LINK_ONCE))
2365         linkonce = TRUE;
2366 #ifdef OBJ_ELF
2367       /* The GNU toolchain uses an extension for ELF: a section
2368          beginning with the magic string .gnu.linkonce is a
2369          linkonce section.  */
2370       if (strncmp (segment_name (symseg), ".gnu.linkonce",
2371                    sizeof ".gnu.linkonce" - 1) == 0)
2372         linkonce = TRUE;
2373 #endif
2374     }
2375   return linkonce;
2376 }
2377
2378 /* Mark instruction labels in mips16 mode.  This permits the linker to
2379    handle them specially, such as generating jalx instructions when
2380    needed.  We also make them odd for the duration of the assembly, in
2381    order to generate the right sort of code.  We will make them even
2382    in the adjust_symtab routine, while leaving them marked.  This is
2383    convenient for the debugger and the disassembler.  The linker knows
2384    to make them odd again.  */
2385
2386 static void
2387 mips16_mark_labels (void)
2388 {
2389   segment_info_type *si = seg_info (now_seg);
2390   struct insn_label_list *l;
2391
2392   if (!mips_opts.mips16)
2393     return;
2394
2395   for (l = si->label_list; l != NULL; l = l->next)
2396    {
2397       symbolS *label = l->label;
2398
2399 #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF)
2400       if (IS_ELF)
2401         S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label)));
2402 #endif
2403       if ((S_GET_VALUE (label) & 1) == 0
2404         /* Don't adjust the address if the label is global or weak, or
2405            in a link-once section, since we'll be emitting symbol reloc
2406            references to it which will be patched up by the linker, and
2407            the final value of the symbol may or may not be MIPS16.  */
2408           && ! S_IS_WEAK (label)
2409           && ! S_IS_EXTERNAL (label)
2410           && ! s_is_linkonce (label, now_seg))
2411         S_SET_VALUE (label, S_GET_VALUE (label) | 1);
2412     }
2413 }
2414
2415 /* End the current frag.  Make it a variant frag and record the
2416    relaxation info.  */
2417
2418 static void
2419 relax_close_frag (void)
2420 {
2421   mips_macro_warning.first_frag = frag_now;
2422   frag_var (rs_machine_dependent, 0, 0,
2423             RELAX_ENCODE (mips_relax.sizes[0], mips_relax.sizes[1]),
2424             mips_relax.symbol, 0, (char *) mips_relax.first_fixup);
2425
2426   memset (&mips_relax.sizes, 0, sizeof (mips_relax.sizes));
2427   mips_relax.first_fixup = 0;
2428 }
2429
2430 /* Start a new relaxation sequence whose expansion depends on SYMBOL.
2431    See the comment above RELAX_ENCODE for more details.  */
2432
2433 static void
2434 relax_start (symbolS *symbol)
2435 {
2436   gas_assert (mips_relax.sequence == 0);
2437   mips_relax.sequence = 1;
2438   mips_relax.symbol = symbol;
2439 }
2440
2441 /* Start generating the second version of a relaxable sequence.
2442    See the comment above RELAX_ENCODE for more details.  */
2443
2444 static void
2445 relax_switch (void)
2446 {
2447   gas_assert (mips_relax.sequence == 1);
2448   mips_relax.sequence = 2;
2449 }
2450
2451 /* End the current relaxable sequence.  */
2452
2453 static void
2454 relax_end (void)
2455 {
2456   gas_assert (mips_relax.sequence == 2);
2457   relax_close_frag ();
2458   mips_relax.sequence = 0;
2459 }
2460
2461 /* Classify an instruction according to the FIX_VR4120_* enumeration.
2462    Return NUM_FIX_VR4120_CLASSES if the instruction isn't affected
2463    by VR4120 errata.  */
2464
2465 static unsigned int
2466 classify_vr4120_insn (const char *name)
2467 {
2468   if (strncmp (name, "macc", 4) == 0)
2469     return FIX_VR4120_MACC;
2470   if (strncmp (name, "dmacc", 5) == 0)
2471     return FIX_VR4120_DMACC;
2472   if (strncmp (name, "mult", 4) == 0)
2473     return FIX_VR4120_MULT;
2474   if (strncmp (name, "dmult", 5) == 0)
2475     return FIX_VR4120_DMULT;
2476   if (strstr (name, "div"))
2477     return FIX_VR4120_DIV;
2478   if (strcmp (name, "mtlo") == 0 || strcmp (name, "mthi") == 0)
2479     return FIX_VR4120_MTHILO;
2480   return NUM_FIX_VR4120_CLASSES;
2481 }
2482
2483 #define INSN_ERET  0x42000018
2484 #define INSN_DERET 0x4200001f
2485
2486 /* Return the number of instructions that must separate INSN1 and INSN2,
2487    where INSN1 is the earlier instruction.  Return the worst-case value
2488    for any INSN2 if INSN2 is null.  */
2489
2490 static unsigned int
2491 insns_between (const struct mips_cl_insn *insn1,
2492                const struct mips_cl_insn *insn2)
2493 {
2494   unsigned long pinfo1, pinfo2;
2495
2496   /* This function needs to know which pinfo flags are set for INSN2
2497      and which registers INSN2 uses.  The former is stored in PINFO2 and
2498      the latter is tested via INSN2_USES_REG.  If INSN2 is null, PINFO2
2499      will have every flag set and INSN2_USES_REG will always return true.  */
2500   pinfo1 = insn1->insn_mo->pinfo;
2501   pinfo2 = insn2 ? insn2->insn_mo->pinfo : ~0U;
2502
2503 #define INSN2_USES_REG(REG, CLASS) \
2504    (insn2 == NULL || insn_uses_reg (insn2, REG, CLASS))
2505
2506   /* For most targets, write-after-read dependencies on the HI and LO
2507      registers must be separated by at least two instructions.  */
2508   if (!hilo_interlocks)
2509     {
2510       if ((pinfo1 & INSN_READ_LO) && (pinfo2 & INSN_WRITE_LO))
2511         return 2;
2512       if ((pinfo1 & INSN_READ_HI) && (pinfo2 & INSN_WRITE_HI))
2513         return 2;
2514     }
2515
2516   /* If we're working around r7000 errata, there must be two instructions
2517      between an mfhi or mflo and any instruction that uses the result.  */
2518   if (mips_7000_hilo_fix
2519       && MF_HILO_INSN (pinfo1)
2520       && INSN2_USES_REG (EXTRACT_OPERAND (RD, *insn1), MIPS_GR_REG))
2521     return 2;
2522
2523   /* If we're working around 24K errata, one instruction is required
2524      if an ERET or DERET is followed by a branch instruction.  */
2525   if (mips_fix_24k)
2526     {
2527       if (insn1->insn_opcode == INSN_ERET
2528           || insn1->insn_opcode == INSN_DERET)
2529         {
2530           if (insn2 == NULL
2531               || insn2->insn_opcode == INSN_ERET
2532               || insn2->insn_opcode == INSN_DERET
2533               || (insn2->insn_mo->pinfo
2534                   & (INSN_UNCOND_BRANCH_DELAY
2535                      | INSN_COND_BRANCH_DELAY
2536                      | INSN_COND_BRANCH_LIKELY)) != 0)
2537             return 1;
2538         }
2539     }
2540
2541   /* If working around VR4120 errata, check for combinations that need
2542      a single intervening instruction.  */
2543   if (mips_fix_vr4120)
2544     {
2545       unsigned int class1, class2;
2546
2547       class1 = classify_vr4120_insn (insn1->insn_mo->name);
2548       if (class1 != NUM_FIX_VR4120_CLASSES && vr4120_conflicts[class1] != 0)
2549         {
2550           if (insn2 == NULL)
2551             return 1;
2552           class2 = classify_vr4120_insn (insn2->insn_mo->name);
2553           if (vr4120_conflicts[class1] & (1 << class2))
2554             return 1;
2555         }
2556     }
2557
2558   if (!mips_opts.mips16)
2559     {
2560       /* Check for GPR or coprocessor load delays.  All such delays
2561          are on the RT register.  */
2562       /* Itbl support may require additional care here.  */
2563       if ((!gpr_interlocks && (pinfo1 & INSN_LOAD_MEMORY_DELAY))
2564           || (!cop_interlocks && (pinfo1 & INSN_LOAD_COPROC_DELAY)))
2565         {
2566           know (pinfo1 & INSN_WRITE_GPR_T);
2567           if (INSN2_USES_REG (EXTRACT_OPERAND (RT, *insn1), MIPS_GR_REG))
2568             return 1;
2569         }
2570
2571       /* Check for generic coprocessor hazards.
2572
2573          This case is not handled very well.  There is no special
2574          knowledge of CP0 handling, and the coprocessors other than
2575          the floating point unit are not distinguished at all.  */
2576       /* Itbl support may require additional care here. FIXME!
2577          Need to modify this to include knowledge about
2578          user specified delays!  */
2579       else if ((!cop_interlocks && (pinfo1 & INSN_COPROC_MOVE_DELAY))
2580                || (!cop_mem_interlocks && (pinfo1 & INSN_COPROC_MEMORY_DELAY)))
2581         {
2582           /* Handle cases where INSN1 writes to a known general coprocessor
2583              register.  There must be a one instruction delay before INSN2
2584              if INSN2 reads that register, otherwise no delay is needed.  */
2585           if (pinfo1 & INSN_WRITE_FPR_T)
2586             {
2587               if (INSN2_USES_REG (EXTRACT_OPERAND (FT, *insn1), MIPS_FP_REG))
2588                 return 1;
2589             }
2590           else if (pinfo1 & INSN_WRITE_FPR_S)
2591             {
2592               if (INSN2_USES_REG (EXTRACT_OPERAND (FS, *insn1), MIPS_FP_REG))
2593                 return 1;
2594             }
2595           else
2596             {
2597               /* Read-after-write dependencies on the control registers
2598                  require a two-instruction gap.  */
2599               if ((pinfo1 & INSN_WRITE_COND_CODE)
2600                   && (pinfo2 & INSN_READ_COND_CODE))
2601                 return 2;
2602
2603               /* We don't know exactly what INSN1 does.  If INSN2 is
2604                  also a coprocessor instruction, assume there must be
2605                  a one instruction gap.  */
2606               if (pinfo2 & INSN_COP)
2607                 return 1;
2608             }
2609         }
2610
2611       /* Check for read-after-write dependencies on the coprocessor
2612          control registers in cases where INSN1 does not need a general
2613          coprocessor delay.  This means that INSN1 is a floating point
2614          comparison instruction.  */
2615       /* Itbl support may require additional care here.  */
2616       else if (!cop_interlocks
2617                && (pinfo1 & INSN_WRITE_COND_CODE)
2618                && (pinfo2 & INSN_READ_COND_CODE))
2619         return 1;
2620     }
2621
2622 #undef INSN2_USES_REG
2623
2624   return 0;
2625 }
2626
2627 /* Return the number of nops that would be needed to work around the
2628    VR4130 mflo/mfhi errata if instruction INSN immediately followed
2629    the MAX_VR4130_NOPS instructions described by HIST.  */
2630
2631 static int
2632 nops_for_vr4130 (const struct mips_cl_insn *hist,
2633                  const struct mips_cl_insn *insn)
2634 {
2635   int i, j, reg;
2636
2637   /* Check if the instruction writes to HI or LO.  MTHI and MTLO
2638      are not affected by the errata.  */
2639   if (insn != 0
2640       && ((insn->insn_mo->pinfo & (INSN_WRITE_HI | INSN_WRITE_LO)) == 0
2641           || strcmp (insn->insn_mo->name, "mtlo") == 0
2642           || strcmp (insn->insn_mo->name, "mthi") == 0))
2643     return 0;
2644
2645   /* Search for the first MFLO or MFHI.  */
2646   for (i = 0; i < MAX_VR4130_NOPS; i++)
2647     if (MF_HILO_INSN (hist[i].insn_mo->pinfo))
2648       {
2649         /* Extract the destination register.  */
2650         if (mips_opts.mips16)
2651           reg = mips16_to_32_reg_map[MIPS16_EXTRACT_OPERAND (RX, hist[i])];
2652         else
2653           reg = EXTRACT_OPERAND (RD, hist[i]);
2654
2655         /* No nops are needed if INSN reads that register.  */
2656         if (insn != NULL && insn_uses_reg (insn, reg, MIPS_GR_REG))
2657           return 0;
2658
2659         /* ...or if any of the intervening instructions do.  */
2660         for (j = 0; j < i; j++)
2661           if (insn_uses_reg (&hist[j], reg, MIPS_GR_REG))
2662             return 0;
2663
2664         return MAX_VR4130_NOPS - i;
2665       }
2666   return 0;
2667 }
2668
2669 /* Return the number of nops that would be needed if instruction INSN
2670    immediately followed the MAX_NOPS instructions given by HIST,
2671    where HIST[0] is the most recent instruction.  If INSN is null,
2672    return the worse-case number of nops for any instruction.  */
2673
2674 static int
2675 nops_for_insn (const struct mips_cl_insn *hist,
2676                const struct mips_cl_insn *insn)
2677 {
2678   int i, nops, tmp_nops;
2679
2680   nops = 0;
2681   for (i = 0; i < MAX_DELAY_NOPS; i++)
2682     {
2683       tmp_nops = insns_between (hist + i, insn) - i;
2684       if (tmp_nops > nops)
2685         nops = tmp_nops;
2686     }
2687
2688   if (mips_fix_vr4130)
2689     {
2690       tmp_nops = nops_for_vr4130 (hist, insn);
2691       if (tmp_nops > nops)
2692         nops = tmp_nops;
2693     }
2694
2695   return nops;
2696 }
2697
2698 /* The variable arguments provide NUM_INSNS extra instructions that
2699    might be added to HIST.  Return the largest number of nops that
2700    would be needed after the extended sequence.  */
2701
2702 static int
2703 nops_for_sequence (int num_insns, const struct mips_cl_insn *hist, ...)
2704 {
2705   va_list args;
2706   struct mips_cl_insn buffer[MAX_NOPS];
2707   struct mips_cl_insn *cursor;
2708   int nops;
2709
2710   va_start (args, hist);
2711   cursor = buffer + num_insns;
2712   memcpy (cursor, hist, (MAX_NOPS - num_insns) * sizeof (*cursor));
2713   while (cursor > buffer)
2714     *--cursor = *va_arg (args, const struct mips_cl_insn *);
2715
2716   nops = nops_for_insn (buffer, NULL);
2717   va_end (args);
2718   return nops;
2719 }
2720
2721 /* Like nops_for_insn, but if INSN is a branch, take into account the
2722    worst-case delay for the branch target.  */
2723
2724 static int
2725 nops_for_insn_or_target (const struct mips_cl_insn *hist,
2726                          const struct mips_cl_insn *insn)
2727 {
2728   int nops, tmp_nops;
2729
2730   nops = nops_for_insn (hist, insn);
2731   if (insn->insn_mo->pinfo & (INSN_UNCOND_BRANCH_DELAY
2732                               | INSN_COND_BRANCH_DELAY
2733                               | INSN_COND_BRANCH_LIKELY))
2734     {
2735       tmp_nops = nops_for_sequence (2, hist, insn, NOP_INSN);
2736       if (tmp_nops > nops)
2737         nops = tmp_nops;
2738     }
2739   else if (mips_opts.mips16
2740            && (insn->insn_mo->pinfo & (MIPS16_INSN_UNCOND_BRANCH
2741                                        | MIPS16_INSN_COND_BRANCH)))
2742     {
2743       tmp_nops = nops_for_sequence (1, hist, insn);
2744       if (tmp_nops > nops)
2745         nops = tmp_nops;
2746     }
2747   return nops;
2748 }
2749
2750 /* Fix NOP issue: Replace nops by "or at,at,zero".  */
2751
2752 static void
2753 fix_loongson2f_nop (struct mips_cl_insn * ip)
2754 {
2755   if (strcmp (ip->insn_mo->name, "nop") == 0)
2756     ip->insn_opcode = LOONGSON2F_NOP_INSN;
2757 }
2758
2759 /* Fix Jump Issue: Eliminate instruction fetch from outside 256M region
2760                    jr target pc &= 'hffff_ffff_cfff_ffff.  */
2761
2762 static void
2763 fix_loongson2f_jump (struct mips_cl_insn * ip)
2764 {
2765   if (strcmp (ip->insn_mo->name, "j") == 0
2766       || strcmp (ip->insn_mo->name, "jr") == 0
2767       || strcmp (ip->insn_mo->name, "jalr") == 0)
2768     {
2769       int sreg;
2770       expressionS ep;
2771
2772       if (! mips_opts.at)
2773         return;
2774
2775       sreg = EXTRACT_OPERAND (RS, *ip);
2776       if (sreg == ZERO || sreg == KT0 || sreg == KT1 || sreg == ATREG)
2777         return;
2778
2779       ep.X_op = O_constant;
2780       ep.X_add_number = 0xcfff0000;
2781       macro_build (&ep, "lui", "t,u", ATREG, BFD_RELOC_HI16);
2782       ep.X_add_number = 0xffff;
2783       macro_build (&ep, "ori", "t,r,i", ATREG, ATREG, BFD_RELOC_LO16);
2784       macro_build (NULL, "and", "d,v,t", sreg, sreg, ATREG);
2785     }
2786 }
2787
2788 static void
2789 fix_loongson2f (struct mips_cl_insn * ip)
2790 {
2791   if (mips_fix_loongson2f_nop)
2792     fix_loongson2f_nop (ip);
2793
2794   if (mips_fix_loongson2f_jump)
2795     fix_loongson2f_jump (ip);
2796 }
2797
2798 /* Output an instruction.  IP is the instruction information.
2799    ADDRESS_EXPR is an operand of the instruction to be used with
2800    RELOC_TYPE.  */
2801
2802 static void
2803 append_insn (struct mips_cl_insn *ip, expressionS *address_expr,
2804              bfd_reloc_code_real_type *reloc_type)
2805 {
2806   unsigned long prev_pinfo, pinfo;
2807   relax_stateT prev_insn_frag_type = 0;
2808   bfd_boolean relaxed_branch = FALSE;
2809   segment_info_type *si = seg_info (now_seg);
2810
2811   if (mips_fix_loongson2f)
2812     fix_loongson2f (ip);
2813
2814   /* Mark instruction labels in mips16 mode.  */
2815   mips16_mark_labels ();
2816
2817   prev_pinfo = history[0].insn_mo->pinfo;
2818   pinfo = ip->insn_mo->pinfo;
2819
2820   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
2821     {
2822       /* There are a lot of optimizations we could do that we don't.
2823          In particular, we do not, in general, reorder instructions.
2824          If you use gcc with optimization, it will reorder
2825          instructions and generally do much more optimization then we
2826          do here; repeating all that work in the assembler would only
2827          benefit hand written assembly code, and does not seem worth
2828          it.  */
2829       int nops = (mips_optimize == 0
2830                   ? nops_for_insn (history, NULL)
2831                   : nops_for_insn_or_target (history, ip));
2832       if (nops > 0)
2833         {
2834           fragS *old_frag;
2835           unsigned long old_frag_offset;
2836           int i;
2837
2838           old_frag = frag_now;
2839           old_frag_offset = frag_now_fix ();
2840
2841           for (i = 0; i < nops; i++)
2842             emit_nop ();
2843
2844           if (listing)
2845             {
2846               listing_prev_line ();
2847               /* We may be at the start of a variant frag.  In case we
2848                  are, make sure there is enough space for the frag
2849                  after the frags created by listing_prev_line.  The
2850                  argument to frag_grow here must be at least as large
2851                  as the argument to all other calls to frag_grow in
2852                  this file.  We don't have to worry about being in the
2853                  middle of a variant frag, because the variants insert
2854                  all needed nop instructions themselves.  */
2855               frag_grow (40);
2856             }
2857
2858           mips_move_labels ();
2859
2860 #ifndef NO_ECOFF_DEBUGGING
2861           if (ECOFF_DEBUGGING)
2862             ecoff_fix_loc (old_frag, old_frag_offset);
2863 #endif
2864         }
2865     }
2866   else if (mips_relax.sequence != 2 && prev_nop_frag != NULL)
2867     {
2868       /* Work out how many nops in prev_nop_frag are needed by IP.  */
2869       int nops = nops_for_insn_or_target (history, ip);
2870       gas_assert (nops <= prev_nop_frag_holds);
2871
2872       /* Enforce NOPS as a minimum.  */
2873       if (nops > prev_nop_frag_required)
2874         prev_nop_frag_required = nops;
2875
2876       if (prev_nop_frag_holds == prev_nop_frag_required)
2877         {
2878           /* Settle for the current number of nops.  Update the history
2879              accordingly (for the benefit of any future .set reorder code).  */
2880           prev_nop_frag = NULL;
2881           insert_into_history (prev_nop_frag_since,
2882                                prev_nop_frag_holds, NOP_INSN);
2883         }
2884       else
2885         {
2886           /* Allow this instruction to replace one of the nops that was
2887              tentatively added to prev_nop_frag.  */
2888           prev_nop_frag->fr_fix -= mips_opts.mips16 ? 2 : 4;
2889           prev_nop_frag_holds--;
2890           prev_nop_frag_since++;
2891         }
2892     }
2893
2894 #ifdef OBJ_ELF
2895   /* The value passed to dwarf2_emit_insn is the distance between
2896      the beginning of the current instruction and the address that
2897      should be recorded in the debug tables.  For MIPS16 debug info
2898      we want to use ISA-encoded addresses, so we pass -1 for an
2899      address higher by one than the current.  */
2900   dwarf2_emit_insn (mips_opts.mips16 ? -1 : 0);
2901 #endif
2902
2903   /* Record the frag type before frag_var.  */
2904   if (history[0].frag)
2905     prev_insn_frag_type = history[0].frag->fr_type;
2906
2907   if (address_expr
2908       && *reloc_type == BFD_RELOC_16_PCREL_S2
2909       && (pinfo & INSN_UNCOND_BRANCH_DELAY || pinfo & INSN_COND_BRANCH_DELAY
2910           || pinfo & INSN_COND_BRANCH_LIKELY)
2911       && mips_relax_branch
2912       /* Don't try branch relaxation within .set nomacro, or within
2913          .set noat if we use $at for PIC computations.  If it turns
2914          out that the branch was out-of-range, we'll get an error.  */
2915       && !mips_opts.warn_about_macros
2916       && (mips_opts.at || mips_pic == NO_PIC)
2917       && !mips_opts.mips16)
2918     {
2919       relaxed_branch = TRUE;
2920       add_relaxed_insn (ip, (relaxed_branch_length
2921                              (NULL, NULL,
2922                               (pinfo & INSN_UNCOND_BRANCH_DELAY) ? -1
2923                               : (pinfo & INSN_COND_BRANCH_LIKELY) ? 1
2924                               : 0)), 4,
2925                         RELAX_BRANCH_ENCODE
2926                         (pinfo & INSN_UNCOND_BRANCH_DELAY,
2927                          pinfo & INSN_COND_BRANCH_LIKELY,
2928                          pinfo & INSN_WRITE_GPR_31,
2929                          0),
2930                         address_expr->X_add_symbol,
2931                         address_expr->X_add_number);
2932       *reloc_type = BFD_RELOC_UNUSED;
2933     }
2934   else if (*reloc_type > BFD_RELOC_UNUSED)
2935     {
2936       /* We need to set up a variant frag.  */
2937       gas_assert (mips_opts.mips16 && address_expr != NULL);
2938       add_relaxed_insn (ip, 4, 0,
2939                         RELAX_MIPS16_ENCODE
2940                         (*reloc_type - BFD_RELOC_UNUSED,
2941                          mips16_small, mips16_ext,
2942                          prev_pinfo & INSN_UNCOND_BRANCH_DELAY,
2943                          history[0].mips16_absolute_jump_p),
2944                         make_expr_symbol (address_expr), 0);
2945     }
2946   else if (mips_opts.mips16
2947            && ! ip->use_extend
2948            && *reloc_type != BFD_RELOC_MIPS16_JMP)
2949     {
2950       if ((pinfo & INSN_UNCOND_BRANCH_DELAY) == 0)
2951         /* Make sure there is enough room to swap this instruction with
2952            a following jump instruction.  */
2953         frag_grow (6);
2954       add_fixed_insn (ip);
2955     }
2956   else
2957     {
2958       if (mips_opts.mips16
2959           && mips_opts.noreorder
2960           && (prev_pinfo & INSN_UNCOND_BRANCH_DELAY) != 0)
2961         as_warn (_("extended instruction in delay slot"));
2962
2963       if (mips_relax.sequence)
2964         {
2965           /* If we've reached the end of this frag, turn it into a variant
2966              frag and record the information for the instructions we've
2967              written so far.  */
2968           if (frag_room () < 4)
2969             relax_close_frag ();
2970           mips_relax.sizes[mips_relax.sequence - 1] += 4;
2971         }
2972
2973       if (mips_relax.sequence != 2)
2974         mips_macro_warning.sizes[0] += 4;
2975       if (mips_relax.sequence != 1)
2976         mips_macro_warning.sizes[1] += 4;
2977
2978       if (mips_opts.mips16)
2979         {
2980           ip->fixed_p = 1;
2981           ip->mips16_absolute_jump_p = (*reloc_type == BFD_RELOC_MIPS16_JMP);
2982         }
2983       add_fixed_insn (ip);
2984     }
2985
2986   if (address_expr != NULL && *reloc_type <= BFD_RELOC_UNUSED)
2987     {
2988       if (address_expr->X_op == O_constant)
2989         {
2990           unsigned int tmp;
2991
2992           switch (*reloc_type)
2993             {
2994             case BFD_RELOC_32:
2995               ip->insn_opcode |= address_expr->X_add_number;
2996               break;
2997
2998             case BFD_RELOC_MIPS_HIGHEST:
2999               tmp = (address_expr->X_add_number + 0x800080008000ull) >> 48;
3000               ip->insn_opcode |= tmp & 0xffff;
3001               break;
3002
3003             case BFD_RELOC_MIPS_HIGHER:
3004               tmp = (address_expr->X_add_number + 0x80008000ull) >> 32;
3005               ip->insn_opcode |= tmp & 0xffff;
3006               break;
3007
3008             case BFD_RELOC_HI16_S:
3009               tmp = (address_expr->X_add_number + 0x8000) >> 16;
3010               ip->insn_opcode |= tmp & 0xffff;
3011               break;
3012
3013             case BFD_RELOC_HI16:
3014               ip->insn_opcode |= (address_expr->X_add_number >> 16) & 0xffff;
3015               break;
3016
3017             case BFD_RELOC_UNUSED:
3018             case BFD_RELOC_LO16:
3019             case BFD_RELOC_MIPS_GOT_DISP:
3020               ip->insn_opcode |= address_expr->X_add_number & 0xffff;
3021               break;
3022
3023             case BFD_RELOC_MIPS_JMP:
3024               if ((address_expr->X_add_number & 3) != 0)
3025                 as_bad (_("jump to misaligned address (0x%lx)"),
3026                         (unsigned long) address_expr->X_add_number);
3027               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0x3ffffff;
3028               break;
3029
3030             case BFD_RELOC_MIPS16_JMP:
3031               if ((address_expr->X_add_number & 3) != 0)
3032                 as_bad (_("jump to misaligned address (0x%lx)"),
3033                         (unsigned long) address_expr->X_add_number);
3034               ip->insn_opcode |=
3035                 (((address_expr->X_add_number & 0x7c0000) << 3)
3036                  | ((address_expr->X_add_number & 0xf800000) >> 7)
3037                  | ((address_expr->X_add_number & 0x3fffc) >> 2));
3038               break;
3039
3040             case BFD_RELOC_16_PCREL_S2:
3041               if ((address_expr->X_add_number & 3) != 0)
3042                 as_bad (_("branch to misaligned address (0x%lx)"),
3043                         (unsigned long) address_expr->X_add_number);
3044               if (mips_relax_branch)
3045                 goto need_reloc;
3046               if ((address_expr->X_add_number + 0x20000) & ~0x3ffff)
3047                 as_bad (_("branch address range overflow (0x%lx)"),
3048                         (unsigned long) address_expr->X_add_number);
3049               ip->insn_opcode |= (address_expr->X_add_number >> 2) & 0xffff;
3050               break;
3051
3052             default:
3053               internalError ();
3054             }
3055         }
3056       else if (*reloc_type < BFD_RELOC_UNUSED)
3057         need_reloc:
3058         {
3059           reloc_howto_type *howto;
3060           int i;
3061
3062           /* In a compound relocation, it is the final (outermost)
3063              operator that determines the relocated field.  */
3064           for (i = 1; i < 3; i++)
3065             if (reloc_type[i] == BFD_RELOC_UNUSED)
3066               break;
3067
3068           howto = bfd_reloc_type_lookup (stdoutput, reloc_type[i - 1]);
3069           if (howto == NULL)
3070             {
3071               /* To reproduce this failure try assembling gas/testsuites/
3072                  gas/mips/mips16-intermix.s with a mips-ecoff targeted
3073                  assembler.  */
3074               as_bad (_("Unsupported MIPS relocation number %d"), reloc_type[i - 1]);
3075               howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
3076             }
3077           
3078           ip->fixp[0] = fix_new_exp (ip->frag, ip->where,
3079                                      bfd_get_reloc_size (howto),
3080                                      address_expr,
3081                                      reloc_type[0] == BFD_RELOC_16_PCREL_S2,
3082                                      reloc_type[0]);
3083
3084           /* Tag symbols that have a R_MIPS16_26 relocation against them.  */
3085           if (reloc_type[0] == BFD_RELOC_MIPS16_JMP
3086               && ip->fixp[0]->fx_addsy)
3087             *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1;
3088
3089           /* These relocations can have an addend that won't fit in
3090              4 octets for 64bit assembly.  */
3091           if (HAVE_64BIT_GPRS
3092               && ! howto->partial_inplace
3093               && (reloc_type[0] == BFD_RELOC_16
3094                   || reloc_type[0] == BFD_RELOC_32
3095                   || reloc_type[0] == BFD_RELOC_MIPS_JMP
3096                   || reloc_type[0] == BFD_RELOC_GPREL16
3097                   || reloc_type[0] == BFD_RELOC_MIPS_LITERAL
3098                   || reloc_type[0] == BFD_RELOC_GPREL32
3099                   || reloc_type[0] == BFD_RELOC_64
3100                   || reloc_type[0] == BFD_RELOC_CTOR
3101                   || reloc_type[0] == BFD_RELOC_MIPS_SUB
3102                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHEST
3103                   || reloc_type[0] == BFD_RELOC_MIPS_HIGHER
3104                   || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP
3105                   || reloc_type[0] == BFD_RELOC_MIPS_REL16
3106                   || reloc_type[0] == BFD_RELOC_MIPS_RELGOT
3107                   || reloc_type[0] == BFD_RELOC_MIPS16_GPREL
3108                   || hi16_reloc_p (reloc_type[0])
3109                   || lo16_reloc_p (reloc_type[0])))
3110             ip->fixp[0]->fx_no_overflow = 1;
3111
3112           if (mips_relax.sequence)
3113             {
3114               if (mips_relax.first_fixup == 0)
3115                 mips_relax.first_fixup = ip->fixp[0];
3116             }
3117           else if (reloc_needs_lo_p (*reloc_type))
3118             {
3119               struct mips_hi_fixup *hi_fixup;
3120
3121               /* Reuse the last entry if it already has a matching %lo.  */
3122               hi_fixup = mips_hi_fixup_list;
3123               if (hi_fixup == 0
3124                   || !fixup_has_matching_lo_p (hi_fixup->fixp))
3125                 {
3126                   hi_fixup = ((struct mips_hi_fixup *)
3127                               xmalloc (sizeof (struct mips_hi_fixup)));
3128                   hi_fixup->next = mips_hi_fixup_list;
3129                   mips_hi_fixup_list = hi_fixup;
3130                 }
3131               hi_fixup->fixp = ip->fixp[0];
3132               hi_fixup->seg = now_seg;
3133             }
3134
3135           /* Add fixups for the second and third relocations, if given.
3136              Note that the ABI allows the second relocation to be
3137              against RSS_UNDEF, RSS_GP, RSS_GP0 or RSS_LOC.  At the
3138              moment we only use RSS_UNDEF, but we could add support
3139              for the others if it ever becomes necessary.  */
3140           for (i = 1; i < 3; i++)
3141             if (reloc_type[i] != BFD_RELOC_UNUSED)
3142               {
3143                 ip->fixp[i] = fix_new (ip->frag, ip->where,
3144                                        ip->fixp[0]->fx_size, NULL, 0,
3145                                        FALSE, reloc_type[i]);
3146
3147                 /* Use fx_tcbit to mark compound relocs.  */
3148                 ip->fixp[0]->fx_tcbit = 1;
3149                 ip->fixp[i]->fx_tcbit = 1;
3150               }
3151         }
3152     }
3153   install_insn (ip);
3154
3155   /* Update the register mask information.  */
3156   if (! mips_opts.mips16)
3157     {
3158       if (pinfo & INSN_WRITE_GPR_D)
3159         mips_gprmask |= 1 << EXTRACT_OPERAND (RD, *ip);
3160       if ((pinfo & (INSN_WRITE_GPR_T | INSN_READ_GPR_T)) != 0)
3161         mips_gprmask |= 1 << EXTRACT_OPERAND (RT, *ip);
3162       if (pinfo & INSN_READ_GPR_S)
3163         mips_gprmask |= 1 << EXTRACT_OPERAND (RS, *ip);
3164       if (pinfo & INSN_WRITE_GPR_31)
3165         mips_gprmask |= 1 << RA;
3166       if (pinfo & INSN_WRITE_FPR_D)
3167         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FD, *ip);
3168       if ((pinfo & (INSN_WRITE_FPR_S | INSN_READ_FPR_S)) != 0)
3169         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FS, *ip);
3170       if ((pinfo & (INSN_WRITE_FPR_T | INSN_READ_FPR_T)) != 0)
3171         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FT, *ip);
3172       if ((pinfo & INSN_READ_FPR_R) != 0)
3173         mips_cprmask[1] |= 1 << EXTRACT_OPERAND (FR, *ip);
3174       if (pinfo & INSN_COP)
3175         {
3176           /* We don't keep enough information to sort these cases out.
3177              The itbl support does keep this information however, although
3178              we currently don't support itbl fprmats as part of the cop
3179              instruction.  May want to add this support in the future.  */
3180         }
3181       /* Never set the bit for $0, which is always zero.  */
3182       mips_gprmask &= ~1 << 0;
3183     }
3184   else
3185     {
3186       if (pinfo & (MIPS16_INSN_WRITE_X | MIPS16_INSN_READ_X))
3187         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RX, *ip);
3188       if (pinfo & (MIPS16_INSN_WRITE_Y | MIPS16_INSN_READ_Y))
3189         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RY, *ip);
3190       if (pinfo & MIPS16_INSN_WRITE_Z)
3191         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (RZ, *ip);
3192       if (pinfo & (MIPS16_INSN_WRITE_T | MIPS16_INSN_READ_T))
3193         mips_gprmask |= 1 << TREG;
3194       if (pinfo & (MIPS16_INSN_WRITE_SP | MIPS16_INSN_READ_SP))
3195         mips_gprmask |= 1 << SP;
3196       if (pinfo & (MIPS16_INSN_WRITE_31 | MIPS16_INSN_READ_31))
3197         mips_gprmask |= 1 << RA;
3198       if (pinfo & MIPS16_INSN_WRITE_GPR_Y)
3199         mips_gprmask |= 1 << MIPS16OP_EXTRACT_REG32R (ip->insn_opcode);
3200       if (pinfo & MIPS16_INSN_READ_Z)
3201         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (MOVE32Z, *ip);
3202       if (pinfo & MIPS16_INSN_READ_GPR_X)
3203         mips_gprmask |= 1 << MIPS16_EXTRACT_OPERAND (REGR32, *ip);
3204     }
3205
3206   if (mips_relax.sequence != 2 && !mips_opts.noreorder)
3207     {
3208       /* Filling the branch delay slot is more complex.  We try to
3209          switch the branch with the previous instruction, which we can
3210          do if the previous instruction does not set up a condition
3211          that the branch tests and if the branch is not itself the
3212          target of any branch.  */
3213       if ((pinfo & INSN_UNCOND_BRANCH_DELAY)
3214           || (pinfo & INSN_COND_BRANCH_DELAY))
3215         {
3216           if (mips_optimize < 2
3217               /* If we have seen .set volatile or .set nomove, don't
3218                  optimize.  */
3219               || mips_opts.nomove != 0
3220               /* We can't swap if the previous instruction's position
3221                  is fixed.  */
3222               || history[0].fixed_p
3223               /* If the previous previous insn was in a .set
3224                  noreorder, we can't swap.  Actually, the MIPS
3225                  assembler will swap in this situation.  However, gcc
3226                  configured -with-gnu-as will generate code like
3227                    .set noreorder
3228                    lw   $4,XXX
3229                    .set reorder
3230                    INSN
3231                    bne  $4,$0,foo
3232                  in which we can not swap the bne and INSN.  If gcc is
3233                  not configured -with-gnu-as, it does not output the
3234                  .set pseudo-ops.  */
3235               || history[1].noreorder_p
3236               /* If the branch is itself the target of a branch, we
3237                  can not swap.  We cheat on this; all we check for is
3238                  whether there is a label on this instruction.  If
3239                  there are any branches to anything other than a
3240                  label, users must use .set noreorder.  */
3241               || si->label_list != NULL
3242               /* If the previous instruction is in a variant frag
3243                  other than this branch's one, we cannot do the swap.
3244                  This does not apply to the mips16, which uses variant
3245                  frags for different purposes.  */
3246               || (! mips_opts.mips16
3247                   && prev_insn_frag_type == rs_machine_dependent)
3248               /* Check for conflicts between the branch and the instructions
3249                  before the candidate delay slot.  */
3250               || nops_for_insn (history + 1, ip) > 0
3251               /* Check for conflicts between the swapped sequence and the
3252                  target of the branch.  */
3253               || nops_for_sequence (2, history + 1, ip, history) > 0
3254               /* We do not swap with a trap instruction, since it
3255                  complicates trap handlers to have the trap
3256                  instruction be in a delay slot.  */
3257               || (prev_pinfo & INSN_TRAP)
3258               /* If the branch reads a register that the previous
3259                  instruction sets, we can not swap.  */
3260               || (! mips_opts.mips16
3261                   && (prev_pinfo & INSN_WRITE_GPR_T)
3262                   && insn_uses_reg (ip, EXTRACT_OPERAND (RT, history[0]),
3263                                     MIPS_GR_REG))
3264               || (! mips_opts.mips16
3265                   && (prev_pinfo & INSN_WRITE_GPR_D)
3266                   && insn_uses_reg (ip, EXTRACT_OPERAND (RD, history[0]),
3267                                     MIPS_GR_REG))
3268               || (mips_opts.mips16
3269                   && (((prev_pinfo & MIPS16_INSN_WRITE_X)
3270                        && (insn_uses_reg
3271                            (ip, MIPS16_EXTRACT_OPERAND (RX, history[0]),
3272                             MIPS16_REG)))
3273                       || ((prev_pinfo & MIPS16_INSN_WRITE_Y)
3274                           && (insn_uses_reg
3275                               (ip, MIPS16_EXTRACT_OPERAND (RY, history[0]),
3276                                MIPS16_REG)))
3277                       || ((prev_pinfo & MIPS16_INSN_WRITE_Z)
3278                           && (insn_uses_reg
3279                               (ip, MIPS16_EXTRACT_OPERAND (RZ, history[0]),
3280                                MIPS16_REG)))
3281                       || ((prev_pinfo & MIPS16_INSN_WRITE_T)
3282                           && insn_uses_reg (ip, TREG, MIPS_GR_REG))
3283                       || ((prev_pinfo & MIPS16_INSN_WRITE_31)
3284                           && insn_uses_reg (ip, RA, MIPS_GR_REG))
3285                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3286                           && insn_uses_reg (ip,
3287                                             MIPS16OP_EXTRACT_REG32R
3288                                               (history[0].insn_opcode),
3289                                             MIPS_GR_REG))))
3290               /* If the branch writes a register that the previous
3291                  instruction sets, we can not swap (we know that
3292                  branches write only to RD or to $31).  */
3293               || (! mips_opts.mips16
3294                   && (prev_pinfo & INSN_WRITE_GPR_T)
3295                   && (((pinfo & INSN_WRITE_GPR_D)
3296                        && (EXTRACT_OPERAND (RT, history[0])
3297                            == EXTRACT_OPERAND (RD, *ip)))
3298                       || ((pinfo & INSN_WRITE_GPR_31)
3299                           && EXTRACT_OPERAND (RT, history[0]) == RA)))
3300               || (! mips_opts.mips16
3301                   && (prev_pinfo & INSN_WRITE_GPR_D)
3302                   && (((pinfo & INSN_WRITE_GPR_D)
3303                        && (EXTRACT_OPERAND (RD, history[0])
3304                            == EXTRACT_OPERAND (RD, *ip)))
3305                       || ((pinfo & INSN_WRITE_GPR_31)
3306                           && EXTRACT_OPERAND (RD, history[0]) == RA)))
3307               || (mips_opts.mips16
3308                   && (pinfo & MIPS16_INSN_WRITE_31)
3309                   && ((prev_pinfo & MIPS16_INSN_WRITE_31)
3310                       || ((prev_pinfo & MIPS16_INSN_WRITE_GPR_Y)
3311                           && (MIPS16OP_EXTRACT_REG32R (history[0].insn_opcode)
3312                               == RA))))
3313               /* If the branch writes a register that the previous
3314                  instruction reads, we can not swap (we know that
3315                  branches only write to RD or to $31).  */
3316               || (! mips_opts.mips16
3317                   && (pinfo & INSN_WRITE_GPR_D)
3318                   && insn_uses_reg (&history[0],
3319                                     EXTRACT_OPERAND (RD, *ip),
3320                                     MIPS_GR_REG))
3321               || (! mips_opts.mips16
3322                   && (pinfo & INSN_WRITE_GPR_31)
3323                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3324               || (mips_opts.mips16
3325                   && (pinfo & MIPS16_INSN_WRITE_31)
3326                   && insn_uses_reg (&history[0], RA, MIPS_GR_REG))
3327               /* If one instruction sets a condition code and the
3328                  other one uses a condition code, we can not swap.  */
3329               || ((pinfo & INSN_READ_COND_CODE)
3330                   && (prev_pinfo & INSN_WRITE_COND_CODE))
3331               || ((pinfo & INSN_WRITE_COND_CODE)
3332                   && (prev_pinfo & INSN_READ_COND_CODE))
3333               /* If the previous instruction uses the PC, we can not
3334                  swap.  */
3335               || (mips_opts.mips16
3336                   && (prev_pinfo & MIPS16_INSN_READ_PC))
3337               /* If the previous instruction had a fixup in mips16
3338                  mode, we can not swap.  This normally means that the
3339                  previous instruction was a 4 byte branch anyhow.  */
3340               || (mips_opts.mips16 && history[0].fixp[0])
3341               /* If the previous instruction is a sync, sync.l, or
3342                  sync.p, we can not swap.  */
3343               || (prev_pinfo & INSN_SYNC)
3344               /* If the previous instruction is an ERET or
3345                  DERET, avoid the swap.  */
3346               || (history[0].insn_opcode == INSN_ERET)
3347               || (history[0].insn_opcode == INSN_DERET))
3348             {
3349               if (mips_opts.mips16
3350                   && (pinfo & INSN_UNCOND_BRANCH_DELAY)
3351                   && (pinfo & (MIPS16_INSN_READ_X | MIPS16_INSN_READ_31))
3352                   && ISA_SUPPORTS_MIPS16E)
3353                 {
3354                   /* Convert MIPS16 jr/jalr into a "compact" jump.  */
3355                   ip->insn_opcode |= 0x0080;
3356                   install_insn (ip);
3357                   insert_into_history (0, 1, ip);
3358                 } 
3359               else
3360                 {
3361                   /* We could do even better for unconditional branches to
3362                      portions of this object file; we could pick up the
3363                      instruction at the destination, put it in the delay
3364                      slot, and bump the destination address.  */
3365                   insert_into_history (0, 1, ip);
3366                   emit_nop ();
3367                 }
3368                 
3369               if (mips_relax.sequence)
3370                 mips_relax.sizes[mips_relax.sequence - 1] += 4;
3371             }
3372           else
3373             {
3374               /* It looks like we can actually do the swap.  */
3375               struct mips_cl_insn delay = history[0];
3376               if (mips_opts.mips16)
3377                 {
3378                   know (delay.frag == ip->frag);
3379                   move_insn (ip, delay.frag, delay.where);
3380                   move_insn (&delay, ip->frag, ip->where + insn_length (ip));
3381                 }
3382               else if (relaxed_branch)
3383                 {
3384                   /* Add the delay slot instruction to the end of the
3385                      current frag and shrink the fixed part of the
3386                      original frag.  If the branch occupies the tail of
3387                      the latter, move it backwards to cover the gap.  */
3388                   delay.frag->fr_fix -= 4;
3389                   if (delay.frag == ip->frag)
3390                     move_insn (ip, ip->frag, ip->where - 4);
3391                   add_fixed_insn (&delay);
3392                 }
3393               else
3394                 {
3395                   move_insn (&delay, ip->frag, ip->where);
3396                   move_insn (ip, history[0].frag, history[0].where);
3397                 }
3398               history[0] = *ip;
3399               delay.fixed_p = 1;
3400               insert_into_history (0, 1, &delay);
3401             }
3402
3403           /* If that was an unconditional branch, forget the previous
3404              insn information.  */
3405           if (pinfo & INSN_UNCOND_BRANCH_DELAY)
3406             {
3407               mips_no_prev_insn ();
3408             }
3409         }
3410       else if (pinfo & INSN_COND_BRANCH_LIKELY)
3411         {
3412           /* We don't yet optimize a branch likely.  What we should do
3413              is look at the target, copy the instruction found there
3414              into the delay slot, and increment the branch to jump to
3415              the next instruction.  */
3416           insert_into_history (0, 1, ip);
3417           emit_nop ();
3418         }
3419       else
3420         insert_into_history (0, 1, ip);
3421     }
3422   else
3423     insert_into_history (0, 1, ip);
3424
3425   /* We just output an insn, so the next one doesn't have a label.  */
3426   mips_clear_insn_labels ();
3427 }
3428
3429 /* Forget that there was any previous instruction or label.  */
3430
3431 static void
3432 mips_no_prev_insn (void)
3433 {
3434   prev_nop_frag = NULL;
3435   insert_into_history (0, ARRAY_SIZE (history), NOP_INSN);
3436   mips_clear_insn_labels ();
3437 }
3438
3439 /* This function must be called before we emit something other than
3440    instructions.  It is like mips_no_prev_insn except that it inserts
3441    any NOPS that might be needed by previous instructions.  */
3442
3443 void
3444 mips_emit_delays (void)
3445 {
3446   if (! mips_opts.noreorder)
3447     {
3448       int nops = nops_for_insn (history, NULL);
3449       if (nops > 0)
3450         {
3451           while (nops-- > 0)
3452             add_fixed_insn (NOP_INSN);
3453           mips_move_labels ();
3454         }
3455     }
3456   mips_no_prev_insn ();
3457 }
3458
3459 /* Start a (possibly nested) noreorder block.  */
3460
3461 static void
3462 start_noreorder (void)
3463 {
3464   if (mips_opts.noreorder == 0)
3465     {
3466       unsigned int i;
3467       int nops;
3468
3469       /* None of the instructions before the .set noreorder can be moved.  */
3470       for (i = 0; i < ARRAY_SIZE (history); i++)
3471         history[i].fixed_p = 1;
3472
3473       /* Insert any nops that might be needed between the .set noreorder
3474          block and the previous instructions.  We will later remove any
3475          nops that turn out not to be needed.  */
3476       nops = nops_for_insn (history, NULL);
3477       if (nops > 0)
3478         {
3479           if (mips_optimize != 0)
3480             {
3481               /* Record the frag which holds the nop instructions, so
3482                  that we can remove them if we don't need them.  */
3483               frag_grow (mips_opts.mips16 ? nops * 2 : nops * 4);
3484               prev_nop_frag = frag_now;
3485               prev_nop_frag_holds = nops;
3486               prev_nop_frag_required = 0;
3487               prev_nop_frag_since = 0;
3488             }
3489
3490           for (; nops > 0; --nops)
3491             add_fixed_insn (NOP_INSN);
3492
3493           /* Move on to a new frag, so that it is safe to simply
3494              decrease the size of prev_nop_frag.  */
3495           frag_wane (frag_now);
3496           frag_new (0);
3497           mips_move_labels ();
3498         }
3499       mips16_mark_labels ();
3500       mips_clear_insn_labels ();
3501     }
3502   mips_opts.noreorder++;
3503   mips_any_noreorder = 1;
3504 }
3505
3506 /* End a nested noreorder block.  */
3507
3508 static void
3509 end_noreorder (void)
3510 {
3511
3512   mips_opts.noreorder--;
3513   if (mips_opts.noreorder == 0 && prev_nop_frag != NULL)
3514     {
3515       /* Commit to inserting prev_nop_frag_required nops and go back to
3516          handling nop insertion the .set reorder way.  */
3517       prev_nop_frag->fr_fix -= ((prev_nop_frag_holds - prev_nop_frag_required)
3518                                 * (mips_opts.mips16 ? 2 : 4));
3519       insert_into_history (prev_nop_frag_since,
3520                            prev_nop_frag_required, NOP_INSN);
3521       prev_nop_frag = NULL;
3522     }
3523 }
3524
3525 /* Set up global variables for the start of a new macro.  */
3526
3527 static void
3528 macro_start (void)
3529 {
3530   memset (&mips_macro_warning.sizes, 0, sizeof (mips_macro_warning.sizes));
3531   mips_macro_warning.delay_slot_p = (mips_opts.noreorder
3532                                      && (history[0].insn_mo->pinfo
3533                                          & (INSN_UNCOND_BRANCH_DELAY
3534                                             | INSN_COND_BRANCH_DELAY
3535                                             | INSN_COND_BRANCH_LIKELY)) != 0);
3536 }
3537
3538 /* Given that a macro is longer than 4 bytes, return the appropriate warning
3539    for it.  Return null if no warning is needed.  SUBTYPE is a bitmask of
3540    RELAX_DELAY_SLOT and RELAX_NOMACRO.  */
3541
3542 static const char *
3543 macro_warning (relax_substateT subtype)
3544 {
3545   if (subtype & RELAX_DELAY_SLOT)
3546     return _("Macro instruction expanded into multiple instructions"
3547              " in a branch delay slot");
3548   else if (subtype & RELAX_NOMACRO)
3549     return _("Macro instruction expanded into multiple instructions");
3550   else
3551     return 0;
3552 }
3553
3554 /* Finish up a macro.  Emit warnings as appropriate.  */
3555
3556 static void
3557 macro_end (void)
3558 {
3559   if (mips_macro_warning.sizes[0] > 4 || mips_macro_warning.sizes[1] > 4)
3560     {
3561       relax_substateT subtype;
3562
3563       /* Set up the relaxation warning flags.  */
3564       subtype = 0;
3565       if (mips_macro_warning.sizes[1] > mips_macro_warning.sizes[0])
3566         subtype |= RELAX_SECOND_LONGER;
3567       if (mips_opts.warn_about_macros)
3568         subtype |= RELAX_NOMACRO;
3569       if (mips_macro_warning.delay_slot_p)
3570         subtype |= RELAX_DELAY_SLOT;
3571
3572       if (mips_macro_warning.sizes[0] > 4 && mips_macro_warning.sizes[1] > 4)
3573         {
3574           /* Either the macro has a single implementation or both
3575              implementations are longer than 4 bytes.  Emit the
3576              warning now.  */
3577           const char *msg = macro_warning (subtype);
3578           if (msg != 0)
3579             as_warn ("%s", msg);
3580         }
3581       else
3582         {
3583           /* One implementation might need a warning but the other
3584              definitely doesn't.  */
3585           mips_macro_warning.first_frag->fr_subtype |= subtype;
3586         }
3587     }
3588 }
3589
3590 /* Read a macro's relocation codes from *ARGS and store them in *R.
3591    The first argument in *ARGS will be either the code for a single
3592    relocation or -1 followed by the three codes that make up a
3593    composite relocation.  */
3594
3595 static void
3596 macro_read_relocs (va_list *args, bfd_reloc_code_real_type *r)
3597 {
3598   int i, next;
3599
3600   next = va_arg (*args, int);
3601   if (next >= 0)
3602     r[0] = (bfd_reloc_code_real_type) next;
3603   else
3604     for (i = 0; i < 3; i++)
3605       r[i] = (bfd_reloc_code_real_type) va_arg (*args, int);
3606 }
3607
3608 /* Build an instruction created by a macro expansion.  This is passed
3609    a pointer to the count of instructions created so far, an
3610    expression, the name of the instruction to build, an operand format
3611    string, and corresponding arguments.  */
3612
3613 static void
3614 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
3615 {
3616   const struct mips_opcode *mo;
3617   struct mips_cl_insn insn;
3618   bfd_reloc_code_real_type r[3];
3619   va_list args;
3620
3621   va_start (args, fmt);
3622
3623   if (mips_opts.mips16)
3624     {
3625       mips16_macro_build (ep, name, fmt, &args);
3626       va_end (args);
3627       return;
3628     }
3629
3630   r[0] = BFD_RELOC_UNUSED;
3631   r[1] = BFD_RELOC_UNUSED;
3632   r[2] = BFD_RELOC_UNUSED;
3633   mo = (struct mips_opcode *) hash_find (op_hash, name);
3634   gas_assert (mo);
3635   gas_assert (strcmp (name, mo->name) == 0);
3636
3637   while (1)
3638     {
3639       /* Search until we get a match for NAME.  It is assumed here that
3640          macros will never generate MDMX, MIPS-3D, or MT instructions.  */
3641       if (strcmp (fmt, mo->args) == 0
3642           && mo->pinfo != INSN_MACRO
3643           && is_opcode_valid (mo))
3644         break;
3645
3646       ++mo;
3647       gas_assert (mo->name);
3648       gas_assert (strcmp (name, mo->name) == 0);
3649     }
3650
3651   create_insn (&insn, mo);
3652   for (;;)
3653     {
3654       switch (*fmt++)
3655         {
3656         case '\0':
3657           break;
3658
3659         case ',':
3660         case '(':
3661         case ')':
3662           continue;
3663
3664         case '+':
3665           switch (*fmt++)
3666             {
3667             case 'A':
3668             case 'E':
3669               INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3670               continue;
3671
3672             case 'B':
3673             case 'F':
3674               /* Note that in the macro case, these arguments are already
3675                  in MSB form.  (When handling the instruction in the
3676                  non-macro case, these arguments are sizes from which
3677                  MSB values must be calculated.)  */
3678               INSERT_OPERAND (INSMSB, insn, va_arg (args, int));
3679               continue;
3680
3681             case 'C':
3682             case 'G':
3683             case 'H':
3684               /* Note that in the macro case, these arguments are already
3685                  in MSBD form.  (When handling the instruction in the
3686                  non-macro case, these arguments are sizes from which
3687                  MSBD values must be calculated.)  */
3688               INSERT_OPERAND (EXTMSBD, insn, va_arg (args, int));
3689               continue;
3690
3691             case 'Q':
3692               INSERT_OPERAND (SEQI, insn, va_arg (args, int));
3693               continue;
3694
3695             default:
3696               internalError ();
3697             }
3698           continue;
3699
3700         case '2':
3701           INSERT_OPERAND (BP, insn, va_arg (args, int));
3702           continue;
3703
3704         case 't':
3705         case 'w':
3706         case 'E':
3707           INSERT_OPERAND (RT, insn, va_arg (args, int));
3708           continue;
3709
3710         case 'c':
3711           INSERT_OPERAND (CODE, insn, va_arg (args, int));
3712           continue;
3713
3714         case 'T':
3715         case 'W':
3716           INSERT_OPERAND (FT, insn, va_arg (args, int));
3717           continue;
3718
3719         case 'd':
3720         case 'G':
3721         case 'K':
3722           INSERT_OPERAND (RD, insn, va_arg (args, int));
3723           continue;
3724
3725         case 'U':
3726           {
3727             int tmp = va_arg (args, int);
3728
3729             INSERT_OPERAND (RT, insn, tmp);
3730             INSERT_OPERAND (RD, insn, tmp);
3731             continue;
3732           }
3733
3734         case 'V':
3735         case 'S':
3736           INSERT_OPERAND (FS, insn, va_arg (args, int));
3737           continue;
3738
3739         case 'z':
3740           continue;
3741
3742         case '<':
3743           INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
3744           continue;
3745
3746         case 'D':
3747           INSERT_OPERAND (FD, insn, va_arg (args, int));
3748           continue;
3749
3750         case 'B':
3751           INSERT_OPERAND (CODE20, insn, va_arg (args, int));
3752           continue;
3753
3754         case 'J':
3755           INSERT_OPERAND (CODE19, insn, va_arg (args, int));
3756           continue;
3757
3758         case 'q':
3759           INSERT_OPERAND (CODE2, insn, va_arg (args, int));
3760           continue;
3761
3762         case 'b':
3763         case 's':
3764         case 'r':
3765         case 'v':
3766           INSERT_OPERAND (RS, insn, va_arg (args, int));
3767           continue;
3768
3769         case 'i':
3770         case 'j':
3771         case 'o':
3772           macro_read_relocs (&args, r);
3773           gas_assert (*r == BFD_RELOC_GPREL16
3774                   || *r == BFD_RELOC_MIPS_LITERAL
3775                   || *r == BFD_RELOC_MIPS_HIGHER
3776                   || *r == BFD_RELOC_HI16_S
3777                   || *r == BFD_RELOC_LO16
3778                   || *r == BFD_RELOC_MIPS_GOT16
3779                   || *r == BFD_RELOC_MIPS_CALL16
3780                   || *r == BFD_RELOC_MIPS_GOT_DISP
3781                   || *r == BFD_RELOC_MIPS_GOT_PAGE
3782                   || *r == BFD_RELOC_MIPS_GOT_OFST
3783                   || *r == BFD_RELOC_MIPS_GOT_LO16
3784                   || *r == BFD_RELOC_MIPS_CALL_LO16);
3785           continue;
3786
3787         case 'u':
3788           macro_read_relocs (&args, r);
3789           gas_assert (ep != NULL
3790                   && (ep->X_op == O_constant
3791                       || (ep->X_op == O_symbol
3792                           && (*r == BFD_RELOC_MIPS_HIGHEST
3793                               || *r == BFD_RELOC_HI16_S
3794                               || *r == BFD_RELOC_HI16
3795                               || *r == BFD_RELOC_GPREL16
3796                               || *r == BFD_RELOC_MIPS_GOT_HI16
3797                               || *r == BFD_RELOC_MIPS_CALL_HI16))));
3798           continue;
3799
3800         case 'p':
3801           gas_assert (ep != NULL);
3802
3803           /*
3804            * This allows macro() to pass an immediate expression for
3805            * creating short branches without creating a symbol.
3806            *
3807            * We don't allow branch relaxation for these branches, as
3808            * they should only appear in ".set nomacro" anyway.
3809            */
3810           if (ep->X_op == O_constant)
3811             {
3812               if ((ep->X_add_number & 3) != 0)
3813                 as_bad (_("branch to misaligned address (0x%lx)"),
3814                         (unsigned long) ep->X_add_number);
3815               if ((ep->X_add_number + 0x20000) & ~0x3ffff)
3816                 as_bad (_("branch address range overflow (0x%lx)"),
3817                         (unsigned long) ep->X_add_number);
3818               insn.insn_opcode |= (ep->X_add_number >> 2) & 0xffff;
3819               ep = NULL;
3820             }
3821           else
3822             *r = BFD_RELOC_16_PCREL_S2;
3823           continue;
3824
3825         case 'a':
3826           gas_assert (ep != NULL);
3827           *r = BFD_RELOC_MIPS_JMP;
3828           continue;
3829
3830         case 'C':
3831           INSERT_OPERAND (COPZ, insn, va_arg (args, unsigned long));
3832           continue;
3833
3834         case 'k':
3835           INSERT_OPERAND (CACHE, insn, va_arg (args, unsigned long));
3836           continue;
3837
3838         default:
3839           internalError ();
3840         }
3841       break;
3842     }
3843   va_end (args);
3844   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3845
3846   append_insn (&insn, ep, r);
3847 }
3848
3849 static void
3850 mips16_macro_build (expressionS *ep, const char *name, const char *fmt,
3851                     va_list *args)
3852 {
3853   struct mips_opcode *mo;
3854   struct mips_cl_insn insn;
3855   bfd_reloc_code_real_type r[3]
3856     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
3857
3858   mo = (struct mips_opcode *) hash_find (mips16_op_hash, name);
3859   gas_assert (mo);
3860   gas_assert (strcmp (name, mo->name) == 0);
3861
3862   while (strcmp (fmt, mo->args) != 0 || mo->pinfo == INSN_MACRO)
3863     {
3864       ++mo;
3865       gas_assert (mo->name);
3866       gas_assert (strcmp (name, mo->name) == 0);
3867     }
3868
3869   create_insn (&insn, mo);
3870   for (;;)
3871     {
3872       int c;
3873
3874       c = *fmt++;
3875       switch (c)
3876         {
3877         case '\0':
3878           break;
3879
3880         case ',':
3881         case '(':
3882         case ')':
3883           continue;
3884
3885         case 'y':
3886         case 'w':
3887           MIPS16_INSERT_OPERAND (RY, insn, va_arg (*args, int));
3888           continue;
3889
3890         case 'x':
3891         case 'v':
3892           MIPS16_INSERT_OPERAND (RX, insn, va_arg (*args, int));
3893           continue;
3894
3895         case 'z':
3896           MIPS16_INSERT_OPERAND (RZ, insn, va_arg (*args, int));
3897           continue;
3898
3899         case 'Z':
3900           MIPS16_INSERT_OPERAND (MOVE32Z, insn, va_arg (*args, int));
3901           continue;
3902
3903         case '0':
3904         case 'S':
3905         case 'P':
3906         case 'R':
3907           continue;
3908
3909         case 'X':
3910           MIPS16_INSERT_OPERAND (REGR32, insn, va_arg (*args, int));
3911           continue;
3912
3913         case 'Y':
3914           {
3915             int regno;
3916
3917             regno = va_arg (*args, int);
3918             regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
3919             MIPS16_INSERT_OPERAND (REG32R, insn, regno);
3920           }
3921           continue;
3922
3923         case '<':
3924         case '>':
3925         case '4':
3926         case '5':
3927         case 'H':
3928         case 'W':
3929         case 'D':
3930         case 'j':
3931         case '8':
3932         case 'V':
3933         case 'C':
3934         case 'U':
3935         case 'k':
3936         case 'K':
3937         case 'p':
3938         case 'q':
3939           {
3940             gas_assert (ep != NULL);
3941
3942             if (ep->X_op != O_constant)
3943               *r = (int) BFD_RELOC_UNUSED + c;
3944             else
3945               {
3946                 mips16_immed (NULL, 0, c, ep->X_add_number, FALSE, FALSE,
3947                               FALSE, &insn.insn_opcode, &insn.use_extend,
3948                               &insn.extend);
3949                 ep = NULL;
3950                 *r = BFD_RELOC_UNUSED;
3951               }
3952           }
3953           continue;
3954
3955         case '6':
3956           MIPS16_INSERT_OPERAND (IMM6, insn, va_arg (*args, int));
3957           continue;
3958         }
3959
3960       break;
3961     }
3962
3963   gas_assert (*r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
3964
3965   append_insn (&insn, ep, r);
3966 }
3967
3968 /*
3969  * Sign-extend 32-bit mode constants that have bit 31 set and all
3970  * higher bits unset.
3971  */
3972 static void
3973 normalize_constant_expr (expressionS *ex)
3974 {
3975   if (ex->X_op == O_constant
3976       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3977     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3978                         - 0x80000000);
3979 }
3980
3981 /*
3982  * Sign-extend 32-bit mode address offsets that have bit 31 set and
3983  * all higher bits unset.
3984  */
3985 static void
3986 normalize_address_expr (expressionS *ex)
3987 {
3988   if (((ex->X_op == O_constant && HAVE_32BIT_ADDRESSES)
3989         || (ex->X_op == O_symbol && HAVE_32BIT_SYMBOLS))
3990       && IS_ZEXT_32BIT_NUM (ex->X_add_number))
3991     ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
3992                         - 0x80000000);
3993 }
3994
3995 /*
3996  * Generate a "jalr" instruction with a relocation hint to the called
3997  * function.  This occurs in NewABI PIC code.
3998  */
3999 static void
4000 macro_build_jalr (expressionS *ep)
4001 {
4002   char *f = NULL;
4003
4004   if (MIPS_JALR_HINT_P (ep))
4005     {
4006       frag_grow (8);
4007       f = frag_more (0);
4008     }
4009   macro_build (NULL, "jalr", "d,s", RA, PIC_CALL_REG);
4010   if (MIPS_JALR_HINT_P (ep))
4011     fix_new_exp (frag_now, f - frag_now->fr_literal,
4012                  4, ep, FALSE, BFD_RELOC_MIPS_JALR);
4013 }
4014
4015 /*
4016  * Generate a "lui" instruction.
4017  */
4018 static void
4019 macro_build_lui (expressionS *ep, int regnum)
4020 {
4021   expressionS high_expr;
4022   const struct mips_opcode *mo;
4023   struct mips_cl_insn insn;
4024   bfd_reloc_code_real_type r[3]
4025     = {BFD_RELOC_UNUSED, BFD_RELOC_UNUSED, BFD_RELOC_UNUSED};
4026   const char *name = "lui";
4027   const char *fmt = "t,u";
4028
4029   gas_assert (! mips_opts.mips16);
4030
4031   high_expr = *ep;
4032
4033   if (high_expr.X_op == O_constant)
4034     {
4035       /* We can compute the instruction now without a relocation entry.  */
4036       high_expr.X_add_number = ((high_expr.X_add_number + 0x8000)
4037                                 >> 16) & 0xffff;
4038       *r = BFD_RELOC_UNUSED;
4039     }
4040   else
4041     {
4042       gas_assert (ep->X_op == O_symbol);
4043       /* _gp_disp is a special case, used from s_cpload.
4044          __gnu_local_gp is used if mips_no_shared.  */
4045       gas_assert (mips_pic == NO_PIC
4046               || (! HAVE_NEWABI
4047                   && strcmp (S_GET_NAME (ep->X_add_symbol), "_gp_disp") == 0)
4048               || (! mips_in_shared
4049                   && strcmp (S_GET_NAME (ep->X_add_symbol),
4050                              "__gnu_local_gp") == 0));
4051       *r = BFD_RELOC_HI16_S;
4052     }
4053
4054   mo = hash_find (op_hash, name);
4055   gas_assert (strcmp (name, mo->name) == 0);
4056   gas_assert (strcmp (fmt, mo->args) == 0);
4057   create_insn (&insn, mo);
4058
4059   insn.insn_opcode = insn.insn_mo->match;
4060   INSERT_OPERAND (RT, insn, regnum);
4061   if (*r == BFD_RELOC_UNUSED)
4062     {
4063       insn.insn_opcode |= high_expr.X_add_number;
4064       append_insn (&insn, NULL, r);
4065     }
4066   else
4067     append_insn (&insn, &high_expr, r);
4068 }
4069
4070 /* Generate a sequence of instructions to do a load or store from a constant
4071    offset off of a base register (breg) into/from a target register (treg),
4072    using AT if necessary.  */
4073 static void
4074 macro_build_ldst_constoffset (expressionS *ep, const char *op,
4075                               int treg, int breg, int dbl)
4076 {
4077   gas_assert (ep->X_op == O_constant);
4078
4079   /* Sign-extending 32-bit constants makes their handling easier.  */
4080   if (!dbl)
4081     normalize_constant_expr (ep);
4082
4083   /* Right now, this routine can only handle signed 32-bit constants.  */
4084   if (! IS_SEXT_32BIT_NUM(ep->X_add_number + 0x8000))
4085     as_warn (_("operand overflow"));
4086
4087   if (IS_SEXT_16BIT_NUM(ep->X_add_number))
4088     {
4089       /* Signed 16-bit offset will fit in the op.  Easy!  */
4090       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, breg);
4091     }
4092   else
4093     {
4094       /* 32-bit offset, need multiple instructions and AT, like:
4095            lui      $tempreg,const_hi       (BFD_RELOC_HI16_S)
4096            addu     $tempreg,$tempreg,$breg
4097            <op>     $treg,const_lo($tempreg)   (BFD_RELOC_LO16)
4098          to handle the complete offset.  */
4099       macro_build_lui (ep, AT);
4100       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
4101       macro_build (ep, op, "t,o(b)", treg, BFD_RELOC_LO16, AT);
4102
4103       if (!mips_opts.at)
4104         as_bad (_("Macro used $at after \".set noat\""));
4105     }
4106 }
4107
4108 /*                      set_at()
4109  * Generates code to set the $at register to true (one)
4110  * if reg is less than the immediate expression.
4111  */
4112 static void
4113 set_at (int reg, int unsignedp)
4114 {
4115   if (imm_expr.X_op == O_constant
4116       && imm_expr.X_add_number >= -0x8000
4117       && imm_expr.X_add_number < 0x8000)
4118     macro_build (&imm_expr, unsignedp ? "sltiu" : "slti", "t,r,j",
4119                  AT, reg, BFD_RELOC_LO16);
4120   else
4121     {
4122       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4123       macro_build (NULL, unsignedp ? "sltu" : "slt", "d,v,t", AT, reg, AT);
4124     }
4125 }
4126
4127 /* Warn if an expression is not a constant.  */
4128
4129 static void
4130 check_absolute_expr (struct mips_cl_insn *ip, expressionS *ex)
4131 {
4132   if (ex->X_op == O_big)
4133     as_bad (_("unsupported large constant"));
4134   else if (ex->X_op != O_constant)
4135     as_bad (_("Instruction %s requires absolute expression"),
4136             ip->insn_mo->name);
4137
4138   if (HAVE_32BIT_GPRS)
4139     normalize_constant_expr (ex);
4140 }
4141
4142 /* Count the leading zeroes by performing a binary chop. This is a
4143    bulky bit of source, but performance is a LOT better for the
4144    majority of values than a simple loop to count the bits:
4145        for (lcnt = 0; (lcnt < 32); lcnt++)
4146          if ((v) & (1 << (31 - lcnt)))
4147            break;
4148   However it is not code size friendly, and the gain will drop a bit
4149   on certain cached systems.
4150 */
4151 #define COUNT_TOP_ZEROES(v)             \
4152   (((v) & ~0xffff) == 0                 \
4153    ? ((v) & ~0xff) == 0                 \
4154      ? ((v) & ~0xf) == 0                \
4155        ? ((v) & ~0x3) == 0              \
4156          ? ((v) & ~0x1) == 0            \
4157            ? !(v)                       \
4158              ? 32                       \
4159              : 31                       \
4160            : 30                         \
4161          : ((v) & ~0x7) == 0            \
4162            ? 29                         \
4163            : 28                         \
4164        : ((v) & ~0x3f) == 0             \
4165          ? ((v) & ~0x1f) == 0           \
4166            ? 27                         \
4167            : 26                         \
4168          : ((v) & ~0x7f) == 0           \
4169            ? 25                         \
4170            : 24                         \
4171      : ((v) & ~0xfff) == 0              \
4172        ? ((v) & ~0x3ff) == 0            \
4173          ? ((v) & ~0x1ff) == 0          \
4174            ? 23                         \
4175            : 22                         \
4176          : ((v) & ~0x7ff) == 0          \
4177            ? 21                         \
4178            : 20                         \
4179        : ((v) & ~0x3fff) == 0           \
4180          ? ((v) & ~0x1fff) == 0         \
4181            ? 19                         \
4182            : 18                         \
4183          : ((v) & ~0x7fff) == 0         \
4184            ? 17                         \
4185            : 16                         \
4186    : ((v) & ~0xffffff) == 0             \
4187      ? ((v) & ~0xfffff) == 0            \
4188        ? ((v) & ~0x3ffff) == 0          \
4189          ? ((v) & ~0x1ffff) == 0        \
4190            ? 15                         \
4191            : 14                         \
4192          : ((v) & ~0x7ffff) == 0        \
4193            ? 13                         \
4194            : 12                         \
4195        : ((v) & ~0x3fffff) == 0         \
4196          ? ((v) & ~0x1fffff) == 0       \
4197            ? 11                         \
4198            : 10                         \
4199          : ((v) & ~0x7fffff) == 0       \
4200            ? 9                          \
4201            : 8                          \
4202      : ((v) & ~0xfffffff) == 0          \
4203        ? ((v) & ~0x3ffffff) == 0        \
4204          ? ((v) & ~0x1ffffff) == 0      \
4205            ? 7                          \
4206            : 6                          \
4207          : ((v) & ~0x7ffffff) == 0      \
4208            ? 5                          \
4209            : 4                          \
4210        : ((v) & ~0x3fffffff) == 0       \
4211          ? ((v) & ~0x1fffffff) == 0     \
4212            ? 3                          \
4213            : 2                          \
4214          : ((v) & ~0x7fffffff) == 0     \
4215            ? 1                          \
4216            : 0)
4217
4218 /*                      load_register()
4219  *  This routine generates the least number of instructions necessary to load
4220  *  an absolute expression value into a register.
4221  */
4222 static void
4223 load_register (int reg, expressionS *ep, int dbl)
4224 {
4225   int freg;
4226   expressionS hi32, lo32;
4227
4228   if (ep->X_op != O_big)
4229     {
4230       gas_assert (ep->X_op == O_constant);
4231
4232       /* Sign-extending 32-bit constants makes their handling easier.  */
4233       if (!dbl)
4234         normalize_constant_expr (ep);
4235
4236       if (IS_SEXT_16BIT_NUM (ep->X_add_number))
4237         {
4238           /* We can handle 16 bit signed values with an addiu to
4239              $zero.  No need to ever use daddiu here, since $zero and
4240              the result are always correct in 32 bit mode.  */
4241           macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4242           return;
4243         }
4244       else if (ep->X_add_number >= 0 && ep->X_add_number < 0x10000)
4245         {
4246           /* We can handle 16 bit unsigned values with an ori to
4247              $zero.  */
4248           macro_build (ep, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4249           return;
4250         }
4251       else if ((IS_SEXT_32BIT_NUM (ep->X_add_number)))
4252         {
4253           /* 32 bit values require an lui.  */
4254           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_HI16);
4255           if ((ep->X_add_number & 0xffff) != 0)
4256             macro_build (ep, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4257           return;
4258         }
4259     }
4260
4261   /* The value is larger than 32 bits.  */
4262
4263   if (!dbl || HAVE_32BIT_GPRS)
4264     {
4265       char value[32];
4266
4267       sprintf_vma (value, ep->X_add_number);
4268       as_bad (_("Number (0x%s) larger than 32 bits"), value);
4269       macro_build (ep, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4270       return;
4271     }
4272
4273   if (ep->X_op != O_big)
4274     {
4275       hi32 = *ep;
4276       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4277       hi32.X_add_number = (valueT) hi32.X_add_number >> 16;
4278       hi32.X_add_number &= 0xffffffff;
4279       lo32 = *ep;
4280       lo32.X_add_number &= 0xffffffff;
4281     }
4282   else
4283     {
4284       gas_assert (ep->X_add_number > 2);
4285       if (ep->X_add_number == 3)
4286         generic_bignum[3] = 0;
4287       else if (ep->X_add_number > 4)
4288         as_bad (_("Number larger than 64 bits"));
4289       lo32.X_op = O_constant;
4290       lo32.X_add_number = generic_bignum[0] + (generic_bignum[1] << 16);
4291       hi32.X_op = O_constant;
4292       hi32.X_add_number = generic_bignum[2] + (generic_bignum[3] << 16);
4293     }
4294
4295   if (hi32.X_add_number == 0)
4296     freg = 0;
4297   else
4298     {
4299       int shift, bit;
4300       unsigned long hi, lo;
4301
4302       if (hi32.X_add_number == (offsetT) 0xffffffff)
4303         {
4304           if ((lo32.X_add_number & 0xffff8000) == 0xffff8000)
4305             {
4306               macro_build (&lo32, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4307               return;
4308             }
4309           if (lo32.X_add_number & 0x80000000)
4310             {
4311               macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4312               if (lo32.X_add_number & 0xffff)
4313                 macro_build (&lo32, "ori", "t,r,i", reg, reg, BFD_RELOC_LO16);
4314               return;
4315             }
4316         }
4317
4318       /* Check for 16bit shifted constant.  We know that hi32 is
4319          non-zero, so start the mask on the first bit of the hi32
4320          value.  */
4321       shift = 17;
4322       do
4323         {
4324           unsigned long himask, lomask;
4325
4326           if (shift < 32)
4327             {
4328               himask = 0xffff >> (32 - shift);
4329               lomask = (0xffff << shift) & 0xffffffff;
4330             }
4331           else
4332             {
4333               himask = 0xffff << (shift - 32);
4334               lomask = 0;
4335             }
4336           if ((hi32.X_add_number & ~(offsetT) himask) == 0
4337               && (lo32.X_add_number & ~(offsetT) lomask) == 0)
4338             {
4339               expressionS tmp;
4340
4341               tmp.X_op = O_constant;
4342               if (shift < 32)
4343                 tmp.X_add_number = ((hi32.X_add_number << (32 - shift))
4344                                     | (lo32.X_add_number >> shift));
4345               else
4346                 tmp.X_add_number = hi32.X_add_number >> (shift - 32);
4347               macro_build (&tmp, "ori", "t,r,i", reg, 0, BFD_RELOC_LO16);
4348               macro_build (NULL, (shift >= 32) ? "dsll32" : "dsll", "d,w,<",
4349                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4350               return;
4351             }
4352           ++shift;
4353         }
4354       while (shift <= (64 - 16));
4355
4356       /* Find the bit number of the lowest one bit, and store the
4357          shifted value in hi/lo.  */
4358       hi = (unsigned long) (hi32.X_add_number & 0xffffffff);
4359       lo = (unsigned long) (lo32.X_add_number & 0xffffffff);
4360       if (lo != 0)
4361         {
4362           bit = 0;
4363           while ((lo & 1) == 0)
4364             {
4365               lo >>= 1;
4366               ++bit;
4367             }
4368           lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
4369           hi >>= bit;
4370         }
4371       else
4372         {
4373           bit = 32;
4374           while ((hi & 1) == 0)
4375             {
4376               hi >>= 1;
4377               ++bit;
4378             }
4379           lo = hi;
4380           hi = 0;
4381         }
4382
4383       /* Optimize if the shifted value is a (power of 2) - 1.  */
4384       if ((hi == 0 && ((lo + 1) & lo) == 0)
4385           || (lo == 0xffffffff && ((hi + 1) & hi) == 0))
4386         {
4387           shift = COUNT_TOP_ZEROES ((unsigned int) hi32.X_add_number);
4388           if (shift != 0)
4389             {
4390               expressionS tmp;
4391
4392               /* This instruction will set the register to be all
4393                  ones.  */
4394               tmp.X_op = O_constant;
4395               tmp.X_add_number = (offsetT) -1;
4396               macro_build (&tmp, "addiu", "t,r,j", reg, 0, BFD_RELOC_LO16);
4397               if (bit != 0)
4398                 {
4399                   bit += shift;
4400                   macro_build (NULL, (bit >= 32) ? "dsll32" : "dsll", "d,w,<",
4401                                reg, reg, (bit >= 32) ? bit - 32 : bit);
4402                 }
4403               macro_build (NULL, (shift >= 32) ? "dsrl32" : "dsrl", "d,w,<",
4404                            reg, reg, (shift >= 32) ? shift - 32 : shift);
4405               return;
4406             }
4407         }
4408
4409       /* Sign extend hi32 before calling load_register, because we can
4410          generally get better code when we load a sign extended value.  */
4411       if ((hi32.X_add_number & 0x80000000) != 0)
4412         hi32.X_add_number |= ~(offsetT) 0xffffffff;
4413       load_register (reg, &hi32, 0);
4414       freg = reg;
4415     }
4416   if ((lo32.X_add_number & 0xffff0000) == 0)
4417     {
4418       if (freg != 0)
4419         {
4420           macro_build (NULL, "dsll32", "d,w,<", reg, freg, 0);
4421           freg = reg;
4422         }
4423     }
4424   else
4425     {
4426       expressionS mid16;
4427
4428       if ((freg == 0) && (lo32.X_add_number == (offsetT) 0xffffffff))
4429         {
4430           macro_build (&lo32, "lui", "t,u", reg, BFD_RELOC_HI16);
4431           macro_build (NULL, "dsrl32", "d,w,<", reg, reg, 0);
4432           return;
4433         }
4434
4435       if (freg != 0)
4436         {
4437           macro_build (NULL, "dsll", "d,w,<", reg, freg, 16);
4438           freg = reg;
4439         }
4440       mid16 = lo32;
4441       mid16.X_add_number >>= 16;
4442       macro_build (&mid16, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4443       macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4444       freg = reg;
4445     }
4446   if ((lo32.X_add_number & 0xffff) != 0)
4447     macro_build (&lo32, "ori", "t,r,i", reg, freg, BFD_RELOC_LO16);
4448 }
4449
4450 static inline void
4451 load_delay_nop (void)
4452 {
4453   if (!gpr_interlocks)
4454     macro_build (NULL, "nop", "");
4455 }
4456
4457 /* Load an address into a register.  */
4458
4459 static void
4460 load_address (int reg, expressionS *ep, int *used_at)
4461 {
4462   if (ep->X_op != O_constant
4463       && ep->X_op != O_symbol)
4464     {
4465       as_bad (_("expression too complex"));
4466       ep->X_op = O_constant;
4467     }
4468
4469   if (ep->X_op == O_constant)
4470     {
4471       load_register (reg, ep, HAVE_64BIT_ADDRESSES);
4472       return;
4473     }
4474
4475   if (mips_pic == NO_PIC)
4476     {
4477       /* If this is a reference to a GP relative symbol, we want
4478            addiu        $reg,$gp,<sym>          (BFD_RELOC_GPREL16)
4479          Otherwise we want
4480            lui          $reg,<sym>              (BFD_RELOC_HI16_S)
4481            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4482          If we have an addend, we always use the latter form.
4483
4484          With 64bit address space and a usable $at we want
4485            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4486            lui          $at,<sym>               (BFD_RELOC_HI16_S)
4487            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4488            daddiu       $at,<sym>               (BFD_RELOC_LO16)
4489            dsll32       $reg,0
4490            daddu        $reg,$reg,$at
4491
4492          If $at is already in use, we use a path which is suboptimal
4493          on superscalar processors.
4494            lui          $reg,<sym>              (BFD_RELOC_MIPS_HIGHEST)
4495            daddiu       $reg,<sym>              (BFD_RELOC_MIPS_HIGHER)
4496            dsll         $reg,16
4497            daddiu       $reg,<sym>              (BFD_RELOC_HI16_S)
4498            dsll         $reg,16
4499            daddiu       $reg,<sym>              (BFD_RELOC_LO16)
4500
4501          For GP relative symbols in 64bit address space we can use
4502          the same sequence as in 32bit address space.  */
4503       if (HAVE_64BIT_SYMBOLS)
4504         {
4505           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4506               && !nopic_need_relax (ep->X_add_symbol, 1))
4507             {
4508               relax_start (ep->X_add_symbol);
4509               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4510                            mips_gp_register, BFD_RELOC_GPREL16);
4511               relax_switch ();
4512             }
4513
4514           if (*used_at == 0 && mips_opts.at)
4515             {
4516               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4517               macro_build (ep, "lui", "t,u", AT, BFD_RELOC_HI16_S);
4518               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4519                            BFD_RELOC_MIPS_HIGHER);
4520               macro_build (ep, "daddiu", "t,r,j", AT, AT, BFD_RELOC_LO16);
4521               macro_build (NULL, "dsll32", "d,w,<", reg, reg, 0);
4522               macro_build (NULL, "daddu", "d,v,t", reg, reg, AT);
4523               *used_at = 1;
4524             }
4525           else
4526             {
4527               macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_HIGHEST);
4528               macro_build (ep, "daddiu", "t,r,j", reg, reg,
4529                            BFD_RELOC_MIPS_HIGHER);
4530               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4531               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_HI16_S);
4532               macro_build (NULL, "dsll", "d,w,<", reg, reg, 16);
4533               macro_build (ep, "daddiu", "t,r,j", reg, reg, BFD_RELOC_LO16);
4534             }
4535
4536           if (mips_relax.sequence)
4537             relax_end ();
4538         }
4539       else
4540         {
4541           if ((valueT) ep->X_add_number <= MAX_GPREL_OFFSET
4542               && !nopic_need_relax (ep->X_add_symbol, 1))
4543             {
4544               relax_start (ep->X_add_symbol);
4545               macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg,
4546                            mips_gp_register, BFD_RELOC_GPREL16);
4547               relax_switch ();
4548             }
4549           macro_build_lui (ep, reg);
4550           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j",
4551                        reg, reg, BFD_RELOC_LO16);
4552           if (mips_relax.sequence)
4553             relax_end ();
4554         }
4555     }
4556   else if (!mips_big_got)
4557     {
4558       expressionS ex;
4559
4560       /* If this is a reference to an external symbol, we want
4561            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4562          Otherwise we want
4563            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4564            nop
4565            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4566          If there is a constant, it must be added in after.
4567
4568          If we have NewABI, we want
4569            lw           $reg,<sym+cst>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
4570          unless we're referencing a global symbol with a non-zero
4571          offset, in which case cst must be added separately.  */
4572       if (HAVE_NEWABI)
4573         {
4574           if (ep->X_add_number)
4575             {
4576               ex.X_add_number = ep->X_add_number;
4577               ep->X_add_number = 0;
4578               relax_start (ep->X_add_symbol);
4579               macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4580                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4581               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4582                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4583               ex.X_op = O_constant;
4584               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4585                            reg, reg, BFD_RELOC_LO16);
4586               ep->X_add_number = ex.X_add_number;
4587               relax_switch ();
4588             }
4589           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4590                        BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
4591           if (mips_relax.sequence)
4592             relax_end ();
4593         }
4594       else
4595         {
4596           ex.X_add_number = ep->X_add_number;
4597           ep->X_add_number = 0;
4598           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4599                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4600           load_delay_nop ();
4601           relax_start (ep->X_add_symbol);
4602           relax_switch ();
4603           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4604                        BFD_RELOC_LO16);
4605           relax_end ();
4606
4607           if (ex.X_add_number != 0)
4608             {
4609               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4610                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4611               ex.X_op = O_constant;
4612               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j",
4613                            reg, reg, BFD_RELOC_LO16);
4614             }
4615         }
4616     }
4617   else if (mips_big_got)
4618     {
4619       expressionS ex;
4620
4621       /* This is the large GOT case.  If this is a reference to an
4622          external symbol, we want
4623            lui          $reg,<sym>              (BFD_RELOC_MIPS_GOT_HI16)
4624            addu         $reg,$reg,$gp
4625            lw           $reg,<sym>($reg)        (BFD_RELOC_MIPS_GOT_LO16)
4626
4627          Otherwise, for a reference to a local symbol in old ABI, we want
4628            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT16)
4629            nop
4630            addiu        $reg,$reg,<sym>         (BFD_RELOC_LO16)
4631          If there is a constant, it must be added in after.
4632
4633          In the NewABI, for local symbols, with or without offsets, we want:
4634            lw           $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
4635            addiu        $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
4636       */
4637       if (HAVE_NEWABI)
4638         {
4639           ex.X_add_number = ep->X_add_number;
4640           ep->X_add_number = 0;
4641           relax_start (ep->X_add_symbol);
4642           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4643           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4644                        reg, reg, mips_gp_register);
4645           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4646                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4647           if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4648             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4649           else if (ex.X_add_number)
4650             {
4651               ex.X_op = O_constant;
4652               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4653                            BFD_RELOC_LO16);
4654             }
4655
4656           ep->X_add_number = ex.X_add_number;
4657           relax_switch ();
4658           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4659                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
4660           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4661                        BFD_RELOC_MIPS_GOT_OFST);
4662           relax_end ();
4663         }
4664       else
4665         {
4666           ex.X_add_number = ep->X_add_number;
4667           ep->X_add_number = 0;
4668           relax_start (ep->X_add_symbol);
4669           macro_build (ep, "lui", "t,u", reg, BFD_RELOC_MIPS_GOT_HI16);
4670           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
4671                        reg, reg, mips_gp_register);
4672           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)",
4673                        reg, BFD_RELOC_MIPS_GOT_LO16, reg);
4674           relax_switch ();
4675           if (reg_needs_delay (mips_gp_register))
4676             {
4677               /* We need a nop before loading from $gp.  This special
4678                  check is required because the lui which starts the main
4679                  instruction stream does not refer to $gp, and so will not
4680                  insert the nop which may be required.  */
4681               macro_build (NULL, "nop", "");
4682             }
4683           macro_build (ep, ADDRESS_LOAD_INSN, "t,o(b)", reg,
4684                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
4685           load_delay_nop ();
4686           macro_build (ep, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4687                        BFD_RELOC_LO16);
4688           relax_end ();
4689
4690           if (ex.X_add_number != 0)
4691             {
4692               if (ex.X_add_number < -0x8000 || ex.X_add_number >= 0x8000)
4693                 as_bad (_("PIC code offset overflow (max 16 signed bits)"));
4694               ex.X_op = O_constant;
4695               macro_build (&ex, ADDRESS_ADDI_INSN, "t,r,j", reg, reg,
4696                            BFD_RELOC_LO16);
4697             }
4698         }
4699     }
4700   else
4701     abort ();
4702
4703   if (!mips_opts.at && *used_at == 1)
4704     as_bad (_("Macro used $at after \".set noat\""));
4705 }
4706
4707 /* Move the contents of register SOURCE into register DEST.  */
4708
4709 static void
4710 move_register (int dest, int source)
4711 {
4712   macro_build (NULL, HAVE_32BIT_GPRS ? "addu" : "daddu", "d,v,t",
4713                dest, source, 0);
4714 }
4715
4716 /* Emit an SVR4 PIC sequence to load address LOCAL into DEST, where
4717    LOCAL is the sum of a symbol and a 16-bit or 32-bit displacement.
4718    The two alternatives are:
4719
4720    Global symbol                Local sybmol
4721    -------------                ------------
4722    lw DEST,%got(SYMBOL)         lw DEST,%got(SYMBOL + OFFSET)
4723    ...                          ...
4724    addiu DEST,DEST,OFFSET       addiu DEST,DEST,%lo(SYMBOL + OFFSET)
4725
4726    load_got_offset emits the first instruction and add_got_offset
4727    emits the second for a 16-bit offset or add_got_offset_hilo emits
4728    a sequence to add a 32-bit offset using a scratch register.  */
4729
4730 static void
4731 load_got_offset (int dest, expressionS *local)
4732 {
4733   expressionS global;
4734
4735   global = *local;
4736   global.X_add_number = 0;
4737
4738   relax_start (local->X_add_symbol);
4739   macro_build (&global, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4740                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4741   relax_switch ();
4742   macro_build (local, ADDRESS_LOAD_INSN, "t,o(b)", dest,
4743                BFD_RELOC_MIPS_GOT16, mips_gp_register);
4744   relax_end ();
4745 }
4746
4747 static void
4748 add_got_offset (int dest, expressionS *local)
4749 {
4750   expressionS global;
4751
4752   global.X_op = O_constant;
4753   global.X_op_symbol = NULL;
4754   global.X_add_symbol = NULL;
4755   global.X_add_number = local->X_add_number;
4756
4757   relax_start (local->X_add_symbol);
4758   macro_build (&global, ADDRESS_ADDI_INSN, "t,r,j",
4759                dest, dest, BFD_RELOC_LO16);
4760   relax_switch ();
4761   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", dest, dest, BFD_RELOC_LO16);
4762   relax_end ();
4763 }
4764
4765 static void
4766 add_got_offset_hilo (int dest, expressionS *local, int tmp)
4767 {
4768   expressionS global;
4769   int hold_mips_optimize;
4770
4771   global.X_op = O_constant;
4772   global.X_op_symbol = NULL;
4773   global.X_add_symbol = NULL;
4774   global.X_add_number = local->X_add_number;
4775
4776   relax_start (local->X_add_symbol);
4777   load_register (tmp, &global, HAVE_64BIT_ADDRESSES);
4778   relax_switch ();
4779   /* Set mips_optimize around the lui instruction to avoid
4780      inserting an unnecessary nop after the lw.  */
4781   hold_mips_optimize = mips_optimize;
4782   mips_optimize = 2;
4783   macro_build_lui (&global, tmp);
4784   mips_optimize = hold_mips_optimize;
4785   macro_build (local, ADDRESS_ADDI_INSN, "t,r,j", tmp, tmp, BFD_RELOC_LO16);
4786   relax_end ();
4787
4788   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dest, dest, tmp);
4789 }
4790
4791 /*
4792  *                      Build macros
4793  *   This routine implements the seemingly endless macro or synthesized
4794  * instructions and addressing modes in the mips assembly language. Many
4795  * of these macros are simple and are similar to each other. These could
4796  * probably be handled by some kind of table or grammar approach instead of
4797  * this verbose method. Others are not simple macros but are more like
4798  * optimizing code generation.
4799  *   One interesting optimization is when several store macros appear
4800  * consecutively that would load AT with the upper half of the same address.
4801  * The ensuing load upper instructions are ommited. This implies some kind
4802  * of global optimization. We currently only optimize within a single macro.
4803  *   For many of the load and store macros if the address is specified as a
4804  * constant expression in the first 64k of memory (ie ld $2,0x4000c) we
4805  * first load register 'at' with zero and use it as the base register. The
4806  * mips assembler simply uses register $zero. Just one tiny optimization
4807  * we're missing.
4808  */
4809 static void
4810 macro (struct mips_cl_insn *ip)
4811 {
4812   unsigned int treg, sreg, dreg, breg;
4813   unsigned int tempreg;
4814   int mask;
4815   int used_at = 0;
4816   expressionS expr1;
4817   const char *s;
4818   const char *s2;
4819   const char *fmt;
4820   int likely = 0;
4821   int dbl = 0;
4822   int coproc = 0;
4823   int lr = 0;
4824   int imm = 0;
4825   int call = 0;
4826   int off;
4827   offsetT maxnum;
4828   bfd_reloc_code_real_type r;
4829   int hold_mips_optimize;
4830
4831   gas_assert (! mips_opts.mips16);
4832
4833   treg = (ip->insn_opcode >> 16) & 0x1f;
4834   dreg = (ip->insn_opcode >> 11) & 0x1f;
4835   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
4836   mask = ip->insn_mo->mask;
4837
4838   expr1.X_op = O_constant;
4839   expr1.X_op_symbol = NULL;
4840   expr1.X_add_symbol = NULL;
4841   expr1.X_add_number = 1;
4842
4843   switch (mask)
4844     {
4845     case M_DABS:
4846       dbl = 1;
4847     case M_ABS:
4848       /* bgez $a0,.+12
4849          move v0,$a0
4850          sub v0,$zero,$a0
4851          */
4852
4853       start_noreorder ();
4854
4855       expr1.X_add_number = 8;
4856       macro_build (&expr1, "bgez", "s,p", sreg);
4857       if (dreg == sreg)
4858         macro_build (NULL, "nop", "", 0);
4859       else
4860         move_register (dreg, sreg);
4861       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, 0, sreg);
4862
4863       end_noreorder ();
4864       break;
4865
4866     case M_ADD_I:
4867       s = "addi";
4868       s2 = "add";
4869       goto do_addi;
4870     case M_ADDU_I:
4871       s = "addiu";
4872       s2 = "addu";
4873       goto do_addi;
4874     case M_DADD_I:
4875       dbl = 1;
4876       s = "daddi";
4877       s2 = "dadd";
4878       goto do_addi;
4879     case M_DADDU_I:
4880       dbl = 1;
4881       s = "daddiu";
4882       s2 = "daddu";
4883     do_addi:
4884       if (imm_expr.X_op == O_constant
4885           && imm_expr.X_add_number >= -0x8000
4886           && imm_expr.X_add_number < 0x8000)
4887         {
4888           macro_build (&imm_expr, s, "t,r,j", treg, sreg, BFD_RELOC_LO16);
4889           break;
4890         }
4891       used_at = 1;
4892       load_register (AT, &imm_expr, dbl);
4893       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4894       break;
4895
4896     case M_AND_I:
4897       s = "andi";
4898       s2 = "and";
4899       goto do_bit;
4900     case M_OR_I:
4901       s = "ori";
4902       s2 = "or";
4903       goto do_bit;
4904     case M_NOR_I:
4905       s = "";
4906       s2 = "nor";
4907       goto do_bit;
4908     case M_XOR_I:
4909       s = "xori";
4910       s2 = "xor";
4911     do_bit:
4912       if (imm_expr.X_op == O_constant
4913           && imm_expr.X_add_number >= 0
4914           && imm_expr.X_add_number < 0x10000)
4915         {
4916           if (mask != M_NOR_I)
4917             macro_build (&imm_expr, s, "t,r,i", treg, sreg, BFD_RELOC_LO16);
4918           else
4919             {
4920               macro_build (&imm_expr, "ori", "t,r,i",
4921                            treg, sreg, BFD_RELOC_LO16);
4922               macro_build (NULL, "nor", "d,v,t", treg, treg, 0);
4923             }
4924           break;
4925         }
4926
4927       used_at = 1;
4928       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4929       macro_build (NULL, s2, "d,v,t", treg, sreg, AT);
4930       break;
4931
4932     case M_BALIGN:
4933       switch (imm_expr.X_add_number)
4934         {
4935         case 0:
4936           macro_build (NULL, "nop", "");
4937           break;
4938         case 2:
4939           macro_build (NULL, "packrl.ph", "d,s,t", treg, treg, sreg);
4940           break;
4941         default:
4942           macro_build (NULL, "balign", "t,s,2", treg, sreg,
4943                        (int)imm_expr.X_add_number);
4944           break;
4945         }
4946       break;
4947
4948     case M_BEQ_I:
4949       s = "beq";
4950       goto beq_i;
4951     case M_BEQL_I:
4952       s = "beql";
4953       likely = 1;
4954       goto beq_i;
4955     case M_BNE_I:
4956       s = "bne";
4957       goto beq_i;
4958     case M_BNEL_I:
4959       s = "bnel";
4960       likely = 1;
4961     beq_i:
4962       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
4963         {
4964           macro_build (&offset_expr, s, "s,t,p", sreg, 0);
4965           break;
4966         }
4967       used_at = 1;
4968       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
4969       macro_build (&offset_expr, s, "s,t,p", sreg, AT);
4970       break;
4971
4972     case M_BGEL:
4973       likely = 1;
4974     case M_BGE:
4975       if (treg == 0)
4976         {
4977           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
4978           break;
4979         }
4980       if (sreg == 0)
4981         {
4982           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", treg);
4983           break;
4984         }
4985       used_at = 1;
4986       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
4987       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
4988       break;
4989
4990     case M_BGTL_I:
4991       likely = 1;
4992     case M_BGT_I:
4993       /* check for > max integer */
4994       maxnum = 0x7fffffff;
4995       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
4996         {
4997           maxnum <<= 16;
4998           maxnum |= 0xffff;
4999           maxnum <<= 16;
5000           maxnum |= 0xffff;
5001         }
5002       if (imm_expr.X_op == O_constant
5003           && imm_expr.X_add_number >= maxnum
5004           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5005         {
5006         do_false:
5007           /* result is always false */
5008           if (! likely)
5009             macro_build (NULL, "nop", "", 0);
5010           else
5011             macro_build (&offset_expr, "bnel", "s,t,p", 0, 0);
5012           break;
5013         }
5014       if (imm_expr.X_op != O_constant)
5015         as_bad (_("Unsupported large constant"));
5016       ++imm_expr.X_add_number;
5017       /* FALLTHROUGH */
5018     case M_BGE_I:
5019     case M_BGEL_I:
5020       if (mask == M_BGEL_I)
5021         likely = 1;
5022       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5023         {
5024           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", sreg);
5025           break;
5026         }
5027       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5028         {
5029           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5030           break;
5031         }
5032       maxnum = 0x7fffffff;
5033       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5034         {
5035           maxnum <<= 16;
5036           maxnum |= 0xffff;
5037           maxnum <<= 16;
5038           maxnum |= 0xffff;
5039         }
5040       maxnum = - maxnum - 1;
5041       if (imm_expr.X_op == O_constant
5042           && imm_expr.X_add_number <= maxnum
5043           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5044         {
5045         do_true:
5046           /* result is always true */
5047           as_warn (_("Branch %s is always true"), ip->insn_mo->name);
5048           macro_build (&offset_expr, "b", "p");
5049           break;
5050         }
5051       used_at = 1;
5052       set_at (sreg, 0);
5053       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5054       break;
5055
5056     case M_BGEUL:
5057       likely = 1;
5058     case M_BGEU:
5059       if (treg == 0)
5060         goto do_true;
5061       if (sreg == 0)
5062         {
5063           macro_build (&offset_expr, likely ? "beql" : "beq",
5064                        "s,t,p", 0, treg);
5065           break;
5066         }
5067       used_at = 1;
5068       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5069       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5070       break;
5071
5072     case M_BGTUL_I:
5073       likely = 1;
5074     case M_BGTU_I:
5075       if (sreg == 0
5076           || (HAVE_32BIT_GPRS
5077               && imm_expr.X_op == O_constant
5078               && imm_expr.X_add_number == (offsetT) 0xffffffff))
5079         goto do_false;
5080       if (imm_expr.X_op != O_constant)
5081         as_bad (_("Unsupported large constant"));
5082       ++imm_expr.X_add_number;
5083       /* FALLTHROUGH */
5084     case M_BGEU_I:
5085     case M_BGEUL_I:
5086       if (mask == M_BGEUL_I)
5087         likely = 1;
5088       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5089         goto do_true;
5090       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5091         {
5092           macro_build (&offset_expr, likely ? "bnel" : "bne",
5093                        "s,t,p", sreg, 0);
5094           break;
5095         }
5096       used_at = 1;
5097       set_at (sreg, 1);
5098       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5099       break;
5100
5101     case M_BGTL:
5102       likely = 1;
5103     case M_BGT:
5104       if (treg == 0)
5105         {
5106           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", sreg);
5107           break;
5108         }
5109       if (sreg == 0)
5110         {
5111           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", treg);
5112           break;
5113         }
5114       used_at = 1;
5115       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5116       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5117       break;
5118
5119     case M_BGTUL:
5120       likely = 1;
5121     case M_BGTU:
5122       if (treg == 0)
5123         {
5124           macro_build (&offset_expr, likely ? "bnel" : "bne",
5125                        "s,t,p", sreg, 0);
5126           break;
5127         }
5128       if (sreg == 0)
5129         goto do_false;
5130       used_at = 1;
5131       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5132       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5133       break;
5134
5135     case M_BLEL:
5136       likely = 1;
5137     case M_BLE:
5138       if (treg == 0)
5139         {
5140           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5141           break;
5142         }
5143       if (sreg == 0)
5144         {
5145           macro_build (&offset_expr, likely ? "bgezl" : "bgez", "s,p", treg);
5146           break;
5147         }
5148       used_at = 1;
5149       macro_build (NULL, "slt", "d,v,t", AT, treg, sreg);
5150       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5151       break;
5152
5153     case M_BLEL_I:
5154       likely = 1;
5155     case M_BLE_I:
5156       maxnum = 0x7fffffff;
5157       if (HAVE_64BIT_GPRS && sizeof (maxnum) > 4)
5158         {
5159           maxnum <<= 16;
5160           maxnum |= 0xffff;
5161           maxnum <<= 16;
5162           maxnum |= 0xffff;
5163         }
5164       if (imm_expr.X_op == O_constant
5165           && imm_expr.X_add_number >= maxnum
5166           && (HAVE_32BIT_GPRS || sizeof (maxnum) > 4))
5167         goto do_true;
5168       if (imm_expr.X_op != O_constant)
5169         as_bad (_("Unsupported large constant"));
5170       ++imm_expr.X_add_number;
5171       /* FALLTHROUGH */
5172     case M_BLT_I:
5173     case M_BLTL_I:
5174       if (mask == M_BLTL_I)
5175         likely = 1;
5176       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5177         {
5178           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5179           break;
5180         }
5181       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5182         {
5183           macro_build (&offset_expr, likely ? "blezl" : "blez", "s,p", sreg);
5184           break;
5185         }
5186       used_at = 1;
5187       set_at (sreg, 0);
5188       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5189       break;
5190
5191     case M_BLEUL:
5192       likely = 1;
5193     case M_BLEU:
5194       if (treg == 0)
5195         {
5196           macro_build (&offset_expr, likely ? "beql" : "beq",
5197                        "s,t,p", sreg, 0);
5198           break;
5199         }
5200       if (sreg == 0)
5201         goto do_true;
5202       used_at = 1;
5203       macro_build (NULL, "sltu", "d,v,t", AT, treg, sreg);
5204       macro_build (&offset_expr, likely ? "beql" : "beq", "s,t,p", AT, 0);
5205       break;
5206
5207     case M_BLEUL_I:
5208       likely = 1;
5209     case M_BLEU_I:
5210       if (sreg == 0
5211           || (HAVE_32BIT_GPRS
5212               && imm_expr.X_op == O_constant
5213               && imm_expr.X_add_number == (offsetT) 0xffffffff))
5214         goto do_true;
5215       if (imm_expr.X_op != O_constant)
5216         as_bad (_("Unsupported large constant"));
5217       ++imm_expr.X_add_number;
5218       /* FALLTHROUGH */
5219     case M_BLTU_I:
5220     case M_BLTUL_I:
5221       if (mask == M_BLTUL_I)
5222         likely = 1;
5223       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5224         goto do_false;
5225       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5226         {
5227           macro_build (&offset_expr, likely ? "beql" : "beq",
5228                        "s,t,p", sreg, 0);
5229           break;
5230         }
5231       used_at = 1;
5232       set_at (sreg, 1);
5233       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5234       break;
5235
5236     case M_BLTL:
5237       likely = 1;
5238     case M_BLT:
5239       if (treg == 0)
5240         {
5241           macro_build (&offset_expr, likely ? "bltzl" : "bltz", "s,p", sreg);
5242           break;
5243         }
5244       if (sreg == 0)
5245         {
5246           macro_build (&offset_expr, likely ? "bgtzl" : "bgtz", "s,p", treg);
5247           break;
5248         }
5249       used_at = 1;
5250       macro_build (NULL, "slt", "d,v,t", AT, sreg, treg);
5251       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5252       break;
5253
5254     case M_BLTUL:
5255       likely = 1;
5256     case M_BLTU:
5257       if (treg == 0)
5258         goto do_false;
5259       if (sreg == 0)
5260         {
5261           macro_build (&offset_expr, likely ? "bnel" : "bne",
5262                        "s,t,p", 0, treg);
5263           break;
5264         }
5265       used_at = 1;
5266       macro_build (NULL, "sltu", "d,v,t", AT, sreg, treg);
5267       macro_build (&offset_expr, likely ? "bnel" : "bne", "s,t,p", AT, 0);
5268       break;
5269
5270     case M_DEXT:
5271       {
5272         unsigned long pos;
5273         unsigned long size;
5274
5275         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5276           {
5277             as_bad (_("Unsupported large constant"));
5278             pos = size = 1;
5279           }
5280         else
5281           {
5282             pos = (unsigned long) imm_expr.X_add_number;
5283             size = (unsigned long) imm2_expr.X_add_number;
5284           }
5285
5286         if (pos > 63)
5287           {
5288             as_bad (_("Improper position (%lu)"), pos);
5289             pos = 1;
5290           }
5291         if (size == 0 || size > 64
5292             || (pos + size - 1) > 63)
5293           {
5294             as_bad (_("Improper extract size (%lu, position %lu)"),
5295                     size, pos);
5296             size = 1;
5297           }
5298
5299         if (size <= 32 && pos < 32)
5300           {
5301             s = "dext";
5302             fmt = "t,r,+A,+C";
5303           }
5304         else if (size <= 32)
5305           {
5306             s = "dextu";
5307             fmt = "t,r,+E,+H";
5308           }
5309         else
5310           {
5311             s = "dextm";
5312             fmt = "t,r,+A,+G";
5313           }
5314         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, pos, size - 1);
5315       }
5316       break;
5317
5318     case M_DINS:
5319       {
5320         unsigned long pos;
5321         unsigned long size;
5322
5323         if (imm_expr.X_op != O_constant || imm2_expr.X_op != O_constant)
5324           {
5325             as_bad (_("Unsupported large constant"));
5326             pos = size = 1;
5327           }
5328         else
5329           {
5330             pos = (unsigned long) imm_expr.X_add_number;
5331             size = (unsigned long) imm2_expr.X_add_number;
5332           }
5333
5334         if (pos > 63)
5335           {
5336             as_bad (_("Improper position (%lu)"), pos);
5337             pos = 1;
5338           }
5339         if (size == 0 || size > 64
5340             || (pos + size - 1) > 63)
5341           {
5342             as_bad (_("Improper insert size (%lu, position %lu)"),
5343                     size, pos);
5344             size = 1;
5345           }
5346
5347         if (pos < 32 && (pos + size - 1) < 32)
5348           {
5349             s = "dins";
5350             fmt = "t,r,+A,+B";
5351           }
5352         else if (pos >= 32)
5353           {
5354             s = "dinsu";
5355             fmt = "t,r,+E,+F";
5356           }
5357         else
5358           {
5359             s = "dinsm";
5360             fmt = "t,r,+A,+F";
5361           }
5362         macro_build ((expressionS *) NULL, s, fmt, treg, sreg, (int) pos,
5363                      (int) (pos + size - 1));
5364       }
5365       break;
5366
5367     case M_DDIV_3:
5368       dbl = 1;
5369     case M_DIV_3:
5370       s = "mflo";
5371       goto do_div3;
5372     case M_DREM_3:
5373       dbl = 1;
5374     case M_REM_3:
5375       s = "mfhi";
5376     do_div3:
5377       if (treg == 0)
5378         {
5379           as_warn (_("Divide by zero."));
5380           if (mips_trap)
5381             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5382           else
5383             macro_build (NULL, "break", "c", 7);
5384           break;
5385         }
5386
5387       start_noreorder ();
5388       if (mips_trap)
5389         {
5390           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5391           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5392         }
5393       else
5394         {
5395           expr1.X_add_number = 8;
5396           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5397           macro_build (NULL, dbl ? "ddiv" : "div", "z,s,t", sreg, treg);
5398           macro_build (NULL, "break", "c", 7);
5399         }
5400       expr1.X_add_number = -1;
5401       used_at = 1;
5402       load_register (AT, &expr1, dbl);
5403       expr1.X_add_number = mips_trap ? (dbl ? 12 : 8) : (dbl ? 20 : 16);
5404       macro_build (&expr1, "bne", "s,t,p", treg, AT);
5405       if (dbl)
5406         {
5407           expr1.X_add_number = 1;
5408           load_register (AT, &expr1, dbl);
5409           macro_build (NULL, "dsll32", "d,w,<", AT, AT, 31);
5410         }
5411       else
5412         {
5413           expr1.X_add_number = 0x80000000;
5414           macro_build (&expr1, "lui", "t,u", AT, BFD_RELOC_HI16);
5415         }
5416       if (mips_trap)
5417         {
5418           macro_build (NULL, "teq", "s,t,q", sreg, AT, 6);
5419           /* We want to close the noreorder block as soon as possible, so
5420              that later insns are available for delay slot filling.  */
5421           end_noreorder ();
5422         }
5423       else
5424         {
5425           expr1.X_add_number = 8;
5426           macro_build (&expr1, "bne", "s,t,p", sreg, AT);
5427           macro_build (NULL, "nop", "", 0);
5428
5429           /* We want to close the noreorder block as soon as possible, so
5430              that later insns are available for delay slot filling.  */
5431           end_noreorder ();
5432
5433           macro_build (NULL, "break", "c", 6);
5434         }
5435       macro_build (NULL, s, "d", dreg);
5436       break;
5437
5438     case M_DIV_3I:
5439       s = "div";
5440       s2 = "mflo";
5441       goto do_divi;
5442     case M_DIVU_3I:
5443       s = "divu";
5444       s2 = "mflo";
5445       goto do_divi;
5446     case M_REM_3I:
5447       s = "div";
5448       s2 = "mfhi";
5449       goto do_divi;
5450     case M_REMU_3I:
5451       s = "divu";
5452       s2 = "mfhi";
5453       goto do_divi;
5454     case M_DDIV_3I:
5455       dbl = 1;
5456       s = "ddiv";
5457       s2 = "mflo";
5458       goto do_divi;
5459     case M_DDIVU_3I:
5460       dbl = 1;
5461       s = "ddivu";
5462       s2 = "mflo";
5463       goto do_divi;
5464     case M_DREM_3I:
5465       dbl = 1;
5466       s = "ddiv";
5467       s2 = "mfhi";
5468       goto do_divi;
5469     case M_DREMU_3I:
5470       dbl = 1;
5471       s = "ddivu";
5472       s2 = "mfhi";
5473     do_divi:
5474       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
5475         {
5476           as_warn (_("Divide by zero."));
5477           if (mips_trap)
5478             macro_build (NULL, "teq", "s,t,q", 0, 0, 7);
5479           else
5480             macro_build (NULL, "break", "c", 7);
5481           break;
5482         }
5483       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 1)
5484         {
5485           if (strcmp (s2, "mflo") == 0)
5486             move_register (dreg, sreg);
5487           else
5488             move_register (dreg, 0);
5489           break;
5490         }
5491       if (imm_expr.X_op == O_constant
5492           && imm_expr.X_add_number == -1
5493           && s[strlen (s) - 1] != 'u')
5494         {
5495           if (strcmp (s2, "mflo") == 0)
5496             {
5497               macro_build (NULL, dbl ? "dneg" : "neg", "d,w", dreg, sreg);
5498             }
5499           else
5500             move_register (dreg, 0);
5501           break;
5502         }
5503
5504       used_at = 1;
5505       load_register (AT, &imm_expr, dbl);
5506       macro_build (NULL, s, "z,s,t", sreg, AT);
5507       macro_build (NULL, s2, "d", dreg);
5508       break;
5509
5510     case M_DIVU_3:
5511       s = "divu";
5512       s2 = "mflo";
5513       goto do_divu3;
5514     case M_REMU_3:
5515       s = "divu";
5516       s2 = "mfhi";
5517       goto do_divu3;
5518     case M_DDIVU_3:
5519       s = "ddivu";
5520       s2 = "mflo";
5521       goto do_divu3;
5522     case M_DREMU_3:
5523       s = "ddivu";
5524       s2 = "mfhi";
5525     do_divu3:
5526       start_noreorder ();
5527       if (mips_trap)
5528         {
5529           macro_build (NULL, "teq", "s,t,q", treg, 0, 7);
5530           macro_build (NULL, s, "z,s,t", sreg, treg);
5531           /* We want to close the noreorder block as soon as possible, so
5532              that later insns are available for delay slot filling.  */
5533           end_noreorder ();
5534         }
5535       else
5536         {
5537           expr1.X_add_number = 8;
5538           macro_build (&expr1, "bne", "s,t,p", treg, 0);
5539           macro_build (NULL, s, "z,s,t", sreg, treg);
5540
5541           /* We want to close the noreorder block as soon as possible, so
5542              that later insns are available for delay slot filling.  */
5543           end_noreorder ();
5544           macro_build (NULL, "break", "c", 7);
5545         }
5546       macro_build (NULL, s2, "d", dreg);
5547       break;
5548
5549     case M_DLCA_AB:
5550       dbl = 1;
5551     case M_LCA_AB:
5552       call = 1;
5553       goto do_la;
5554     case M_DLA_AB:
5555       dbl = 1;
5556     case M_LA_AB:
5557     do_la:
5558       /* Load the address of a symbol into a register.  If breg is not
5559          zero, we then add a base register to it.  */
5560
5561       if (dbl && HAVE_32BIT_GPRS)
5562         as_warn (_("dla used to load 32-bit register"));
5563
5564       if (! dbl && HAVE_64BIT_OBJECTS)
5565         as_warn (_("la used to load 64-bit address"));
5566
5567       if (offset_expr.X_op == O_constant
5568           && offset_expr.X_add_number >= -0x8000
5569           && offset_expr.X_add_number < 0x8000)
5570         {
5571           macro_build (&offset_expr, ADDRESS_ADDI_INSN,
5572                        "t,r,j", treg, sreg, BFD_RELOC_LO16);
5573           break;
5574         }
5575
5576       if (mips_opts.at && (treg == breg))
5577         {
5578           tempreg = AT;
5579           used_at = 1;
5580         }
5581       else
5582         {
5583           tempreg = treg;
5584         }
5585
5586       if (offset_expr.X_op != O_symbol
5587           && offset_expr.X_op != O_constant)
5588         {
5589           as_bad (_("expression too complex"));
5590           offset_expr.X_op = O_constant;
5591         }
5592
5593       if (offset_expr.X_op == O_constant)
5594         load_register (tempreg, &offset_expr, HAVE_64BIT_ADDRESSES);
5595       else if (mips_pic == NO_PIC)
5596         {
5597           /* If this is a reference to a GP relative symbol, we want
5598                addiu    $tempreg,$gp,<sym>      (BFD_RELOC_GPREL16)
5599              Otherwise we want
5600                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
5601                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5602              If we have a constant, we need two instructions anyhow,
5603              so we may as well always use the latter form.
5604
5605              With 64bit address space and a usable $at we want
5606                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5607                lui      $at,<sym>               (BFD_RELOC_HI16_S)
5608                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5609                daddiu   $at,<sym>               (BFD_RELOC_LO16)
5610                dsll32   $tempreg,0
5611                daddu    $tempreg,$tempreg,$at
5612
5613              If $at is already in use, we use a path which is suboptimal
5614              on superscalar processors.
5615                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
5616                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
5617                dsll     $tempreg,16
5618                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
5619                dsll     $tempreg,16
5620                daddiu   $tempreg,<sym>          (BFD_RELOC_LO16)
5621
5622              For GP relative symbols in 64bit address space we can use
5623              the same sequence as in 32bit address space.  */
5624           if (HAVE_64BIT_SYMBOLS)
5625             {
5626               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5627                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5628                 {
5629                   relax_start (offset_expr.X_add_symbol);
5630                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5631                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5632                   relax_switch ();
5633                 }
5634
5635               if (used_at == 0 && mips_opts.at)
5636                 {
5637                   macro_build (&offset_expr, "lui", "t,u",
5638                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5639                   macro_build (&offset_expr, "lui", "t,u",
5640                                AT, BFD_RELOC_HI16_S);
5641                   macro_build (&offset_expr, "daddiu", "t,r,j",
5642                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5643                   macro_build (&offset_expr, "daddiu", "t,r,j",
5644                                AT, AT, BFD_RELOC_LO16);
5645                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
5646                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
5647                   used_at = 1;
5648                 }
5649               else
5650                 {
5651                   macro_build (&offset_expr, "lui", "t,u",
5652                                tempreg, BFD_RELOC_MIPS_HIGHEST);
5653                   macro_build (&offset_expr, "daddiu", "t,r,j",
5654                                tempreg, tempreg, BFD_RELOC_MIPS_HIGHER);
5655                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5656                   macro_build (&offset_expr, "daddiu", "t,r,j",
5657                                tempreg, tempreg, BFD_RELOC_HI16_S);
5658                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
5659                   macro_build (&offset_expr, "daddiu", "t,r,j",
5660                                tempreg, tempreg, BFD_RELOC_LO16);
5661                 }
5662
5663               if (mips_relax.sequence)
5664                 relax_end ();
5665             }
5666           else
5667             {
5668               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
5669                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
5670                 {
5671                   relax_start (offset_expr.X_add_symbol);
5672                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5673                                tempreg, mips_gp_register, BFD_RELOC_GPREL16);
5674                   relax_switch ();
5675                 }
5676               if (!IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
5677                 as_bad (_("offset too large"));
5678               macro_build_lui (&offset_expr, tempreg);
5679               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5680                            tempreg, tempreg, BFD_RELOC_LO16);
5681               if (mips_relax.sequence)
5682                 relax_end ();
5683             }
5684         }
5685       else if (!mips_big_got && !HAVE_NEWABI)
5686         {
5687           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5688
5689           /* If this is a reference to an external symbol, and there
5690              is no constant, we want
5691                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5692              or for lca or if tempreg is PIC_CALL_REG
5693                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5694              For a local symbol, we want
5695                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5696                nop
5697                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5698
5699              If we have a small constant, and this is a reference to
5700              an external symbol, we want
5701                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5702                nop
5703                addiu    $tempreg,$tempreg,<constant>
5704              For a local symbol, we want the same instruction
5705              sequence, but we output a BFD_RELOC_LO16 reloc on the
5706              addiu instruction.
5707
5708              If we have a large constant, and this is a reference to
5709              an external symbol, we want
5710                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5711                lui      $at,<hiconstant>
5712                addiu    $at,$at,<loconstant>
5713                addu     $tempreg,$tempreg,$at
5714              For a local symbol, we want the same instruction
5715              sequence, but we output a BFD_RELOC_LO16 reloc on the
5716              addiu instruction.
5717            */
5718
5719           if (offset_expr.X_add_number == 0)
5720             {
5721               if (mips_pic == SVR4_PIC
5722                   && breg == 0
5723                   && (call || tempreg == PIC_CALL_REG))
5724                 lw_reloc_type = (int) BFD_RELOC_MIPS_CALL16;
5725
5726               relax_start (offset_expr.X_add_symbol);
5727               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5728                            lw_reloc_type, mips_gp_register);
5729               if (breg != 0)
5730                 {
5731                   /* We're going to put in an addu instruction using
5732                      tempreg, so we may as well insert the nop right
5733                      now.  */
5734                   load_delay_nop ();
5735                 }
5736               relax_switch ();
5737               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5738                            tempreg, BFD_RELOC_MIPS_GOT16, mips_gp_register);
5739               load_delay_nop ();
5740               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
5741                            tempreg, tempreg, BFD_RELOC_LO16);
5742               relax_end ();
5743               /* FIXME: If breg == 0, and the next instruction uses
5744                  $tempreg, then if this variant case is used an extra
5745                  nop will be generated.  */
5746             }
5747           else if (offset_expr.X_add_number >= -0x8000
5748                    && offset_expr.X_add_number < 0x8000)
5749             {
5750               load_got_offset (tempreg, &offset_expr);
5751               load_delay_nop ();
5752               add_got_offset (tempreg, &offset_expr);
5753             }
5754           else
5755             {
5756               expr1.X_add_number = offset_expr.X_add_number;
5757               offset_expr.X_add_number =
5758                 ((offset_expr.X_add_number + 0x8000) & 0xffff) - 0x8000;
5759               load_got_offset (tempreg, &offset_expr);
5760               offset_expr.X_add_number = expr1.X_add_number;
5761               /* If we are going to add in a base register, and the
5762                  target register and the base register are the same,
5763                  then we are using AT as a temporary register.  Since
5764                  we want to load the constant into AT, we add our
5765                  current AT (from the global offset table) and the
5766                  register into the register now, and pretend we were
5767                  not using a base register.  */
5768               if (breg == treg)
5769                 {
5770                   load_delay_nop ();
5771                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5772                                treg, AT, breg);
5773                   breg = 0;
5774                   tempreg = treg;
5775                 }
5776               add_got_offset_hilo (tempreg, &offset_expr, AT);
5777               used_at = 1;
5778             }
5779         }
5780       else if (!mips_big_got && HAVE_NEWABI)
5781         {
5782           int add_breg_early = 0;
5783
5784           /* If this is a reference to an external, and there is no
5785              constant, or local symbol (*), with or without a
5786              constant, we want
5787                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5788              or for lca or if tempreg is PIC_CALL_REG
5789                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_CALL16)
5790
5791              If we have a small constant, and this is a reference to
5792              an external symbol, we want
5793                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5794                addiu    $tempreg,$tempreg,<constant>
5795
5796              If we have a large constant, and this is a reference to
5797              an external symbol, we want
5798                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_DISP)
5799                lui      $at,<hiconstant>
5800                addiu    $at,$at,<loconstant>
5801                addu     $tempreg,$tempreg,$at
5802
5803              (*) Other assemblers seem to prefer GOT_PAGE/GOT_OFST for
5804              local symbols, even though it introduces an additional
5805              instruction.  */
5806
5807           if (offset_expr.X_add_number)
5808             {
5809               expr1.X_add_number = offset_expr.X_add_number;
5810               offset_expr.X_add_number = 0;
5811
5812               relax_start (offset_expr.X_add_symbol);
5813               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5814                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5815
5816               if (expr1.X_add_number >= -0x8000
5817                   && expr1.X_add_number < 0x8000)
5818                 {
5819                   macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5820                                tempreg, tempreg, BFD_RELOC_LO16);
5821                 }
5822               else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
5823                 {
5824                   /* If we are going to add in a base register, and the
5825                      target register and the base register are the same,
5826                      then we are using AT as a temporary register.  Since
5827                      we want to load the constant into AT, we add our
5828                      current AT (from the global offset table) and the
5829                      register into the register now, and pretend we were
5830                      not using a base register.  */
5831                   if (breg != treg)
5832                     dreg = tempreg;
5833                   else
5834                     {
5835                       gas_assert (tempreg == AT);
5836                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5837                                    treg, AT, breg);
5838                       dreg = treg;
5839                       add_breg_early = 1;
5840                     }
5841
5842                   load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5843                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5844                                dreg, dreg, AT);
5845
5846                   used_at = 1;
5847                 }
5848               else
5849                 as_bad (_("PIC code offset overflow (max 32 signed bits)"));
5850
5851               relax_switch ();
5852               offset_expr.X_add_number = expr1.X_add_number;
5853
5854               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5855                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5856               if (add_breg_early)
5857                 {
5858                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5859                                treg, tempreg, breg);
5860                   breg = 0;
5861                   tempreg = treg;
5862                 }
5863               relax_end ();
5864             }
5865           else if (breg == 0 && (call || tempreg == PIC_CALL_REG))
5866             {
5867               relax_start (offset_expr.X_add_symbol);
5868               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5869                            BFD_RELOC_MIPS_CALL16, mips_gp_register);
5870               relax_switch ();
5871               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5872                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5873               relax_end ();
5874             }
5875           else
5876             {
5877               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5878                            BFD_RELOC_MIPS_GOT_DISP, mips_gp_register);
5879             }
5880         }
5881       else if (mips_big_got && !HAVE_NEWABI)
5882         {
5883           int gpdelay;
5884           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
5885           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
5886           int local_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
5887
5888           /* This is the large GOT case.  If this is a reference to an
5889              external symbol, and there is no constant, we want
5890                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5891                addu     $tempreg,$tempreg,$gp
5892                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5893              or for lca or if tempreg is PIC_CALL_REG
5894                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
5895                addu     $tempreg,$tempreg,$gp
5896                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
5897              For a local symbol, we want
5898                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5899                nop
5900                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
5901
5902              If we have a small constant, and this is a reference to
5903              an external symbol, we want
5904                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5905                addu     $tempreg,$tempreg,$gp
5906                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5907                nop
5908                addiu    $tempreg,$tempreg,<constant>
5909              For a local symbol, we want
5910                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5911                nop
5912                addiu    $tempreg,$tempreg,<constant> (BFD_RELOC_LO16)
5913
5914              If we have a large constant, and this is a reference to
5915              an external symbol, we want
5916                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
5917                addu     $tempreg,$tempreg,$gp
5918                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
5919                lui      $at,<hiconstant>
5920                addiu    $at,$at,<loconstant>
5921                addu     $tempreg,$tempreg,$at
5922              For a local symbol, we want
5923                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
5924                lui      $at,<hiconstant>
5925                addiu    $at,$at,<loconstant>    (BFD_RELOC_LO16)
5926                addu     $tempreg,$tempreg,$at
5927           */
5928
5929           expr1.X_add_number = offset_expr.X_add_number;
5930           offset_expr.X_add_number = 0;
5931           relax_start (offset_expr.X_add_symbol);
5932           gpdelay = reg_needs_delay (mips_gp_register);
5933           if (expr1.X_add_number == 0 && breg == 0
5934               && (call || tempreg == PIC_CALL_REG))
5935             {
5936               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
5937               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
5938             }
5939           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
5940           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5941                        tempreg, tempreg, mips_gp_register);
5942           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
5943                        tempreg, lw_reloc_type, tempreg);
5944           if (expr1.X_add_number == 0)
5945             {
5946               if (breg != 0)
5947                 {
5948                   /* We're going to put in an addu instruction using
5949                      tempreg, so we may as well insert the nop right
5950                      now.  */
5951                   load_delay_nop ();
5952                 }
5953             }
5954           else if (expr1.X_add_number >= -0x8000
5955                    && expr1.X_add_number < 0x8000)
5956             {
5957               load_delay_nop ();
5958               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
5959                            tempreg, tempreg, BFD_RELOC_LO16);
5960             }
5961           else
5962             {
5963               /* If we are going to add in a base register, and the
5964                  target register and the base register are the same,
5965                  then we are using AT as a temporary register.  Since
5966                  we want to load the constant into AT, we add our
5967                  current AT (from the global offset table) and the
5968                  register into the register now, and pretend we were
5969                  not using a base register.  */
5970               if (breg != treg)
5971                 dreg = tempreg;
5972               else
5973                 {
5974                   gas_assert (tempreg == AT);
5975                   load_delay_nop ();
5976                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
5977                                treg, AT, breg);
5978                   dreg = treg;
5979                 }
5980
5981               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
5982               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
5983
5984               used_at = 1;
5985             }
5986           offset_expr.X_add_number =
5987             ((expr1.X_add_number + 0x8000) & 0xffff) - 0x8000;
5988           relax_switch ();
5989
5990           if (gpdelay)
5991             {
5992               /* This is needed because this instruction uses $gp, but
5993                  the first instruction on the main stream does not.  */
5994               macro_build (NULL, "nop", "");
5995             }
5996
5997           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
5998                        local_reloc_type, mips_gp_register);
5999           if (expr1.X_add_number >= -0x8000
6000               && expr1.X_add_number < 0x8000)
6001             {
6002               load_delay_nop ();
6003               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6004                            tempreg, tempreg, BFD_RELOC_LO16);
6005               /* FIXME: If add_number is 0, and there was no base
6006                  register, the external symbol case ended with a load,
6007                  so if the symbol turns out to not be external, and
6008                  the next instruction uses tempreg, an unnecessary nop
6009                  will be inserted.  */
6010             }
6011           else
6012             {
6013               if (breg == treg)
6014                 {
6015                   /* We must add in the base register now, as in the
6016                      external symbol case.  */
6017                   gas_assert (tempreg == AT);
6018                   load_delay_nop ();
6019                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6020                                treg, AT, breg);
6021                   tempreg = treg;
6022                   /* We set breg to 0 because we have arranged to add
6023                      it in in both cases.  */
6024                   breg = 0;
6025                 }
6026
6027               macro_build_lui (&expr1, AT);
6028               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6029                            AT, AT, BFD_RELOC_LO16);
6030               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6031                            tempreg, tempreg, AT);
6032               used_at = 1;
6033             }
6034           relax_end ();
6035         }
6036       else if (mips_big_got && HAVE_NEWABI)
6037         {
6038           int lui_reloc_type = (int) BFD_RELOC_MIPS_GOT_HI16;
6039           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT_LO16;
6040           int add_breg_early = 0;
6041
6042           /* This is the large GOT case.  If this is a reference to an
6043              external symbol, and there is no constant, we want
6044                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6045                add      $tempreg,$tempreg,$gp
6046                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6047              or for lca or if tempreg is PIC_CALL_REG
6048                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_CALL_HI16)
6049                add      $tempreg,$tempreg,$gp
6050                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_CALL_LO16)
6051
6052              If we have a small constant, and this is a reference to
6053              an external symbol, we want
6054                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6055                add      $tempreg,$tempreg,$gp
6056                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6057                addi     $tempreg,$tempreg,<constant>
6058
6059              If we have a large constant, and this is a reference to
6060              an external symbol, we want
6061                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6062                addu     $tempreg,$tempreg,$gp
6063                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6064                lui      $at,<hiconstant>
6065                addi     $at,$at,<loconstant>
6066                add      $tempreg,$tempreg,$at
6067
6068              If we have NewABI, and we know it's a local symbol, we want
6069                lw       $reg,<sym>($gp)         (BFD_RELOC_MIPS_GOT_PAGE)
6070                addiu    $reg,$reg,<sym>         (BFD_RELOC_MIPS_GOT_OFST)
6071              otherwise we have to resort to GOT_HI16/GOT_LO16.  */
6072
6073           relax_start (offset_expr.X_add_symbol);
6074
6075           expr1.X_add_number = offset_expr.X_add_number;
6076           offset_expr.X_add_number = 0;
6077
6078           if (expr1.X_add_number == 0 && breg == 0
6079               && (call || tempreg == PIC_CALL_REG))
6080             {
6081               lui_reloc_type = (int) BFD_RELOC_MIPS_CALL_HI16;
6082               lw_reloc_type = (int) BFD_RELOC_MIPS_CALL_LO16;
6083             }
6084           macro_build (&offset_expr, "lui", "t,u", tempreg, lui_reloc_type);
6085           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6086                        tempreg, tempreg, mips_gp_register);
6087           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6088                        tempreg, lw_reloc_type, tempreg);
6089
6090           if (expr1.X_add_number == 0)
6091             ;
6092           else if (expr1.X_add_number >= -0x8000
6093                    && expr1.X_add_number < 0x8000)
6094             {
6095               macro_build (&expr1, ADDRESS_ADDI_INSN, "t,r,j",
6096                            tempreg, tempreg, BFD_RELOC_LO16);
6097             }
6098           else if (IS_SEXT_32BIT_NUM (expr1.X_add_number + 0x8000))
6099             {
6100               /* If we are going to add in a base register, and the
6101                  target register and the base register are the same,
6102                  then we are using AT as a temporary register.  Since
6103                  we want to load the constant into AT, we add our
6104                  current AT (from the global offset table) and the
6105                  register into the register now, and pretend we were
6106                  not using a base register.  */
6107               if (breg != treg)
6108                 dreg = tempreg;
6109               else
6110                 {
6111                   gas_assert (tempreg == AT);
6112                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6113                                treg, AT, breg);
6114                   dreg = treg;
6115                   add_breg_early = 1;
6116                 }
6117
6118               load_register (AT, &expr1, HAVE_64BIT_ADDRESSES);
6119               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", dreg, dreg, AT);
6120
6121               used_at = 1;
6122             }
6123           else
6124             as_bad (_("PIC code offset overflow (max 32 signed bits)"));
6125
6126           relax_switch ();
6127           offset_expr.X_add_number = expr1.X_add_number;
6128           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6129                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6130           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6131                        tempreg, BFD_RELOC_MIPS_GOT_OFST);
6132           if (add_breg_early)
6133             {
6134               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6135                            treg, tempreg, breg);
6136               breg = 0;
6137               tempreg = treg;
6138             }
6139           relax_end ();
6140         }
6141       else
6142         abort ();
6143
6144       if (breg != 0)
6145         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", treg, tempreg, breg);
6146       break;
6147
6148     case M_MSGSND:
6149       {
6150         unsigned long temp = (treg << 16) | (0x01);
6151         macro_build (NULL, "c2", "C", temp);
6152       }
6153       /* AT is not used, just return */
6154       return;
6155
6156     case M_MSGLD:
6157       {
6158         unsigned long temp = (0x02);
6159         macro_build (NULL, "c2", "C", temp);
6160       }
6161       /* AT is not used, just return */
6162       return;
6163
6164     case M_MSGLD_T:
6165       {
6166         unsigned long temp = (treg << 16) | (0x02);
6167         macro_build (NULL, "c2", "C", temp);
6168       }
6169       /* AT is not used, just return */
6170       return;
6171
6172     case M_MSGWAIT:
6173       macro_build (NULL, "c2", "C", 3);
6174       /* AT is not used, just return */
6175       return;
6176
6177     case M_MSGWAIT_T:
6178       {
6179         unsigned long temp = (treg << 16) | 0x03;
6180         macro_build (NULL, "c2", "C", temp);
6181       }
6182       /* AT is not used, just return */
6183       return;
6184
6185     case M_J_A:
6186       /* The j instruction may not be used in PIC code, since it
6187          requires an absolute address.  We convert it to a b
6188          instruction.  */
6189       if (mips_pic == NO_PIC)
6190         macro_build (&offset_expr, "j", "a");
6191       else
6192         macro_build (&offset_expr, "b", "p");
6193       break;
6194
6195       /* The jal instructions must be handled as macros because when
6196          generating PIC code they expand to multi-instruction
6197          sequences.  Normally they are simple instructions.  */
6198     case M_JAL_1:
6199       dreg = RA;
6200       /* Fall through.  */
6201     case M_JAL_2:
6202       if (mips_pic == NO_PIC)
6203         macro_build (NULL, "jalr", "d,s", dreg, sreg);
6204       else
6205         {
6206           if (sreg != PIC_CALL_REG)
6207             as_warn (_("MIPS PIC call to register other than $25"));
6208
6209           macro_build (NULL, "jalr", "d,s", dreg, sreg);
6210           if (mips_pic == SVR4_PIC && !HAVE_NEWABI)
6211             {
6212               if (mips_cprestore_offset < 0)
6213                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6214               else
6215                 {
6216                   if (! mips_frame_reg_valid)
6217                     {
6218                       as_warn (_("No .frame pseudo-op used in PIC code"));
6219                       /* Quiet this warning.  */
6220                       mips_frame_reg_valid = 1;
6221                     }
6222                   if (! mips_cprestore_valid)
6223                     {
6224                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6225                       /* Quiet this warning.  */
6226                       mips_cprestore_valid = 1;
6227                     }
6228                   if (mips_opts.noreorder)
6229                     macro_build (NULL, "nop", "");
6230                   expr1.X_add_number = mips_cprestore_offset;
6231                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6232                                                 mips_gp_register,
6233                                                 mips_frame_reg,
6234                                                 HAVE_64BIT_ADDRESSES);
6235                 }
6236             }
6237         }
6238
6239       break;
6240
6241     case M_JAL_A:
6242       if (mips_pic == NO_PIC)
6243         macro_build (&offset_expr, "jal", "a");
6244       else if (mips_pic == SVR4_PIC)
6245         {
6246           /* If this is a reference to an external symbol, and we are
6247              using a small GOT, we want
6248                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_CALL16)
6249                nop
6250                jalr     $ra,$25
6251                nop
6252                lw       $gp,cprestore($sp)
6253              The cprestore value is set using the .cprestore
6254              pseudo-op.  If we are using a big GOT, we want
6255                lui      $25,<sym>               (BFD_RELOC_MIPS_CALL_HI16)
6256                addu     $25,$25,$gp
6257                lw       $25,<sym>($25)          (BFD_RELOC_MIPS_CALL_LO16)
6258                nop
6259                jalr     $ra,$25
6260                nop
6261                lw       $gp,cprestore($sp)
6262              If the symbol is not external, we want
6263                lw       $25,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
6264                nop
6265                addiu    $25,$25,<sym>           (BFD_RELOC_LO16)
6266                jalr     $ra,$25
6267                nop
6268                lw $gp,cprestore($sp)
6269
6270              For NewABI, we use the same CALL16 or CALL_HI16/CALL_LO16
6271              sequences above, minus nops, unless the symbol is local,
6272              which enables us to use GOT_PAGE/GOT_OFST (big got) or
6273              GOT_DISP.  */
6274           if (HAVE_NEWABI)
6275             {
6276               if (! mips_big_got)
6277                 {
6278                   relax_start (offset_expr.X_add_symbol);
6279                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6280                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6281                                mips_gp_register);
6282                   relax_switch ();
6283                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6284                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_DISP,
6285                                mips_gp_register);
6286                   relax_end ();
6287                 }
6288               else
6289                 {
6290                   relax_start (offset_expr.X_add_symbol);
6291                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6292                                BFD_RELOC_MIPS_CALL_HI16);
6293                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6294                                PIC_CALL_REG, mips_gp_register);
6295                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6296                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6297                                PIC_CALL_REG);
6298                   relax_switch ();
6299                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6300                                PIC_CALL_REG, BFD_RELOC_MIPS_GOT_PAGE,
6301                                mips_gp_register);
6302                   macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6303                                PIC_CALL_REG, PIC_CALL_REG,
6304                                BFD_RELOC_MIPS_GOT_OFST);
6305                   relax_end ();
6306                 }
6307
6308               macro_build_jalr (&offset_expr);
6309             }
6310           else
6311             {
6312               relax_start (offset_expr.X_add_symbol);
6313               if (! mips_big_got)
6314                 {
6315                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6316                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL16,
6317                                mips_gp_register);
6318                   load_delay_nop ();
6319                   relax_switch ();
6320                 }
6321               else
6322                 {
6323                   int gpdelay;
6324
6325                   gpdelay = reg_needs_delay (mips_gp_register);
6326                   macro_build (&offset_expr, "lui", "t,u", PIC_CALL_REG,
6327                                BFD_RELOC_MIPS_CALL_HI16);
6328                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", PIC_CALL_REG,
6329                                PIC_CALL_REG, mips_gp_register);
6330                   macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6331                                PIC_CALL_REG, BFD_RELOC_MIPS_CALL_LO16,
6332                                PIC_CALL_REG);
6333                   load_delay_nop ();
6334                   relax_switch ();
6335                   if (gpdelay)
6336                     macro_build (NULL, "nop", "");
6337                 }
6338               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
6339                            PIC_CALL_REG, BFD_RELOC_MIPS_GOT16,
6340                            mips_gp_register);
6341               load_delay_nop ();
6342               macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j",
6343                            PIC_CALL_REG, PIC_CALL_REG, BFD_RELOC_LO16);
6344               relax_end ();
6345               macro_build_jalr (&offset_expr);
6346
6347               if (mips_cprestore_offset < 0)
6348                 as_warn (_("No .cprestore pseudo-op used in PIC code"));
6349               else
6350                 {
6351                   if (! mips_frame_reg_valid)
6352                     {
6353                       as_warn (_("No .frame pseudo-op used in PIC code"));
6354                       /* Quiet this warning.  */
6355                       mips_frame_reg_valid = 1;
6356                     }
6357                   if (! mips_cprestore_valid)
6358                     {
6359                       as_warn (_("No .cprestore pseudo-op used in PIC code"));
6360                       /* Quiet this warning.  */
6361                       mips_cprestore_valid = 1;
6362                     }
6363                   if (mips_opts.noreorder)
6364                     macro_build (NULL, "nop", "");
6365                   expr1.X_add_number = mips_cprestore_offset;
6366                   macro_build_ldst_constoffset (&expr1, ADDRESS_LOAD_INSN,
6367                                                 mips_gp_register,
6368                                                 mips_frame_reg,
6369                                                 HAVE_64BIT_ADDRESSES);
6370                 }
6371             }
6372         }
6373       else if (mips_pic == VXWORKS_PIC)
6374         as_bad (_("Non-PIC jump used in PIC library"));
6375       else
6376         abort ();
6377
6378       break;
6379
6380     case M_LB_AB:
6381       s = "lb";
6382       goto ld;
6383     case M_LBU_AB:
6384       s = "lbu";
6385       goto ld;
6386     case M_LH_AB:
6387       s = "lh";
6388       goto ld;
6389     case M_LHU_AB:
6390       s = "lhu";
6391       goto ld;
6392     case M_LW_AB:
6393       s = "lw";
6394       goto ld;
6395     case M_LWC0_AB:
6396       s = "lwc0";
6397       /* Itbl support may require additional care here.  */
6398       coproc = 1;
6399       goto ld;
6400     case M_LWC1_AB:
6401       s = "lwc1";
6402       /* Itbl support may require additional care here.  */
6403       coproc = 1;
6404       goto ld;
6405     case M_LWC2_AB:
6406       s = "lwc2";
6407       /* Itbl support may require additional care here.  */
6408       coproc = 1;
6409       goto ld;
6410     case M_LWC3_AB:
6411       s = "lwc3";
6412       /* Itbl support may require additional care here.  */
6413       coproc = 1;
6414       goto ld;
6415     case M_LWL_AB:
6416       s = "lwl";
6417       lr = 1;
6418       goto ld;
6419     case M_LWR_AB:
6420       s = "lwr";
6421       lr = 1;
6422       goto ld;
6423     case M_LDC1_AB:
6424       s = "ldc1";
6425       /* Itbl support may require additional care here.  */
6426       coproc = 1;
6427       goto ld;
6428     case M_LDC2_AB:
6429       s = "ldc2";
6430       /* Itbl support may require additional care here.  */
6431       coproc = 1;
6432       goto ld;
6433     case M_LDC3_AB:
6434       s = "ldc3";
6435       /* Itbl support may require additional care here.  */
6436       coproc = 1;
6437       goto ld;
6438     case M_LDL_AB:
6439       s = "ldl";
6440       lr = 1;
6441       goto ld;
6442     case M_LDR_AB:
6443       s = "ldr";
6444       lr = 1;
6445       goto ld;
6446     case M_LL_AB:
6447       s = "ll";
6448       goto ld;
6449     case M_LLD_AB:
6450       s = "lld";
6451       goto ld;
6452     case M_LWU_AB:
6453       s = "lwu";
6454     ld:
6455       if (breg == treg || coproc || lr)
6456         {
6457           tempreg = AT;
6458           used_at = 1;
6459         }
6460       else
6461         {
6462           tempreg = treg;
6463         }
6464       goto ld_st;
6465     case M_SB_AB:
6466       s = "sb";
6467       goto st;
6468     case M_SH_AB:
6469       s = "sh";
6470       goto st;
6471     case M_SW_AB:
6472       s = "sw";
6473       goto st;
6474     case M_SWC0_AB:
6475       s = "swc0";
6476       /* Itbl support may require additional care here.  */
6477       coproc = 1;
6478       goto st;
6479     case M_SWC1_AB:
6480       s = "swc1";
6481       /* Itbl support may require additional care here.  */
6482       coproc = 1;
6483       goto st;
6484     case M_SWC2_AB:
6485       s = "swc2";
6486       /* Itbl support may require additional care here.  */
6487       coproc = 1;
6488       goto st;
6489     case M_SWC3_AB:
6490       s = "swc3";
6491       /* Itbl support may require additional care here.  */
6492       coproc = 1;
6493       goto st;
6494     case M_SWL_AB:
6495       s = "swl";
6496       goto st;
6497     case M_SWR_AB:
6498       s = "swr";
6499       goto st;
6500     case M_SC_AB:
6501       s = "sc";
6502       goto st;
6503     case M_SCD_AB:
6504       s = "scd";
6505       goto st;
6506     case M_CACHE_AB:
6507       s = "cache";
6508       goto st;
6509     case M_SDC1_AB:
6510       s = "sdc1";
6511       coproc = 1;
6512       /* Itbl support may require additional care here.  */
6513       goto st;
6514     case M_SDC2_AB:
6515       s = "sdc2";
6516       /* Itbl support may require additional care here.  */
6517       coproc = 1;
6518       goto st;
6519     case M_SDC3_AB:
6520       s = "sdc3";
6521       /* Itbl support may require additional care here.  */
6522       coproc = 1;
6523       goto st;
6524     case M_SDL_AB:
6525       s = "sdl";
6526       goto st;
6527     case M_SDR_AB:
6528       s = "sdr";
6529     st:
6530       tempreg = AT;
6531       used_at = 1;
6532     ld_st:
6533       if (coproc
6534           && NO_ISA_COP (mips_opts.arch)
6535           && (ip->insn_mo->pinfo2 & (INSN2_M_FP_S | INSN2_M_FP_D)) == 0)
6536         {
6537           as_bad (_("opcode not supported on this processor: %s"),
6538                   mips_cpu_info_from_arch (mips_opts.arch)->name);
6539           break;
6540         }
6541
6542       /* Itbl support may require additional care here.  */
6543       if (mask == M_LWC1_AB
6544           || mask == M_SWC1_AB
6545           || mask == M_LDC1_AB
6546           || mask == M_SDC1_AB
6547           || mask == M_L_DAB
6548           || mask == M_S_DAB)
6549         fmt = "T,o(b)";
6550       else if (mask == M_CACHE_AB)
6551         fmt = "k,o(b)";
6552       else if (coproc)
6553         fmt = "E,o(b)";
6554       else
6555         fmt = "t,o(b)";
6556
6557       if (offset_expr.X_op != O_constant
6558           && offset_expr.X_op != O_symbol)
6559         {
6560           as_bad (_("expression too complex"));
6561           offset_expr.X_op = O_constant;
6562         }
6563
6564       if (HAVE_32BIT_ADDRESSES
6565           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
6566         {
6567           char value [32];
6568
6569           sprintf_vma (value, offset_expr.X_add_number);
6570           as_bad (_("Number (0x%s) larger than 32 bits"), value);
6571         }
6572
6573       /* A constant expression in PIC code can be handled just as it
6574          is in non PIC code.  */
6575       if (offset_expr.X_op == O_constant)
6576         {
6577           expr1.X_add_number = ((offset_expr.X_add_number + 0x8000)
6578                                 & ~(bfd_vma) 0xffff);
6579           normalize_address_expr (&expr1);
6580           load_register (tempreg, &expr1, HAVE_64BIT_ADDRESSES);
6581           if (breg != 0)
6582             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6583                          tempreg, tempreg, breg);
6584           macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6585         }
6586       else if (mips_pic == NO_PIC)
6587         {
6588           /* If this is a reference to a GP relative symbol, and there
6589              is no base register, we want
6590                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
6591              Otherwise, if there is no base register, we want
6592                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6593                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6594              If we have a constant, we need two instructions anyhow,
6595              so we always use the latter form.
6596
6597              If we have a base register, and this is a reference to a
6598              GP relative symbol, we want
6599                addu     $tempreg,$breg,$gp
6600                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_GPREL16)
6601              Otherwise we want
6602                lui      $tempreg,<sym>          (BFD_RELOC_HI16_S)
6603                addu     $tempreg,$tempreg,$breg
6604                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6605              With a constant we always use the latter case.
6606
6607              With 64bit address space and no base register and $at usable,
6608              we want
6609                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6610                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6611                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6612                dsll32   $tempreg,0
6613                daddu    $tempreg,$at
6614                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6615              If we have a base register, we want
6616                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6617                lui      $at,<sym>               (BFD_RELOC_HI16_S)
6618                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6619                daddu    $at,$breg
6620                dsll32   $tempreg,0
6621                daddu    $tempreg,$at
6622                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6623
6624              Without $at we can't generate the optimal path for superscalar
6625              processors here since this would require two temporary registers.
6626                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6627                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6628                dsll     $tempreg,16
6629                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6630                dsll     $tempreg,16
6631                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6632              If we have a base register, we want
6633                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHEST)
6634                daddiu   $tempreg,<sym>          (BFD_RELOC_MIPS_HIGHER)
6635                dsll     $tempreg,16
6636                daddiu   $tempreg,<sym>          (BFD_RELOC_HI16_S)
6637                dsll     $tempreg,16
6638                daddu    $tempreg,$tempreg,$breg
6639                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_LO16)
6640
6641              For GP relative symbols in 64bit address space we can use
6642              the same sequence as in 32bit address space.  */
6643           if (HAVE_64BIT_SYMBOLS)
6644             {
6645               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6646                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6647                 {
6648                   relax_start (offset_expr.X_add_symbol);
6649                   if (breg == 0)
6650                     {
6651                       macro_build (&offset_expr, s, fmt, treg,
6652                                    BFD_RELOC_GPREL16, mips_gp_register);
6653                     }
6654                   else
6655                     {
6656                       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6657                                    tempreg, breg, mips_gp_register);
6658                       macro_build (&offset_expr, s, fmt, treg,
6659                                    BFD_RELOC_GPREL16, tempreg);
6660                     }
6661                   relax_switch ();
6662                 }
6663
6664               if (used_at == 0 && mips_opts.at)
6665                 {
6666                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6667                                BFD_RELOC_MIPS_HIGHEST);
6668                   macro_build (&offset_expr, "lui", "t,u", AT,
6669                                BFD_RELOC_HI16_S);
6670                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6671                                tempreg, BFD_RELOC_MIPS_HIGHER);
6672                   if (breg != 0)
6673                     macro_build (NULL, "daddu", "d,v,t", AT, AT, breg);
6674                   macro_build (NULL, "dsll32", "d,w,<", tempreg, tempreg, 0);
6675                   macro_build (NULL, "daddu", "d,v,t", tempreg, tempreg, AT);
6676                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_LO16,
6677                                tempreg);
6678                   used_at = 1;
6679                 }
6680               else
6681                 {
6682                   macro_build (&offset_expr, "lui", "t,u", tempreg,
6683                                BFD_RELOC_MIPS_HIGHEST);
6684                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6685                                tempreg, BFD_RELOC_MIPS_HIGHER);
6686                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6687                   macro_build (&offset_expr, "daddiu", "t,r,j", tempreg,
6688                                tempreg, BFD_RELOC_HI16_S);
6689                   macro_build (NULL, "dsll", "d,w,<", tempreg, tempreg, 16);
6690                   if (breg != 0)
6691                     macro_build (NULL, "daddu", "d,v,t",
6692                                  tempreg, tempreg, breg);
6693                   macro_build (&offset_expr, s, fmt, treg,
6694                                BFD_RELOC_LO16, tempreg);
6695                 }
6696
6697               if (mips_relax.sequence)
6698                 relax_end ();
6699               break;
6700             }
6701
6702           if (breg == 0)
6703             {
6704               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6705                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6706                 {
6707                   relax_start (offset_expr.X_add_symbol);
6708                   macro_build (&offset_expr, s, fmt, treg, BFD_RELOC_GPREL16,
6709                                mips_gp_register);
6710                   relax_switch ();
6711                 }
6712               macro_build_lui (&offset_expr, tempreg);
6713               macro_build (&offset_expr, s, fmt, treg,
6714                            BFD_RELOC_LO16, tempreg);
6715               if (mips_relax.sequence)
6716                 relax_end ();
6717             }
6718           else
6719             {
6720               if ((valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
6721                   && !nopic_need_relax (offset_expr.X_add_symbol, 1))
6722                 {
6723                   relax_start (offset_expr.X_add_symbol);
6724                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6725                                tempreg, breg, mips_gp_register);
6726                   macro_build (&offset_expr, s, fmt, treg,
6727                                BFD_RELOC_GPREL16, tempreg);
6728                   relax_switch ();
6729                 }
6730               macro_build_lui (&offset_expr, tempreg);
6731               macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6732                            tempreg, tempreg, breg);
6733               macro_build (&offset_expr, s, fmt, treg,
6734                            BFD_RELOC_LO16, tempreg);
6735               if (mips_relax.sequence)
6736                 relax_end ();
6737             }
6738         }
6739       else if (!mips_big_got)
6740         {
6741           int lw_reloc_type = (int) BFD_RELOC_MIPS_GOT16;
6742
6743           /* If this is a reference to an external symbol, we want
6744                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6745                nop
6746                <op>     $treg,0($tempreg)
6747              Otherwise we want
6748                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6749                nop
6750                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6751                <op>     $treg,0($tempreg)
6752
6753              For NewABI, we want
6754                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6755                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)
6756
6757              If there is a base register, we add it to $tempreg before
6758              the <op>.  If there is a constant, we stick it in the
6759              <op> instruction.  We don't handle constants larger than
6760              16 bits, because we have no way to load the upper 16 bits
6761              (actually, we could handle them for the subset of cases
6762              in which we are not using $at).  */
6763           gas_assert (offset_expr.X_op == O_symbol);
6764           if (HAVE_NEWABI)
6765             {
6766               macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6767                            BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6768               if (breg != 0)
6769                 macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6770                              tempreg, tempreg, breg);
6771               macro_build (&offset_expr, s, fmt, treg,
6772                            BFD_RELOC_MIPS_GOT_OFST, tempreg);
6773               break;
6774             }
6775           expr1.X_add_number = offset_expr.X_add_number;
6776           offset_expr.X_add_number = 0;
6777           if (expr1.X_add_number < -0x8000
6778               || expr1.X_add_number >= 0x8000)
6779             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6780           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6781                        lw_reloc_type, mips_gp_register);
6782           load_delay_nop ();
6783           relax_start (offset_expr.X_add_symbol);
6784           relax_switch ();
6785           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6786                        tempreg, BFD_RELOC_LO16);
6787           relax_end ();
6788           if (breg != 0)
6789             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6790                          tempreg, tempreg, breg);
6791           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6792         }
6793       else if (mips_big_got && !HAVE_NEWABI)
6794         {
6795           int gpdelay;
6796
6797           /* If this is a reference to an external symbol, we want
6798                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6799                addu     $tempreg,$tempreg,$gp
6800                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6801                <op>     $treg,0($tempreg)
6802              Otherwise we want
6803                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT16)
6804                nop
6805                addiu    $tempreg,$tempreg,<sym> (BFD_RELOC_LO16)
6806                <op>     $treg,0($tempreg)
6807              If there is a base register, we add it to $tempreg before
6808              the <op>.  If there is a constant, we stick it in the
6809              <op> instruction.  We don't handle constants larger than
6810              16 bits, because we have no way to load the upper 16 bits
6811              (actually, we could handle them for the subset of cases
6812              in which we are not using $at).  */
6813           gas_assert (offset_expr.X_op == O_symbol);
6814           expr1.X_add_number = offset_expr.X_add_number;
6815           offset_expr.X_add_number = 0;
6816           if (expr1.X_add_number < -0x8000
6817               || expr1.X_add_number >= 0x8000)
6818             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6819           gpdelay = reg_needs_delay (mips_gp_register);
6820           relax_start (offset_expr.X_add_symbol);
6821           macro_build (&offset_expr, "lui", "t,u", tempreg,
6822                        BFD_RELOC_MIPS_GOT_HI16);
6823           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6824                        mips_gp_register);
6825           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6826                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6827           relax_switch ();
6828           if (gpdelay)
6829             macro_build (NULL, "nop", "");
6830           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6831                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6832           load_delay_nop ();
6833           macro_build (&offset_expr, ADDRESS_ADDI_INSN, "t,r,j", tempreg,
6834                        tempreg, BFD_RELOC_LO16);
6835           relax_end ();
6836
6837           if (breg != 0)
6838             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6839                          tempreg, tempreg, breg);
6840           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6841         }
6842       else if (mips_big_got && HAVE_NEWABI)
6843         {
6844           /* If this is a reference to an external symbol, we want
6845                lui      $tempreg,<sym>          (BFD_RELOC_MIPS_GOT_HI16)
6846                add      $tempreg,$tempreg,$gp
6847                lw       $tempreg,<sym>($tempreg) (BFD_RELOC_MIPS_GOT_LO16)
6848                <op>     $treg,<ofst>($tempreg)
6849              Otherwise, for local symbols, we want:
6850                lw       $tempreg,<sym>($gp)     (BFD_RELOC_MIPS_GOT_PAGE)
6851                <op>     $treg,<sym>($tempreg)   (BFD_RELOC_MIPS_GOT_OFST)  */
6852           gas_assert (offset_expr.X_op == O_symbol);
6853           expr1.X_add_number = offset_expr.X_add_number;
6854           offset_expr.X_add_number = 0;
6855           if (expr1.X_add_number < -0x8000
6856               || expr1.X_add_number >= 0x8000)
6857             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
6858           relax_start (offset_expr.X_add_symbol);
6859           macro_build (&offset_expr, "lui", "t,u", tempreg,
6860                        BFD_RELOC_MIPS_GOT_HI16);
6861           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", tempreg, tempreg,
6862                        mips_gp_register);
6863           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6864                        BFD_RELOC_MIPS_GOT_LO16, tempreg);
6865           if (breg != 0)
6866             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6867                          tempreg, tempreg, breg);
6868           macro_build (&expr1, s, fmt, treg, BFD_RELOC_LO16, tempreg);
6869
6870           relax_switch ();
6871           offset_expr.X_add_number = expr1.X_add_number;
6872           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", tempreg,
6873                        BFD_RELOC_MIPS_GOT_PAGE, mips_gp_register);
6874           if (breg != 0)
6875             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
6876                          tempreg, tempreg, breg);
6877           macro_build (&offset_expr, s, fmt, treg,
6878                        BFD_RELOC_MIPS_GOT_OFST, tempreg);
6879           relax_end ();
6880         }
6881       else
6882         abort ();
6883
6884       break;
6885
6886     case M_LI:
6887     case M_LI_S:
6888       load_register (treg, &imm_expr, 0);
6889       break;
6890
6891     case M_DLI:
6892       load_register (treg, &imm_expr, 1);
6893       break;
6894
6895     case M_LI_SS:
6896       if (imm_expr.X_op == O_constant)
6897         {
6898           used_at = 1;
6899           load_register (AT, &imm_expr, 0);
6900           macro_build (NULL, "mtc1", "t,G", AT, treg);
6901           break;
6902         }
6903       else
6904         {
6905           gas_assert (offset_expr.X_op == O_symbol
6906                   && strcmp (segment_name (S_GET_SEGMENT
6907                                            (offset_expr.X_add_symbol)),
6908                              ".lit4") == 0
6909                   && offset_expr.X_add_number == 0);
6910           macro_build (&offset_expr, "lwc1", "T,o(b)", treg,
6911                        BFD_RELOC_MIPS_LITERAL, mips_gp_register);
6912           break;
6913         }
6914
6915     case M_LI_D:
6916       /* Check if we have a constant in IMM_EXPR.  If the GPRs are 64 bits
6917          wide, IMM_EXPR is the entire value.  Otherwise IMM_EXPR is the high
6918          order 32 bits of the value and the low order 32 bits are either
6919          zero or in OFFSET_EXPR.  */
6920       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6921         {
6922           if (HAVE_64BIT_GPRS)
6923             load_register (treg, &imm_expr, 1);
6924           else
6925             {
6926               int hreg, lreg;
6927
6928               if (target_big_endian)
6929                 {
6930                   hreg = treg;
6931                   lreg = treg + 1;
6932                 }
6933               else
6934                 {
6935                   hreg = treg + 1;
6936                   lreg = treg;
6937                 }
6938
6939               if (hreg <= 31)
6940                 load_register (hreg, &imm_expr, 0);
6941               if (lreg <= 31)
6942                 {
6943                   if (offset_expr.X_op == O_absent)
6944                     move_register (lreg, 0);
6945                   else
6946                     {
6947                       gas_assert (offset_expr.X_op == O_constant);
6948                       load_register (lreg, &offset_expr, 0);
6949                     }
6950                 }
6951             }
6952           break;
6953         }
6954
6955       /* We know that sym is in the .rdata section.  First we get the
6956          upper 16 bits of the address.  */
6957       if (mips_pic == NO_PIC)
6958         {
6959           macro_build_lui (&offset_expr, AT);
6960           used_at = 1;
6961         }
6962       else
6963         {
6964           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
6965                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
6966           used_at = 1;
6967         }
6968
6969       /* Now we load the register(s).  */
6970       if (HAVE_64BIT_GPRS)
6971         {
6972           used_at = 1;
6973           macro_build (&offset_expr, "ld", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6974         }
6975       else
6976         {
6977           used_at = 1;
6978           macro_build (&offset_expr, "lw", "t,o(b)", treg, BFD_RELOC_LO16, AT);
6979           if (treg != RA)
6980             {
6981               /* FIXME: How in the world do we deal with the possible
6982                  overflow here?  */
6983               offset_expr.X_add_number += 4;
6984               macro_build (&offset_expr, "lw", "t,o(b)",
6985                            treg + 1, BFD_RELOC_LO16, AT);
6986             }
6987         }
6988       break;
6989
6990     case M_LI_DD:
6991       /* Check if we have a constant in IMM_EXPR.  If the FPRs are 64 bits
6992          wide, IMM_EXPR is the entire value and the GPRs are known to be 64
6993          bits wide as well.  Otherwise IMM_EXPR is the high order 32 bits of
6994          the value and the low order 32 bits are either zero or in
6995          OFFSET_EXPR.  */
6996       if (imm_expr.X_op == O_constant || imm_expr.X_op == O_big)
6997         {
6998           used_at = 1;
6999           load_register (AT, &imm_expr, HAVE_64BIT_FPRS);
7000           if (HAVE_64BIT_FPRS)
7001             {
7002               gas_assert (HAVE_64BIT_GPRS);
7003               macro_build (NULL, "dmtc1", "t,S", AT, treg);
7004             }
7005           else
7006             {
7007               macro_build (NULL, "mtc1", "t,G", AT, treg + 1);
7008               if (offset_expr.X_op == O_absent)
7009                 macro_build (NULL, "mtc1", "t,G", 0, treg);
7010               else
7011                 {
7012                   gas_assert (offset_expr.X_op == O_constant);
7013                   load_register (AT, &offset_expr, 0);
7014                   macro_build (NULL, "mtc1", "t,G", AT, treg);
7015                 }
7016             }
7017           break;
7018         }
7019
7020       gas_assert (offset_expr.X_op == O_symbol
7021               && offset_expr.X_add_number == 0);
7022       s = segment_name (S_GET_SEGMENT (offset_expr.X_add_symbol));
7023       if (strcmp (s, ".lit8") == 0)
7024         {
7025           if (mips_opts.isa != ISA_MIPS1)
7026             {
7027               macro_build (&offset_expr, "ldc1", "T,o(b)", treg,
7028                            BFD_RELOC_MIPS_LITERAL, mips_gp_register);
7029               break;
7030             }
7031           breg = mips_gp_register;
7032           r = BFD_RELOC_MIPS_LITERAL;
7033           goto dob;
7034         }
7035       else
7036         {
7037           gas_assert (strcmp (s, RDATA_SECTION_NAME) == 0);
7038           used_at = 1;
7039           if (mips_pic != NO_PIC)
7040             macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7041                          BFD_RELOC_MIPS_GOT16, mips_gp_register);
7042           else
7043             {
7044               /* FIXME: This won't work for a 64 bit address.  */
7045               macro_build_lui (&offset_expr, AT);
7046             }
7047
7048           if (mips_opts.isa != ISA_MIPS1)
7049             {
7050               macro_build (&offset_expr, "ldc1", "T,o(b)",
7051                            treg, BFD_RELOC_LO16, AT);
7052               break;
7053             }
7054           breg = AT;
7055           r = BFD_RELOC_LO16;
7056           goto dob;
7057         }
7058
7059     case M_L_DOB:
7060       /* Even on a big endian machine $fn comes before $fn+1.  We have
7061          to adjust when loading from memory.  */
7062       r = BFD_RELOC_LO16;
7063     dob:
7064       gas_assert (mips_opts.isa == ISA_MIPS1);
7065       macro_build (&offset_expr, "lwc1", "T,o(b)",
7066                    target_big_endian ? treg + 1 : treg, r, breg);
7067       /* FIXME: A possible overflow which I don't know how to deal
7068          with.  */
7069       offset_expr.X_add_number += 4;
7070       macro_build (&offset_expr, "lwc1", "T,o(b)",
7071                    target_big_endian ? treg : treg + 1, r, breg);
7072       break;
7073
7074     case M_L_DAB:
7075       /*
7076        * The MIPS assembler seems to check for X_add_number not
7077        * being double aligned and generating:
7078        *        lui     at,%hi(foo+1)
7079        *        addu    at,at,v1
7080        *        addiu   at,at,%lo(foo+1)
7081        *        lwc1    f2,0(at)
7082        *        lwc1    f3,4(at)
7083        * But, the resulting address is the same after relocation so why
7084        * generate the extra instruction?
7085        */
7086       /* Itbl support may require additional care here.  */
7087       coproc = 1;
7088       if (mips_opts.isa != ISA_MIPS1)
7089         {
7090           s = "ldc1";
7091           goto ld;
7092         }
7093
7094       s = "lwc1";
7095       fmt = "T,o(b)";
7096       goto ldd_std;
7097
7098     case M_S_DAB:
7099       if (mips_opts.isa != ISA_MIPS1)
7100         {
7101           s = "sdc1";
7102           goto st;
7103         }
7104
7105       s = "swc1";
7106       fmt = "T,o(b)";
7107       /* Itbl support may require additional care here.  */
7108       coproc = 1;
7109       goto ldd_std;
7110
7111     case M_LD_AB:
7112       if (HAVE_64BIT_GPRS)
7113         {
7114           s = "ld";
7115           goto ld;
7116         }
7117
7118       s = "lw";
7119       fmt = "t,o(b)";
7120       goto ldd_std;
7121
7122     case M_SD_AB:
7123       if (HAVE_64BIT_GPRS)
7124         {
7125           s = "sd";
7126           goto st;
7127         }
7128
7129       s = "sw";
7130       fmt = "t,o(b)";
7131
7132     ldd_std:
7133       if (offset_expr.X_op != O_symbol
7134           && offset_expr.X_op != O_constant)
7135         {
7136           as_bad (_("expression too complex"));
7137           offset_expr.X_op = O_constant;
7138         }
7139
7140       if (HAVE_32BIT_ADDRESSES
7141           && !IS_SEXT_32BIT_NUM (offset_expr.X_add_number))
7142         {
7143           char value [32];
7144
7145           sprintf_vma (value, offset_expr.X_add_number);
7146           as_bad (_("Number (0x%s) larger than 32 bits"), value);
7147         }
7148
7149       /* Even on a big endian machine $fn comes before $fn+1.  We have
7150          to adjust when loading from memory.  We set coproc if we must
7151          load $fn+1 first.  */
7152       /* Itbl support may require additional care here.  */
7153       if (! target_big_endian)
7154         coproc = 0;
7155
7156       if (mips_pic == NO_PIC
7157           || offset_expr.X_op == O_constant)
7158         {
7159           /* If this is a reference to a GP relative symbol, we want
7160                <op>     $treg,<sym>($gp)        (BFD_RELOC_GPREL16)
7161                <op>     $treg+1,<sym>+4($gp)    (BFD_RELOC_GPREL16)
7162              If we have a base register, we use this
7163                addu     $at,$breg,$gp
7164                <op>     $treg,<sym>($at)        (BFD_RELOC_GPREL16)
7165                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_GPREL16)
7166              If this is not a GP relative symbol, we want
7167                lui      $at,<sym>               (BFD_RELOC_HI16_S)
7168                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7169                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7170              If there is a base register, we add it to $at after the
7171              lui instruction.  If there is a constant, we always use
7172              the last case.  */
7173           if (offset_expr.X_op == O_symbol
7174               && (valueT) offset_expr.X_add_number <= MAX_GPREL_OFFSET
7175               && !nopic_need_relax (offset_expr.X_add_symbol, 1))
7176             {
7177               relax_start (offset_expr.X_add_symbol);
7178               if (breg == 0)
7179                 {
7180                   tempreg = mips_gp_register;
7181                 }
7182               else
7183                 {
7184                   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7185                                AT, breg, mips_gp_register);
7186                   tempreg = AT;
7187                   used_at = 1;
7188                 }
7189
7190               /* Itbl support may require additional care here.  */
7191               macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7192                            BFD_RELOC_GPREL16, tempreg);
7193               offset_expr.X_add_number += 4;
7194
7195               /* Set mips_optimize to 2 to avoid inserting an
7196                  undesired nop.  */
7197               hold_mips_optimize = mips_optimize;
7198               mips_optimize = 2;
7199               /* Itbl support may require additional care here.  */
7200               macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7201                            BFD_RELOC_GPREL16, tempreg);
7202               mips_optimize = hold_mips_optimize;
7203
7204               relax_switch ();
7205
7206               /* We just generated two relocs.  When tc_gen_reloc
7207                  handles this case, it will skip the first reloc and
7208                  handle the second.  The second reloc already has an
7209                  extra addend of 4, which we added above.  We must
7210                  subtract it out, and then subtract another 4 to make
7211                  the first reloc come out right.  The second reloc
7212                  will come out right because we are going to add 4 to
7213                  offset_expr when we build its instruction below.
7214
7215                  If we have a symbol, then we don't want to include
7216                  the offset, because it will wind up being included
7217                  when we generate the reloc.  */
7218
7219               if (offset_expr.X_op == O_constant)
7220                 offset_expr.X_add_number -= 8;
7221               else
7222                 {
7223                   offset_expr.X_add_number = -4;
7224                   offset_expr.X_op = O_constant;
7225                 }
7226             }
7227           used_at = 1;
7228           macro_build_lui (&offset_expr, AT);
7229           if (breg != 0)
7230             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7231           /* Itbl support may require additional care here.  */
7232           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7233                        BFD_RELOC_LO16, AT);
7234           /* FIXME: How do we handle overflow here?  */
7235           offset_expr.X_add_number += 4;
7236           /* Itbl support may require additional care here.  */
7237           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7238                        BFD_RELOC_LO16, AT);
7239           if (mips_relax.sequence)
7240             relax_end ();
7241         }
7242       else if (!mips_big_got)
7243         {
7244           /* If this is a reference to an external symbol, we want
7245                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7246                nop
7247                <op>     $treg,0($at)
7248                <op>     $treg+1,4($at)
7249              Otherwise we want
7250                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7251                nop
7252                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7253                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7254              If there is a base register we add it to $at before the
7255              lwc1 instructions.  If there is a constant we include it
7256              in the lwc1 instructions.  */
7257           used_at = 1;
7258           expr1.X_add_number = offset_expr.X_add_number;
7259           if (expr1.X_add_number < -0x8000
7260               || expr1.X_add_number >= 0x8000 - 4)
7261             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7262           load_got_offset (AT, &offset_expr);
7263           load_delay_nop ();
7264           if (breg != 0)
7265             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7266
7267           /* Set mips_optimize to 2 to avoid inserting an undesired
7268              nop.  */
7269           hold_mips_optimize = mips_optimize;
7270           mips_optimize = 2;
7271
7272           /* Itbl support may require additional care here.  */
7273           relax_start (offset_expr.X_add_symbol);
7274           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7275                        BFD_RELOC_LO16, AT);
7276           expr1.X_add_number += 4;
7277           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7278                        BFD_RELOC_LO16, AT);
7279           relax_switch ();
7280           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7281                        BFD_RELOC_LO16, AT);
7282           offset_expr.X_add_number += 4;
7283           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7284                        BFD_RELOC_LO16, AT);
7285           relax_end ();
7286
7287           mips_optimize = hold_mips_optimize;
7288         }
7289       else if (mips_big_got)
7290         {
7291           int gpdelay;
7292
7293           /* If this is a reference to an external symbol, we want
7294                lui      $at,<sym>               (BFD_RELOC_MIPS_GOT_HI16)
7295                addu     $at,$at,$gp
7296                lw       $at,<sym>($at)          (BFD_RELOC_MIPS_GOT_LO16)
7297                nop
7298                <op>     $treg,0($at)
7299                <op>     $treg+1,4($at)
7300              Otherwise we want
7301                lw       $at,<sym>($gp)          (BFD_RELOC_MIPS_GOT16)
7302                nop
7303                <op>     $treg,<sym>($at)        (BFD_RELOC_LO16)
7304                <op>     $treg+1,<sym>+4($at)    (BFD_RELOC_LO16)
7305              If there is a base register we add it to $at before the
7306              lwc1 instructions.  If there is a constant we include it
7307              in the lwc1 instructions.  */
7308           used_at = 1;
7309           expr1.X_add_number = offset_expr.X_add_number;
7310           offset_expr.X_add_number = 0;
7311           if (expr1.X_add_number < -0x8000
7312               || expr1.X_add_number >= 0x8000 - 4)
7313             as_bad (_("PIC code offset overflow (max 16 signed bits)"));
7314           gpdelay = reg_needs_delay (mips_gp_register);
7315           relax_start (offset_expr.X_add_symbol);
7316           macro_build (&offset_expr, "lui", "t,u",
7317                        AT, BFD_RELOC_MIPS_GOT_HI16);
7318           macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t",
7319                        AT, AT, mips_gp_register);
7320           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)",
7321                        AT, BFD_RELOC_MIPS_GOT_LO16, AT);
7322           load_delay_nop ();
7323           if (breg != 0)
7324             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7325           /* Itbl support may require additional care here.  */
7326           macro_build (&expr1, s, fmt, coproc ? treg + 1 : treg,
7327                        BFD_RELOC_LO16, AT);
7328           expr1.X_add_number += 4;
7329
7330           /* Set mips_optimize to 2 to avoid inserting an undesired
7331              nop.  */
7332           hold_mips_optimize = mips_optimize;
7333           mips_optimize = 2;
7334           /* Itbl support may require additional care here.  */
7335           macro_build (&expr1, s, fmt, coproc ? treg : treg + 1,
7336                        BFD_RELOC_LO16, AT);
7337           mips_optimize = hold_mips_optimize;
7338           expr1.X_add_number -= 4;
7339
7340           relax_switch ();
7341           offset_expr.X_add_number = expr1.X_add_number;
7342           if (gpdelay)
7343             macro_build (NULL, "nop", "");
7344           macro_build (&offset_expr, ADDRESS_LOAD_INSN, "t,o(b)", AT,
7345                        BFD_RELOC_MIPS_GOT16, mips_gp_register);
7346           load_delay_nop ();
7347           if (breg != 0)
7348             macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, breg, AT);
7349           /* Itbl support may require additional care here.  */
7350           macro_build (&offset_expr, s, fmt, coproc ? treg + 1 : treg,
7351                        BFD_RELOC_LO16, AT);
7352           offset_expr.X_add_number += 4;
7353
7354           /* Set mips_optimize to 2 to avoid inserting an undesired
7355              nop.  */
7356           hold_mips_optimize = mips_optimize;
7357           mips_optimize = 2;
7358           /* Itbl support may require additional care here.  */
7359           macro_build (&offset_expr, s, fmt, coproc ? treg : treg + 1,
7360                        BFD_RELOC_LO16, AT);
7361           mips_optimize = hold_mips_optimize;
7362           relax_end ();
7363         }
7364       else
7365         abort ();
7366
7367       break;
7368
7369     case M_LD_OB:
7370       s = HAVE_64BIT_GPRS ? "ld" : "lw";
7371       goto sd_ob;
7372     case M_SD_OB:
7373       s = HAVE_64BIT_GPRS ? "sd" : "sw";
7374     sd_ob:
7375       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
7376       if (!HAVE_64BIT_GPRS)
7377         {
7378           offset_expr.X_add_number += 4;
7379           macro_build (&offset_expr, s, "t,o(b)", treg + 1,
7380                        BFD_RELOC_LO16, breg);
7381         }
7382       break;
7383
7384    /* New code added to support COPZ instructions.
7385       This code builds table entries out of the macros in mip_opcodes.
7386       R4000 uses interlocks to handle coproc delays.
7387       Other chips (like the R3000) require nops to be inserted for delays.
7388
7389       FIXME: Currently, we require that the user handle delays.
7390       In order to fill delay slots for non-interlocked chips,
7391       we must have a way to specify delays based on the coprocessor.
7392       Eg. 4 cycles if load coproc reg from memory, 1 if in cache, etc.
7393       What are the side-effects of the cop instruction?
7394       What cache support might we have and what are its effects?
7395       Both coprocessor & memory require delays. how long???
7396       What registers are read/set/modified?
7397
7398       If an itbl is provided to interpret cop instructions,
7399       this knowledge can be encoded in the itbl spec.  */
7400
7401     case M_COP0:
7402       s = "c0";
7403       goto copz;
7404     case M_COP1:
7405       s = "c1";
7406       goto copz;
7407     case M_COP2:
7408       s = "c2";
7409       goto copz;
7410     case M_COP3:
7411       s = "c3";
7412     copz:
7413       if (NO_ISA_COP (mips_opts.arch)
7414           && (ip->insn_mo->pinfo2 & INSN2_M_FP_S) == 0)
7415         {
7416           as_bad (_("opcode not supported on this processor: %s"),
7417                   mips_cpu_info_from_arch (mips_opts.arch)->name);
7418           break;
7419         }
7420
7421       /* For now we just do C (same as Cz).  The parameter will be
7422          stored in insn_opcode by mips_ip.  */
7423       macro_build (NULL, s, "C", ip->insn_opcode);
7424       break;
7425
7426     case M_MOVE:
7427       move_register (dreg, sreg);
7428       break;
7429
7430 #ifdef LOSING_COMPILER
7431     default:
7432       /* Try and see if this is a new itbl instruction.
7433          This code builds table entries out of the macros in mip_opcodes.
7434          FIXME: For now we just assemble the expression and pass it's
7435          value along as a 32-bit immediate.
7436          We may want to have the assembler assemble this value,
7437          so that we gain the assembler's knowledge of delay slots,
7438          symbols, etc.
7439          Would it be more efficient to use mask (id) here? */
7440       if (itbl_have_entries
7441           && (immed_expr = itbl_assemble (ip->insn_mo->name, "")))
7442         {
7443           s = ip->insn_mo->name;
7444           s2 = "cop3";
7445           coproc = ITBL_DECODE_PNUM (immed_expr);;
7446           macro_build (&immed_expr, s, "C");
7447           break;
7448         }
7449       macro2 (ip);
7450       break;
7451     }
7452   if (!mips_opts.at && used_at)
7453     as_bad (_("Macro used $at after \".set noat\""));
7454 }
7455
7456 static void
7457 macro2 (struct mips_cl_insn *ip)
7458 {
7459   unsigned int treg, sreg, dreg, breg;
7460   unsigned int tempreg;
7461   int mask;
7462   int used_at;
7463   expressionS expr1;
7464   const char *s;
7465   const char *s2;
7466   const char *fmt;
7467   int likely = 0;
7468   int dbl = 0;
7469   int coproc = 0;
7470   int lr = 0;
7471   int imm = 0;
7472   int off;
7473   offsetT maxnum;
7474   bfd_reloc_code_real_type r;
7475
7476   treg = (ip->insn_opcode >> 16) & 0x1f;
7477   dreg = (ip->insn_opcode >> 11) & 0x1f;
7478   sreg = breg = (ip->insn_opcode >> 21) & 0x1f;
7479   mask = ip->insn_mo->mask;
7480
7481   expr1.X_op = O_constant;
7482   expr1.X_op_symbol = NULL;
7483   expr1.X_add_symbol = NULL;
7484   expr1.X_add_number = 1;
7485
7486   switch (mask)
7487     {
7488 #endif /* LOSING_COMPILER */
7489
7490     case M_DMUL:
7491       dbl = 1;
7492     case M_MUL:
7493       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t", sreg, treg);
7494       macro_build (NULL, "mflo", "d", dreg);
7495       break;
7496
7497     case M_DMUL_I:
7498       dbl = 1;
7499     case M_MUL_I:
7500       /* The MIPS assembler some times generates shifts and adds.  I'm
7501          not trying to be that fancy. GCC should do this for us
7502          anyway.  */
7503       used_at = 1;
7504       load_register (AT, &imm_expr, dbl);
7505       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, AT);
7506       macro_build (NULL, "mflo", "d", dreg);
7507       break;
7508
7509     case M_DMULO_I:
7510       dbl = 1;
7511     case M_MULO_I:
7512       imm = 1;
7513       goto do_mulo;
7514
7515     case M_DMULO:
7516       dbl = 1;
7517     case M_MULO:
7518     do_mulo:
7519       start_noreorder ();
7520       used_at = 1;
7521       if (imm)
7522         load_register (AT, &imm_expr, dbl);
7523       macro_build (NULL, dbl ? "dmult" : "mult", "s,t", sreg, imm ? AT : treg);
7524       macro_build (NULL, "mflo", "d", dreg);
7525       macro_build (NULL, dbl ? "dsra32" : "sra", "d,w,<", dreg, dreg, RA);
7526       macro_build (NULL, "mfhi", "d", AT);
7527       if (mips_trap)
7528         macro_build (NULL, "tne", "s,t,q", dreg, AT, 6);
7529       else
7530         {
7531           expr1.X_add_number = 8;
7532           macro_build (&expr1, "beq", "s,t,p", dreg, AT);
7533           macro_build (NULL, "nop", "", 0);
7534           macro_build (NULL, "break", "c", 6);
7535         }
7536       end_noreorder ();
7537       macro_build (NULL, "mflo", "d", dreg);
7538       break;
7539
7540     case M_DMULOU_I:
7541       dbl = 1;
7542     case M_MULOU_I:
7543       imm = 1;
7544       goto do_mulou;
7545
7546     case M_DMULOU:
7547       dbl = 1;
7548     case M_MULOU:
7549     do_mulou:
7550       start_noreorder ();
7551       used_at = 1;
7552       if (imm)
7553         load_register (AT, &imm_expr, dbl);
7554       macro_build (NULL, dbl ? "dmultu" : "multu", "s,t",
7555                    sreg, imm ? AT : treg);
7556       macro_build (NULL, "mfhi", "d", AT);
7557       macro_build (NULL, "mflo", "d", dreg);
7558       if (mips_trap)
7559         macro_build (NULL, "tne", "s,t,q", AT, 0, 6);
7560       else
7561         {
7562           expr1.X_add_number = 8;
7563           macro_build (&expr1, "beq", "s,t,p", AT, 0);
7564           macro_build (NULL, "nop", "", 0);
7565           macro_build (NULL, "break", "c", 6);
7566         }
7567       end_noreorder ();
7568       break;
7569
7570     case M_DROL:
7571       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7572         {
7573           if (dreg == sreg)
7574             {
7575               tempreg = AT;
7576               used_at = 1;
7577             }
7578           else
7579             {
7580               tempreg = dreg;
7581             }
7582           macro_build (NULL, "dnegu", "d,w", tempreg, treg);
7583           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, tempreg);
7584           break;
7585         }
7586       used_at = 1;
7587       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7588       macro_build (NULL, "dsrlv", "d,t,s", AT, sreg, AT);
7589       macro_build (NULL, "dsllv", "d,t,s", dreg, sreg, treg);
7590       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7591       break;
7592
7593     case M_ROL:
7594       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7595         {
7596           if (dreg == sreg)
7597             {
7598               tempreg = AT;
7599               used_at = 1;
7600             }
7601           else
7602             {
7603               tempreg = dreg;
7604             }
7605           macro_build (NULL, "negu", "d,w", tempreg, treg);
7606           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, tempreg);
7607           break;
7608         }
7609       used_at = 1;
7610       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7611       macro_build (NULL, "srlv", "d,t,s", AT, sreg, AT);
7612       macro_build (NULL, "sllv", "d,t,s", dreg, sreg, treg);
7613       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7614       break;
7615
7616     case M_DROL_I:
7617       {
7618         unsigned int rot;
7619         char *l;
7620         char *rr;
7621
7622         if (imm_expr.X_op != O_constant)
7623           as_bad (_("Improper rotate count"));
7624         rot = imm_expr.X_add_number & 0x3f;
7625         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7626           {
7627             rot = (64 - rot) & 0x3f;
7628             if (rot >= 32)
7629               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7630             else
7631               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7632             break;
7633           }
7634         if (rot == 0)
7635           {
7636             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7637             break;
7638           }
7639         l = (rot < 0x20) ? "dsll" : "dsll32";
7640         rr = ((0x40 - rot) < 0x20) ? "dsrl" : "dsrl32";
7641         rot &= 0x1f;
7642         used_at = 1;
7643         macro_build (NULL, l, "d,w,<", AT, sreg, rot);
7644         macro_build (NULL, rr, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7645         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7646       }
7647       break;
7648
7649     case M_ROL_I:
7650       {
7651         unsigned int rot;
7652
7653         if (imm_expr.X_op != O_constant)
7654           as_bad (_("Improper rotate count"));
7655         rot = imm_expr.X_add_number & 0x1f;
7656         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7657           {
7658             macro_build (NULL, "ror", "d,w,<", dreg, sreg, (32 - rot) & 0x1f);
7659             break;
7660           }
7661         if (rot == 0)
7662           {
7663             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7664             break;
7665           }
7666         used_at = 1;
7667         macro_build (NULL, "sll", "d,w,<", AT, sreg, rot);
7668         macro_build (NULL, "srl", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7669         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7670       }
7671       break;
7672
7673     case M_DROR:
7674       if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7675         {
7676           macro_build (NULL, "drorv", "d,t,s", dreg, sreg, treg);
7677           break;
7678         }
7679       used_at = 1;
7680       macro_build (NULL, "dsubu", "d,v,t", AT, 0, treg);
7681       macro_build (NULL, "dsllv", "d,t,s", AT, sreg, AT);
7682       macro_build (NULL, "dsrlv", "d,t,s", dreg, sreg, treg);
7683       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7684       break;
7685
7686     case M_ROR:
7687       if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7688         {
7689           macro_build (NULL, "rorv", "d,t,s", dreg, sreg, treg);
7690           break;
7691         }
7692       used_at = 1;
7693       macro_build (NULL, "subu", "d,v,t", AT, 0, treg);
7694       macro_build (NULL, "sllv", "d,t,s", AT, sreg, AT);
7695       macro_build (NULL, "srlv", "d,t,s", dreg, sreg, treg);
7696       macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7697       break;
7698
7699     case M_DROR_I:
7700       {
7701         unsigned int rot;
7702         char *l;
7703         char *rr;
7704
7705         if (imm_expr.X_op != O_constant)
7706           as_bad (_("Improper rotate count"));
7707         rot = imm_expr.X_add_number & 0x3f;
7708         if (ISA_HAS_DROR (mips_opts.isa) || CPU_HAS_DROR (mips_opts.arch))
7709           {
7710             if (rot >= 32)
7711               macro_build (NULL, "dror32", "d,w,<", dreg, sreg, rot - 32);
7712             else
7713               macro_build (NULL, "dror", "d,w,<", dreg, sreg, rot);
7714             break;
7715           }
7716         if (rot == 0)
7717           {
7718             macro_build (NULL, "dsrl", "d,w,<", dreg, sreg, 0);
7719             break;
7720           }
7721         rr = (rot < 0x20) ? "dsrl" : "dsrl32";
7722         l = ((0x40 - rot) < 0x20) ? "dsll" : "dsll32";
7723         rot &= 0x1f;
7724         used_at = 1;
7725         macro_build (NULL, rr, "d,w,<", AT, sreg, rot);
7726         macro_build (NULL, l, "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7727         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7728       }
7729       break;
7730
7731     case M_ROR_I:
7732       {
7733         unsigned int rot;
7734
7735         if (imm_expr.X_op != O_constant)
7736           as_bad (_("Improper rotate count"));
7737         rot = imm_expr.X_add_number & 0x1f;
7738         if (ISA_HAS_ROR (mips_opts.isa) || CPU_HAS_ROR (mips_opts.arch))
7739           {
7740             macro_build (NULL, "ror", "d,w,<", dreg, sreg, rot);
7741             break;
7742           }
7743         if (rot == 0)
7744           {
7745             macro_build (NULL, "srl", "d,w,<", dreg, sreg, 0);
7746             break;
7747           }
7748         used_at = 1;
7749         macro_build (NULL, "srl", "d,w,<", AT, sreg, rot);
7750         macro_build (NULL, "sll", "d,w,<", dreg, sreg, (0x20 - rot) & 0x1f);
7751         macro_build (NULL, "or", "d,v,t", dreg, dreg, AT);
7752       }
7753       break;
7754
7755     case M_S_DOB:
7756       gas_assert (mips_opts.isa == ISA_MIPS1);
7757       /* Even on a big endian machine $fn comes before $fn+1.  We have
7758          to adjust when storing to memory.  */
7759       macro_build (&offset_expr, "swc1", "T,o(b)",
7760                    target_big_endian ? treg + 1 : treg, BFD_RELOC_LO16, breg);
7761       offset_expr.X_add_number += 4;
7762       macro_build (&offset_expr, "swc1", "T,o(b)",
7763                    target_big_endian ? treg : treg + 1, BFD_RELOC_LO16, breg);
7764       break;
7765
7766     case M_SEQ:
7767       if (sreg == 0)
7768         macro_build (&expr1, "sltiu", "t,r,j", dreg, treg, BFD_RELOC_LO16);
7769       else if (treg == 0)
7770         macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7771       else
7772         {
7773           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7774           macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7775         }
7776       break;
7777
7778     case M_SEQ_I:
7779       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7780         {
7781           macro_build (&expr1, "sltiu", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7782           break;
7783         }
7784       if (sreg == 0)
7785         {
7786           as_warn (_("Instruction %s: result is always false"),
7787                    ip->insn_mo->name);
7788           move_register (dreg, 0);
7789           break;
7790         }
7791       if (CPU_HAS_SEQ (mips_opts.arch)
7792           && -512 <= imm_expr.X_add_number
7793           && imm_expr.X_add_number < 512)
7794         {
7795           macro_build (NULL, "seqi", "t,r,+Q", dreg, sreg,
7796                        (int) imm_expr.X_add_number);
7797           break;
7798         }
7799       if (imm_expr.X_op == O_constant
7800           && imm_expr.X_add_number >= 0
7801           && imm_expr.X_add_number < 0x10000)
7802         {
7803           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7804         }
7805       else if (imm_expr.X_op == O_constant
7806                && imm_expr.X_add_number > -0x8000
7807                && imm_expr.X_add_number < 0)
7808         {
7809           imm_expr.X_add_number = -imm_expr.X_add_number;
7810           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7811                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7812         }
7813       else if (CPU_HAS_SEQ (mips_opts.arch))
7814         {
7815           used_at = 1;
7816           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7817           macro_build (NULL, "seq", "d,v,t", dreg, sreg, AT);
7818           break;
7819         }
7820       else
7821         {
7822           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7823           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7824           used_at = 1;
7825         }
7826       macro_build (&expr1, "sltiu", "t,r,j", dreg, dreg, BFD_RELOC_LO16);
7827       break;
7828
7829     case M_SGE:         /* sreg >= treg <==> not (sreg < treg) */
7830       s = "slt";
7831       goto sge;
7832     case M_SGEU:
7833       s = "sltu";
7834     sge:
7835       macro_build (NULL, s, "d,v,t", dreg, sreg, treg);
7836       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7837       break;
7838
7839     case M_SGE_I:               /* sreg >= I <==> not (sreg < I) */
7840     case M_SGEU_I:
7841       if (imm_expr.X_op == O_constant
7842           && imm_expr.X_add_number >= -0x8000
7843           && imm_expr.X_add_number < 0x8000)
7844         {
7845           macro_build (&imm_expr, mask == M_SGE_I ? "slti" : "sltiu", "t,r,j",
7846                        dreg, sreg, BFD_RELOC_LO16);
7847         }
7848       else
7849         {
7850           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7851           macro_build (NULL, mask == M_SGE_I ? "slt" : "sltu", "d,v,t",
7852                        dreg, sreg, AT);
7853           used_at = 1;
7854         }
7855       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7856       break;
7857
7858     case M_SGT:         /* sreg > treg  <==>  treg < sreg */
7859       s = "slt";
7860       goto sgt;
7861     case M_SGTU:
7862       s = "sltu";
7863     sgt:
7864       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7865       break;
7866
7867     case M_SGT_I:               /* sreg > I  <==>  I < sreg */
7868       s = "slt";
7869       goto sgti;
7870     case M_SGTU_I:
7871       s = "sltu";
7872     sgti:
7873       used_at = 1;
7874       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7875       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7876       break;
7877
7878     case M_SLE: /* sreg <= treg  <==>  treg >= sreg  <==>  not (treg < sreg) */
7879       s = "slt";
7880       goto sle;
7881     case M_SLEU:
7882       s = "sltu";
7883     sle:
7884       macro_build (NULL, s, "d,v,t", dreg, treg, sreg);
7885       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7886       break;
7887
7888     case M_SLE_I:       /* sreg <= I <==> I >= sreg <==> not (I < sreg) */
7889       s = "slt";
7890       goto slei;
7891     case M_SLEU_I:
7892       s = "sltu";
7893     slei:
7894       used_at = 1;
7895       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7896       macro_build (NULL, s, "d,v,t", dreg, AT, sreg);
7897       macro_build (&expr1, "xori", "t,r,i", dreg, dreg, BFD_RELOC_LO16);
7898       break;
7899
7900     case M_SLT_I:
7901       if (imm_expr.X_op == O_constant
7902           && imm_expr.X_add_number >= -0x8000
7903           && imm_expr.X_add_number < 0x8000)
7904         {
7905           macro_build (&imm_expr, "slti", "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7906           break;
7907         }
7908       used_at = 1;
7909       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7910       macro_build (NULL, "slt", "d,v,t", dreg, sreg, AT);
7911       break;
7912
7913     case M_SLTU_I:
7914       if (imm_expr.X_op == O_constant
7915           && imm_expr.X_add_number >= -0x8000
7916           && imm_expr.X_add_number < 0x8000)
7917         {
7918           macro_build (&imm_expr, "sltiu", "t,r,j", dreg, sreg,
7919                        BFD_RELOC_LO16);
7920           break;
7921         }
7922       used_at = 1;
7923       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7924       macro_build (NULL, "sltu", "d,v,t", dreg, sreg, AT);
7925       break;
7926
7927     case M_SNE:
7928       if (sreg == 0)
7929         macro_build (NULL, "sltu", "d,v,t", dreg, 0, treg);
7930       else if (treg == 0)
7931         macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7932       else
7933         {
7934           macro_build (NULL, "xor", "d,v,t", dreg, sreg, treg);
7935           macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7936         }
7937       break;
7938
7939     case M_SNE_I:
7940       if (imm_expr.X_op == O_constant && imm_expr.X_add_number == 0)
7941         {
7942           macro_build (NULL, "sltu", "d,v,t", dreg, 0, sreg);
7943           break;
7944         }
7945       if (sreg == 0)
7946         {
7947           as_warn (_("Instruction %s: result is always true"),
7948                    ip->insn_mo->name);
7949           macro_build (&expr1, HAVE_32BIT_GPRS ? "addiu" : "daddiu", "t,r,j",
7950                        dreg, 0, BFD_RELOC_LO16);
7951           break;
7952         }
7953       if (CPU_HAS_SEQ (mips_opts.arch)
7954           && -512 <= imm_expr.X_add_number
7955           && imm_expr.X_add_number < 512)
7956         {
7957           macro_build (NULL, "snei", "t,r,+Q", dreg, sreg,
7958                        (int) imm_expr.X_add_number);
7959           break;
7960         }
7961       if (imm_expr.X_op == O_constant
7962           && imm_expr.X_add_number >= 0
7963           && imm_expr.X_add_number < 0x10000)
7964         {
7965           macro_build (&imm_expr, "xori", "t,r,i", dreg, sreg, BFD_RELOC_LO16);
7966         }
7967       else if (imm_expr.X_op == O_constant
7968                && imm_expr.X_add_number > -0x8000
7969                && imm_expr.X_add_number < 0)
7970         {
7971           imm_expr.X_add_number = -imm_expr.X_add_number;
7972           macro_build (&imm_expr, HAVE_32BIT_GPRS ? "addiu" : "daddiu",
7973                        "t,r,j", dreg, sreg, BFD_RELOC_LO16);
7974         }
7975       else if (CPU_HAS_SEQ (mips_opts.arch))
7976         {
7977           used_at = 1;
7978           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7979           macro_build (NULL, "sne", "d,v,t", dreg, sreg, AT);
7980           break;
7981         }
7982       else
7983         {
7984           load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
7985           macro_build (NULL, "xor", "d,v,t", dreg, sreg, AT);
7986           used_at = 1;
7987         }
7988       macro_build (NULL, "sltu", "d,v,t", dreg, 0, dreg);
7989       break;
7990
7991     case M_DSUB_I:
7992       dbl = 1;
7993     case M_SUB_I:
7994       if (imm_expr.X_op == O_constant
7995           && imm_expr.X_add_number > -0x8000
7996           && imm_expr.X_add_number <= 0x8000)
7997         {
7998           imm_expr.X_add_number = -imm_expr.X_add_number;
7999           macro_build (&imm_expr, dbl ? "daddi" : "addi", "t,r,j",
8000                        dreg, sreg, BFD_RELOC_LO16);
8001           break;
8002         }
8003       used_at = 1;
8004       load_register (AT, &imm_expr, dbl);
8005       macro_build (NULL, dbl ? "dsub" : "sub", "d,v,t", dreg, sreg, AT);
8006       break;
8007
8008     case M_DSUBU_I:
8009       dbl = 1;
8010     case M_SUBU_I:
8011       if (imm_expr.X_op == O_constant
8012           && imm_expr.X_add_number > -0x8000
8013           && imm_expr.X_add_number <= 0x8000)
8014         {
8015           imm_expr.X_add_number = -imm_expr.X_add_number;
8016           macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "t,r,j",
8017                        dreg, sreg, BFD_RELOC_LO16);
8018           break;
8019         }
8020       used_at = 1;
8021       load_register (AT, &imm_expr, dbl);
8022       macro_build (NULL, dbl ? "dsubu" : "subu", "d,v,t", dreg, sreg, AT);
8023       break;
8024
8025     case M_TEQ_I:
8026       s = "teq";
8027       goto trap;
8028     case M_TGE_I:
8029       s = "tge";
8030       goto trap;
8031     case M_TGEU_I:
8032       s = "tgeu";
8033       goto trap;
8034     case M_TLT_I:
8035       s = "tlt";
8036       goto trap;
8037     case M_TLTU_I:
8038       s = "tltu";
8039       goto trap;
8040     case M_TNE_I:
8041       s = "tne";
8042     trap:
8043       used_at = 1;
8044       load_register (AT, &imm_expr, HAVE_64BIT_GPRS);
8045       macro_build (NULL, s, "s,t", sreg, AT);
8046       break;
8047
8048     case M_TRUNCWS:
8049     case M_TRUNCWD:
8050       gas_assert (mips_opts.isa == ISA_MIPS1);
8051       used_at = 1;
8052       sreg = (ip->insn_opcode >> 11) & 0x1f;    /* floating reg */
8053       dreg = (ip->insn_opcode >> 06) & 0x1f;    /* floating reg */
8054
8055       /*
8056        * Is the double cfc1 instruction a bug in the mips assembler;
8057        * or is there a reason for it?
8058        */
8059       start_noreorder ();
8060       macro_build (NULL, "cfc1", "t,G", treg, RA);
8061       macro_build (NULL, "cfc1", "t,G", treg, RA);
8062       macro_build (NULL, "nop", "");
8063       expr1.X_add_number = 3;
8064       macro_build (&expr1, "ori", "t,r,i", AT, treg, BFD_RELOC_LO16);
8065       expr1.X_add_number = 2;
8066       macro_build (&expr1, "xori", "t,r,i", AT, AT, BFD_RELOC_LO16);
8067       macro_build (NULL, "ctc1", "t,G", AT, RA);
8068       macro_build (NULL, "nop", "");
8069       macro_build (NULL, mask == M_TRUNCWD ? "cvt.w.d" : "cvt.w.s", "D,S",
8070                    dreg, sreg);
8071       macro_build (NULL, "ctc1", "t,G", treg, RA);
8072       macro_build (NULL, "nop", "");
8073       end_noreorder ();
8074       break;
8075
8076     case M_ULH:
8077       s = "lb";
8078       goto ulh;
8079     case M_ULHU:
8080       s = "lbu";
8081     ulh:
8082       used_at = 1;
8083       if (offset_expr.X_add_number >= 0x7fff)
8084         as_bad (_("operand overflow"));
8085       if (! target_big_endian)
8086         ++offset_expr.X_add_number;
8087       macro_build (&offset_expr, s, "t,o(b)", AT, BFD_RELOC_LO16, breg);
8088       if (! target_big_endian)
8089         --offset_expr.X_add_number;
8090       else
8091         ++offset_expr.X_add_number;
8092       macro_build (&offset_expr, "lbu", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8093       macro_build (NULL, "sll", "d,w,<", AT, AT, 8);
8094       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8095       break;
8096
8097     case M_ULD:
8098       s = "ldl";
8099       s2 = "ldr";
8100       off = 7;
8101       goto ulw;
8102     case M_ULW:
8103       s = "lwl";
8104       s2 = "lwr";
8105       off = 3;
8106     ulw:
8107       if (offset_expr.X_add_number >= 0x8000 - off)
8108         as_bad (_("operand overflow"));
8109       if (treg != breg)
8110         tempreg = treg;
8111       else
8112         {
8113           used_at = 1;
8114           tempreg = AT;
8115         }
8116       if (! target_big_endian)
8117         offset_expr.X_add_number += off;
8118       macro_build (&offset_expr, s, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8119       if (! target_big_endian)
8120         offset_expr.X_add_number -= off;
8121       else
8122         offset_expr.X_add_number += off;
8123       macro_build (&offset_expr, s2, "t,o(b)", tempreg, BFD_RELOC_LO16, breg);
8124
8125       /* If necessary, move the result in tempreg the final destination.  */
8126       if (treg == tempreg)
8127         break;
8128       /* Protect second load's delay slot.  */
8129       load_delay_nop ();
8130       move_register (treg, tempreg);
8131       break;
8132
8133     case M_ULD_A:
8134       s = "ldl";
8135       s2 = "ldr";
8136       off = 7;
8137       goto ulwa;
8138     case M_ULW_A:
8139       s = "lwl";
8140       s2 = "lwr";
8141       off = 3;
8142     ulwa:
8143       used_at = 1;
8144       load_address (AT, &offset_expr, &used_at);
8145       if (breg != 0)
8146         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8147       if (! target_big_endian)
8148         expr1.X_add_number = off;
8149       else
8150         expr1.X_add_number = 0;
8151       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8152       if (! target_big_endian)
8153         expr1.X_add_number = 0;
8154       else
8155         expr1.X_add_number = off;
8156       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8157       break;
8158
8159     case M_ULH_A:
8160     case M_ULHU_A:
8161       used_at = 1;
8162       load_address (AT, &offset_expr, &used_at);
8163       if (breg != 0)
8164         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8165       if (target_big_endian)
8166         expr1.X_add_number = 0;
8167       macro_build (&expr1, mask == M_ULH_A ? "lb" : "lbu", "t,o(b)",
8168                    treg, BFD_RELOC_LO16, AT);
8169       if (target_big_endian)
8170         expr1.X_add_number = 1;
8171       else
8172         expr1.X_add_number = 0;
8173       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8174       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8175       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8176       break;
8177
8178     case M_USH:
8179       used_at = 1;
8180       if (offset_expr.X_add_number >= 0x7fff)
8181         as_bad (_("operand overflow"));
8182       if (target_big_endian)
8183         ++offset_expr.X_add_number;
8184       macro_build (&offset_expr, "sb", "t,o(b)", treg, BFD_RELOC_LO16, breg);
8185       macro_build (NULL, "srl", "d,w,<", AT, treg, 8);
8186       if (target_big_endian)
8187         --offset_expr.X_add_number;
8188       else
8189         ++offset_expr.X_add_number;
8190       macro_build (&offset_expr, "sb", "t,o(b)", AT, BFD_RELOC_LO16, breg);
8191       break;
8192
8193     case M_USD:
8194       s = "sdl";
8195       s2 = "sdr";
8196       off = 7;
8197       goto usw;
8198     case M_USW:
8199       s = "swl";
8200       s2 = "swr";
8201       off = 3;
8202     usw:
8203       if (offset_expr.X_add_number >= 0x8000 - off)
8204         as_bad (_("operand overflow"));
8205       if (! target_big_endian)
8206         offset_expr.X_add_number += off;
8207       macro_build (&offset_expr, s, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8208       if (! target_big_endian)
8209         offset_expr.X_add_number -= off;
8210       else
8211         offset_expr.X_add_number += off;
8212       macro_build (&offset_expr, s2, "t,o(b)", treg, BFD_RELOC_LO16, breg);
8213       break;
8214
8215     case M_USD_A:
8216       s = "sdl";
8217       s2 = "sdr";
8218       off = 7;
8219       goto uswa;
8220     case M_USW_A:
8221       s = "swl";
8222       s2 = "swr";
8223       off = 3;
8224     uswa:
8225       used_at = 1;
8226       load_address (AT, &offset_expr, &used_at);
8227       if (breg != 0)
8228         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8229       if (! target_big_endian)
8230         expr1.X_add_number = off;
8231       else
8232         expr1.X_add_number = 0;
8233       macro_build (&expr1, s, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8234       if (! target_big_endian)
8235         expr1.X_add_number = 0;
8236       else
8237         expr1.X_add_number = off;
8238       macro_build (&expr1, s2, "t,o(b)", treg, BFD_RELOC_LO16, AT);
8239       break;
8240
8241     case M_USH_A:
8242       used_at = 1;
8243       load_address (AT, &offset_expr, &used_at);
8244       if (breg != 0)
8245         macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", AT, AT, breg);
8246       if (! target_big_endian)
8247         expr1.X_add_number = 0;
8248       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8249       macro_build (NULL, "srl", "d,w,<", treg, treg, 8);
8250       if (! target_big_endian)
8251         expr1.X_add_number = 1;
8252       else
8253         expr1.X_add_number = 0;
8254       macro_build (&expr1, "sb", "t,o(b)", treg, BFD_RELOC_LO16, AT);
8255       if (! target_big_endian)
8256         expr1.X_add_number = 0;
8257       else
8258         expr1.X_add_number = 1;
8259       macro_build (&expr1, "lbu", "t,o(b)", AT, BFD_RELOC_LO16, AT);
8260       macro_build (NULL, "sll", "d,w,<", treg, treg, 8);
8261       macro_build (NULL, "or", "d,v,t", treg, treg, AT);
8262       break;
8263
8264     default:
8265       /* FIXME: Check if this is one of the itbl macros, since they
8266          are added dynamically.  */
8267       as_bad (_("Macro %s not implemented yet"), ip->insn_mo->name);
8268       break;
8269     }
8270   if (!mips_opts.at && used_at)
8271     as_bad (_("Macro used $at after \".set noat\""));
8272 }
8273
8274 /* Implement macros in mips16 mode.  */
8275
8276 static void
8277 mips16_macro (struct mips_cl_insn *ip)
8278 {
8279   int mask;
8280   int xreg, yreg, zreg, tmp;
8281   expressionS expr1;
8282   int dbl;
8283   const char *s, *s2, *s3;
8284
8285   mask = ip->insn_mo->mask;
8286
8287   xreg = MIPS16_EXTRACT_OPERAND (RX, *ip);
8288   yreg = MIPS16_EXTRACT_OPERAND (RY, *ip);
8289   zreg = MIPS16_EXTRACT_OPERAND (RZ, *ip);
8290
8291   expr1.X_op = O_constant;
8292   expr1.X_op_symbol = NULL;
8293   expr1.X_add_symbol = NULL;
8294   expr1.X_add_number = 1;
8295
8296   dbl = 0;
8297
8298   switch (mask)
8299     {
8300     default:
8301       internalError ();
8302
8303     case M_DDIV_3:
8304       dbl = 1;
8305     case M_DIV_3:
8306       s = "mflo";
8307       goto do_div3;
8308     case M_DREM_3:
8309       dbl = 1;
8310     case M_REM_3:
8311       s = "mfhi";
8312     do_div3:
8313       start_noreorder ();
8314       macro_build (NULL, dbl ? "ddiv" : "div", "0,x,y", xreg, yreg);
8315       expr1.X_add_number = 2;
8316       macro_build (&expr1, "bnez", "x,p", yreg);
8317       macro_build (NULL, "break", "6", 7);
8318
8319       /* FIXME: The normal code checks for of -1 / -0x80000000 here,
8320          since that causes an overflow.  We should do that as well,
8321          but I don't see how to do the comparisons without a temporary
8322          register.  */
8323       end_noreorder ();
8324       macro_build (NULL, s, "x", zreg);
8325       break;
8326
8327     case M_DIVU_3:
8328       s = "divu";
8329       s2 = "mflo";
8330       goto do_divu3;
8331     case M_REMU_3:
8332       s = "divu";
8333       s2 = "mfhi";
8334       goto do_divu3;
8335     case M_DDIVU_3:
8336       s = "ddivu";
8337       s2 = "mflo";
8338       goto do_divu3;
8339     case M_DREMU_3:
8340       s = "ddivu";
8341       s2 = "mfhi";
8342     do_divu3:
8343       start_noreorder ();
8344       macro_build (NULL, s, "0,x,y", xreg, yreg);
8345       expr1.X_add_number = 2;
8346       macro_build (&expr1, "bnez", "x,p", yreg);
8347       macro_build (NULL, "break", "6", 7);
8348       end_noreorder ();
8349       macro_build (NULL, s2, "x", zreg);
8350       break;
8351
8352     case M_DMUL:
8353       dbl = 1;
8354     case M_MUL:
8355       macro_build (NULL, dbl ? "dmultu" : "multu", "x,y", xreg, yreg);
8356       macro_build (NULL, "mflo", "x", zreg);
8357       break;
8358
8359     case M_DSUBU_I:
8360       dbl = 1;
8361       goto do_subu;
8362     case M_SUBU_I:
8363     do_subu:
8364       if (imm_expr.X_op != O_constant)
8365         as_bad (_("Unsupported large constant"));
8366       imm_expr.X_add_number = -imm_expr.X_add_number;
8367       macro_build (&imm_expr, dbl ? "daddiu" : "addiu", "y,x,4", yreg, xreg);
8368       break;
8369
8370     case M_SUBU_I_2:
8371       if (imm_expr.X_op != O_constant)
8372         as_bad (_("Unsupported large constant"));
8373       imm_expr.X_add_number = -imm_expr.X_add_number;
8374       macro_build (&imm_expr, "addiu", "x,k", xreg);
8375       break;
8376
8377     case M_DSUBU_I_2:
8378       if (imm_expr.X_op != O_constant)
8379         as_bad (_("Unsupported large constant"));
8380       imm_expr.X_add_number = -imm_expr.X_add_number;
8381       macro_build (&imm_expr, "daddiu", "y,j", yreg);
8382       break;
8383
8384     case M_BEQ:
8385       s = "cmp";
8386       s2 = "bteqz";
8387       goto do_branch;
8388     case M_BNE:
8389       s = "cmp";
8390       s2 = "btnez";
8391       goto do_branch;
8392     case M_BLT:
8393       s = "slt";
8394       s2 = "btnez";
8395       goto do_branch;
8396     case M_BLTU:
8397       s = "sltu";
8398       s2 = "btnez";
8399       goto do_branch;
8400     case M_BLE:
8401       s = "slt";
8402       s2 = "bteqz";
8403       goto do_reverse_branch;
8404     case M_BLEU:
8405       s = "sltu";
8406       s2 = "bteqz";
8407       goto do_reverse_branch;
8408     case M_BGE:
8409       s = "slt";
8410       s2 = "bteqz";
8411       goto do_branch;
8412     case M_BGEU:
8413       s = "sltu";
8414       s2 = "bteqz";
8415       goto do_branch;
8416     case M_BGT:
8417       s = "slt";
8418       s2 = "btnez";
8419       goto do_reverse_branch;
8420     case M_BGTU:
8421       s = "sltu";
8422       s2 = "btnez";
8423
8424     do_reverse_branch:
8425       tmp = xreg;
8426       xreg = yreg;
8427       yreg = tmp;
8428
8429     do_branch:
8430       macro_build (NULL, s, "x,y", xreg, yreg);
8431       macro_build (&offset_expr, s2, "p");
8432       break;
8433
8434     case M_BEQ_I:
8435       s = "cmpi";
8436       s2 = "bteqz";
8437       s3 = "x,U";
8438       goto do_branch_i;
8439     case M_BNE_I:
8440       s = "cmpi";
8441       s2 = "btnez";
8442       s3 = "x,U";
8443       goto do_branch_i;
8444     case M_BLT_I:
8445       s = "slti";
8446       s2 = "btnez";
8447       s3 = "x,8";
8448       goto do_branch_i;
8449     case M_BLTU_I:
8450       s = "sltiu";
8451       s2 = "btnez";
8452       s3 = "x,8";
8453       goto do_branch_i;
8454     case M_BLE_I:
8455       s = "slti";
8456       s2 = "btnez";
8457       s3 = "x,8";
8458       goto do_addone_branch_i;
8459     case M_BLEU_I:
8460       s = "sltiu";
8461       s2 = "btnez";
8462       s3 = "x,8";
8463       goto do_addone_branch_i;
8464     case M_BGE_I:
8465       s = "slti";
8466       s2 = "bteqz";
8467       s3 = "x,8";
8468       goto do_branch_i;
8469     case M_BGEU_I:
8470       s = "sltiu";
8471       s2 = "bteqz";
8472       s3 = "x,8";
8473       goto do_branch_i;
8474     case M_BGT_I:
8475       s = "slti";
8476       s2 = "bteqz";
8477       s3 = "x,8";
8478       goto do_addone_branch_i;
8479     case M_BGTU_I:
8480       s = "sltiu";
8481       s2 = "bteqz";
8482       s3 = "x,8";
8483
8484     do_addone_branch_i:
8485       if (imm_expr.X_op != O_constant)
8486         as_bad (_("Unsupported large constant"));
8487       ++imm_expr.X_add_number;
8488
8489     do_branch_i:
8490       macro_build (&imm_expr, s, s3, xreg);
8491       macro_build (&offset_expr, s2, "p");
8492       break;
8493
8494     case M_ABS:
8495       expr1.X_add_number = 0;
8496       macro_build (&expr1, "slti", "x,8", yreg);
8497       if (xreg != yreg)
8498         move_register (xreg, yreg);
8499       expr1.X_add_number = 2;
8500       macro_build (&expr1, "bteqz", "p");
8501       macro_build (NULL, "neg", "x,w", xreg, xreg);
8502     }
8503 }
8504
8505 /* For consistency checking, verify that all bits are specified either
8506    by the match/mask part of the instruction definition, or by the
8507    operand list.  */
8508 static int
8509 validate_mips_insn (const struct mips_opcode *opc)
8510 {
8511   const char *p = opc->args;
8512   char c;
8513   unsigned long used_bits = opc->mask;
8514
8515   if ((used_bits & opc->match) != opc->match)
8516     {
8517       as_bad (_("internal: bad mips opcode (mask error): %s %s"),
8518               opc->name, opc->args);
8519       return 0;
8520     }
8521 #define USE_BITS(mask,shift)    (used_bits |= ((mask) << (shift)))
8522   while (*p)
8523     switch (c = *p++)
8524       {
8525       case ',': break;
8526       case '(': break;
8527       case ')': break;
8528       case '+':
8529         switch (c = *p++)
8530           {
8531           case '1': USE_BITS (OP_MASK_UDI1,     OP_SH_UDI1);    break;
8532           case '2': USE_BITS (OP_MASK_UDI2,     OP_SH_UDI2);    break;
8533           case '3': USE_BITS (OP_MASK_UDI3,     OP_SH_UDI3);    break;
8534           case '4': USE_BITS (OP_MASK_UDI4,     OP_SH_UDI4);    break;
8535           case 'A': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8536           case 'B': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8537           case 'C': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8538           case 'D': USE_BITS (OP_MASK_RD,       OP_SH_RD);
8539                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8540           case 'E': USE_BITS (OP_MASK_SHAMT,    OP_SH_SHAMT);   break;
8541           case 'F': USE_BITS (OP_MASK_INSMSB,   OP_SH_INSMSB);  break;
8542           case 'G': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8543           case 'H': USE_BITS (OP_MASK_EXTMSBD,  OP_SH_EXTMSBD); break;
8544           case 'I': break;
8545           case 't': USE_BITS (OP_MASK_RT,       OP_SH_RT);      break;
8546           case 'T': USE_BITS (OP_MASK_RT,       OP_SH_RT);
8547                     USE_BITS (OP_MASK_SEL,      OP_SH_SEL);     break;
8548           case 'x': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8549           case 'X': USE_BITS (OP_MASK_BBITIND,  OP_SH_BBITIND); break;
8550           case 'p': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8551           case 'P': USE_BITS (OP_MASK_CINSPOS,  OP_SH_CINSPOS); break;
8552           case 'Q': USE_BITS (OP_MASK_SEQI,     OP_SH_SEQI);    break;
8553           case 's': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8554           case 'S': USE_BITS (OP_MASK_CINSLM1,  OP_SH_CINSLM1); break;
8555
8556           default:
8557             as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
8558                     c, opc->name, opc->args);
8559             return 0;
8560           }
8561         break;
8562       case '<': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8563       case '>': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8564       case 'A': break;
8565       case 'B': USE_BITS (OP_MASK_CODE20,       OP_SH_CODE20);  break;
8566       case 'C': USE_BITS (OP_MASK_COPZ,         OP_SH_COPZ);    break;
8567       case 'D': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8568       case 'E': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8569       case 'F': break;
8570       case 'G': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8571       case 'H': USE_BITS (OP_MASK_SEL,          OP_SH_SEL);     break;
8572       case 'I': break;
8573       case 'J': USE_BITS (OP_MASK_CODE19,       OP_SH_CODE19);  break;
8574       case 'K': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8575       case 'L': break;
8576       case 'M': USE_BITS (OP_MASK_CCC,          OP_SH_CCC);     break;
8577       case 'N': USE_BITS (OP_MASK_BCC,          OP_SH_BCC);     break;
8578       case 'O': USE_BITS (OP_MASK_ALN,          OP_SH_ALN);     break;
8579       case 'Q': USE_BITS (OP_MASK_VSEL,         OP_SH_VSEL);
8580                 USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8581       case 'R': USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
8582       case 'S': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8583       case 'T': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8584       case 'V': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8585       case 'W': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8586       case 'X': USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
8587       case 'Y': USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
8588       case 'Z': USE_BITS (OP_MASK_FT,           OP_SH_FT);      break;
8589       case 'a': USE_BITS (OP_MASK_TARGET,       OP_SH_TARGET);  break;
8590       case 'b': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8591       case 'c': USE_BITS (OP_MASK_CODE,         OP_SH_CODE);    break;
8592       case 'd': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8593       case 'f': break;
8594       case 'h': USE_BITS (OP_MASK_PREFX,        OP_SH_PREFX);   break;
8595       case 'i': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8596       case 'j': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8597       case 'k': USE_BITS (OP_MASK_CACHE,        OP_SH_CACHE);   break;
8598       case 'l': break;
8599       case 'o': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8600       case 'p': USE_BITS (OP_MASK_DELTA,        OP_SH_DELTA);   break;
8601       case 'q': USE_BITS (OP_MASK_CODE2,        OP_SH_CODE2);   break;
8602       case 'r': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8603       case 's': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8604       case 't': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8605       case 'u': USE_BITS (OP_MASK_IMMEDIATE,    OP_SH_IMMEDIATE); break;
8606       case 'v': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8607       case 'w': USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8608       case 'x': break;
8609       case 'z': break;
8610       case 'P': USE_BITS (OP_MASK_PERFREG,      OP_SH_PERFREG); break;
8611       case 'U': USE_BITS (OP_MASK_RD,           OP_SH_RD);
8612                 USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
8613       case 'e': USE_BITS (OP_MASK_VECBYTE,      OP_SH_VECBYTE); break;
8614       case '%': USE_BITS (OP_MASK_VECALIGN,     OP_SH_VECALIGN); break;
8615       case '[': break;
8616       case ']': break;
8617       case '1': USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
8618       case '2': USE_BITS (OP_MASK_BP,           OP_SH_BP);      break;
8619       case '3': USE_BITS (OP_MASK_SA3,          OP_SH_SA3);     break;
8620       case '4': USE_BITS (OP_MASK_SA4,          OP_SH_SA4);     break;
8621       case '5': USE_BITS (OP_MASK_IMM8,         OP_SH_IMM8);    break;
8622       case '6': USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
8623       case '7': USE_BITS (OP_MASK_DSPACC,       OP_SH_DSPACC);  break;
8624       case '8': USE_BITS (OP_MASK_WRDSP,        OP_SH_WRDSP);   break;
8625       case '9': USE_BITS (OP_MASK_DSPACC_S,     OP_SH_DSPACC_S);break;
8626       case '0': USE_BITS (OP_MASK_DSPSFT,       OP_SH_DSPSFT);  break;
8627       case '\'': USE_BITS (OP_MASK_RDDSP,       OP_SH_RDDSP);   break;
8628       case ':': USE_BITS (OP_MASK_DSPSFT_7,     OP_SH_DSPSFT_7);break;
8629       case '@': USE_BITS (OP_MASK_IMM10,        OP_SH_IMM10);   break;
8630       case '!': USE_BITS (OP_MASK_MT_U,         OP_SH_MT_U);    break;
8631       case '$': USE_BITS (OP_MASK_MT_H,         OP_SH_MT_H);    break;
8632       case '*': USE_BITS (OP_MASK_MTACC_T,      OP_SH_MTACC_T); break;
8633       case '&': USE_BITS (OP_MASK_MTACC_D,      OP_SH_MTACC_D); break;
8634       case 'g': USE_BITS (OP_MASK_RD,           OP_SH_RD);      break;
8635       default:
8636         as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"),
8637                 c, opc->name, opc->args);
8638         return 0;
8639       }
8640 #undef USE_BITS
8641   if (used_bits != 0xffffffff)
8642     {
8643       as_bad (_("internal: bad mips opcode (bits 0x%lx undefined): %s %s"),
8644               ~used_bits & 0xffffffff, opc->name, opc->args);
8645       return 0;
8646     }
8647   return 1;
8648 }
8649
8650 /* UDI immediates.  */
8651 struct mips_immed {
8652   char          type;
8653   unsigned int  shift;
8654   unsigned long mask;
8655   const char *  desc;
8656 };
8657
8658 static const struct mips_immed mips_immed[] = {
8659   { '1',        OP_SH_UDI1,     OP_MASK_UDI1,           0},
8660   { '2',        OP_SH_UDI2,     OP_MASK_UDI2,           0},
8661   { '3',        OP_SH_UDI3,     OP_MASK_UDI3,           0},
8662   { '4',        OP_SH_UDI4,     OP_MASK_UDI4,           0},
8663   { 0,0,0,0 }
8664 };
8665
8666 /* Check whether an odd floating-point register is allowed.  */
8667 static int
8668 mips_oddfpreg_ok (const struct mips_opcode *insn, int argnum)
8669 {
8670   const char *s = insn->name;
8671
8672   if (insn->pinfo == INSN_MACRO)
8673     /* Let a macro pass, we'll catch it later when it is expanded.  */
8674     return 1;
8675
8676   if (ISA_HAS_ODD_SINGLE_FPR (mips_opts.isa))
8677     {
8678       /* Allow odd registers for single-precision ops.  */
8679       switch (insn->pinfo & (FP_S | FP_D))
8680         {
8681         case FP_S:
8682         case 0:
8683           return 1;     /* both single precision - ok */
8684         case FP_D:
8685           return 0;     /* both double precision - fail */
8686         default:
8687           break;
8688         }
8689
8690       /* Cvt.w.x and cvt.x.w allow an odd register for a 'w' or 's' operand.  */
8691       s = strchr (insn->name, '.');
8692       if (argnum == 2)
8693         s = s != NULL ? strchr (s + 1, '.') : NULL;
8694       return (s != NULL && (s[1] == 'w' || s[1] == 's'));
8695     } 
8696
8697   /* Single-precision coprocessor loads and moves are OK too.  */
8698   if ((insn->pinfo & FP_S)
8699       && (insn->pinfo & (INSN_COPROC_MEMORY_DELAY | INSN_STORE_MEMORY
8700                          | INSN_LOAD_COPROC_DELAY | INSN_COPROC_MOVE_DELAY)))
8701     return 1;
8702
8703   return 0;
8704 }
8705
8706 /* This routine assembles an instruction into its binary format.  As a
8707    side effect, it sets one of the global variables imm_reloc or
8708    offset_reloc to the type of relocation to do if one of the operands
8709    is an address expression.  */
8710
8711 static void
8712 mips_ip (char *str, struct mips_cl_insn *ip)
8713 {
8714   char *s;
8715   const char *args;
8716   char c = 0;
8717   struct mips_opcode *insn;
8718   char *argsStart;
8719   unsigned int regno;
8720   unsigned int lastregno = 0;
8721   unsigned int lastpos = 0;
8722   unsigned int limlo, limhi;
8723   char *s_reset;
8724   char save_c = 0;
8725   offsetT min_range, max_range;
8726   int argnum;
8727   unsigned int rtype;
8728
8729   insn_error = NULL;
8730
8731   /* If the instruction contains a '.', we first try to match an instruction
8732      including the '.'.  Then we try again without the '.'.  */
8733   insn = NULL;
8734   for (s = str; *s != '\0' && !ISSPACE (*s); ++s)
8735     continue;
8736
8737   /* If we stopped on whitespace, then replace the whitespace with null for
8738      the call to hash_find.  Save the character we replaced just in case we
8739      have to re-parse the instruction.  */
8740   if (ISSPACE (*s))
8741     {
8742       save_c = *s;
8743       *s++ = '\0';
8744     }
8745
8746   insn = (struct mips_opcode *) hash_find (op_hash, str);
8747
8748   /* If we didn't find the instruction in the opcode table, try again, but
8749      this time with just the instruction up to, but not including the
8750      first '.'.  */
8751   if (insn == NULL)
8752     {
8753       /* Restore the character we overwrite above (if any).  */
8754       if (save_c)
8755         *(--s) = save_c;
8756
8757       /* Scan up to the first '.' or whitespace.  */
8758       for (s = str;
8759            *s != '\0' && *s != '.' && !ISSPACE (*s);
8760            ++s)
8761         continue;
8762
8763       /* If we did not find a '.', then we can quit now.  */
8764       if (*s != '.')
8765         {
8766           insn_error = _("unrecognized opcode");
8767           return;
8768         }
8769
8770       /* Lookup the instruction in the hash table.  */
8771       *s++ = '\0';
8772       if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL)
8773         {
8774           insn_error = _("unrecognized opcode");
8775           return;
8776         }
8777     }
8778
8779   argsStart = s;
8780   for (;;)
8781     {
8782       bfd_boolean ok;
8783
8784       gas_assert (strcmp (insn->name, str) == 0);
8785
8786       ok = is_opcode_valid (insn);
8787       if (! ok)
8788         {
8789           if (insn + 1 < &mips_opcodes[NUMOPCODES]
8790               && strcmp (insn->name, insn[1].name) == 0)
8791             {
8792               ++insn;
8793               continue;
8794             }
8795           else
8796             {
8797               if (!insn_error)
8798                 {
8799                   static char buf[100];
8800                   sprintf (buf,
8801                            _("opcode not supported on this processor: %s (%s)"),
8802                            mips_cpu_info_from_arch (mips_opts.arch)->name,
8803                            mips_cpu_info_from_isa (mips_opts.isa)->name);
8804                   insn_error = buf;
8805                 }
8806               if (save_c)
8807                 *(--s) = save_c;
8808               return;
8809             }
8810         }
8811
8812       create_insn (ip, insn);
8813       insn_error = NULL;
8814       argnum = 1;
8815       lastregno = 0xffffffff;
8816       for (args = insn->args;; ++args)
8817         {
8818           int is_mdmx;
8819
8820           s += strspn (s, " \t");
8821           is_mdmx = 0;
8822           switch (*args)
8823             {
8824             case '\0':          /* end of args */
8825               if (*s == '\0')
8826                 return;
8827               break;
8828
8829             case '2': /* dsp 2-bit unsigned immediate in bit 11 */
8830               my_getExpression (&imm_expr, s);
8831               check_absolute_expr (ip, &imm_expr);
8832               if ((unsigned long) imm_expr.X_add_number != 1
8833                   && (unsigned long) imm_expr.X_add_number != 3)
8834                 {
8835                   as_bad (_("BALIGN immediate not 1 or 3 (%lu)"),
8836                           (unsigned long) imm_expr.X_add_number);
8837                 }
8838               INSERT_OPERAND (BP, *ip, imm_expr.X_add_number);
8839               imm_expr.X_op = O_absent;
8840               s = expr_end;
8841               continue;
8842
8843             case '3': /* dsp 3-bit unsigned immediate in bit 21 */
8844               my_getExpression (&imm_expr, s);
8845               check_absolute_expr (ip, &imm_expr);
8846               if (imm_expr.X_add_number & ~OP_MASK_SA3)
8847                 {
8848                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8849                           OP_MASK_SA3, (unsigned long) imm_expr.X_add_number);
8850                 }
8851               INSERT_OPERAND (SA3, *ip, imm_expr.X_add_number);
8852               imm_expr.X_op = O_absent;
8853               s = expr_end;
8854               continue;
8855
8856             case '4': /* dsp 4-bit unsigned immediate in bit 21 */
8857               my_getExpression (&imm_expr, s);
8858               check_absolute_expr (ip, &imm_expr);
8859               if (imm_expr.X_add_number & ~OP_MASK_SA4)
8860                 {
8861                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8862                           OP_MASK_SA4, (unsigned long) imm_expr.X_add_number);
8863                 }
8864               INSERT_OPERAND (SA4, *ip, imm_expr.X_add_number);
8865               imm_expr.X_op = O_absent;
8866               s = expr_end;
8867               continue;
8868
8869             case '5': /* dsp 8-bit unsigned immediate in bit 16 */
8870               my_getExpression (&imm_expr, s);
8871               check_absolute_expr (ip, &imm_expr);
8872               if (imm_expr.X_add_number & ~OP_MASK_IMM8)
8873                 {
8874                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8875                           OP_MASK_IMM8, (unsigned long) imm_expr.X_add_number);
8876                 }
8877               INSERT_OPERAND (IMM8, *ip, imm_expr.X_add_number);
8878               imm_expr.X_op = O_absent;
8879               s = expr_end;
8880               continue;
8881
8882             case '6': /* dsp 5-bit unsigned immediate in bit 21 */
8883               my_getExpression (&imm_expr, s);
8884               check_absolute_expr (ip, &imm_expr);
8885               if (imm_expr.X_add_number & ~OP_MASK_RS)
8886                 {
8887                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8888                           OP_MASK_RS, (unsigned long) imm_expr.X_add_number);
8889                 }
8890               INSERT_OPERAND (RS, *ip, imm_expr.X_add_number);
8891               imm_expr.X_op = O_absent;
8892               s = expr_end;
8893               continue;
8894
8895             case '7': /* four dsp accumulators in bits 11,12 */ 
8896               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8897                   s[3] >= '0' && s[3] <= '3')
8898                 {
8899                   regno = s[3] - '0';
8900                   s += 4;
8901                   INSERT_OPERAND (DSPACC, *ip, regno);
8902                   continue;
8903                 }
8904               else
8905                 as_bad (_("Invalid dsp acc register"));
8906               break;
8907
8908             case '8': /* dsp 6-bit unsigned immediate in bit 11 */
8909               my_getExpression (&imm_expr, s);
8910               check_absolute_expr (ip, &imm_expr);
8911               if (imm_expr.X_add_number & ~OP_MASK_WRDSP)
8912                 {
8913                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8914                           OP_MASK_WRDSP,
8915                           (unsigned long) imm_expr.X_add_number);
8916                 }
8917               INSERT_OPERAND (WRDSP, *ip, imm_expr.X_add_number);
8918               imm_expr.X_op = O_absent;
8919               s = expr_end;
8920               continue;
8921
8922             case '9': /* four dsp accumulators in bits 21,22 */
8923               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
8924                   s[3] >= '0' && s[3] <= '3')
8925                 {
8926                   regno = s[3] - '0';
8927                   s += 4;
8928                   INSERT_OPERAND (DSPACC_S, *ip, regno);
8929                   continue;
8930                 }
8931               else
8932                 as_bad (_("Invalid dsp acc register"));
8933               break;
8934
8935             case '0': /* dsp 6-bit signed immediate in bit 20 */
8936               my_getExpression (&imm_expr, s);
8937               check_absolute_expr (ip, &imm_expr);
8938               min_range = -((OP_MASK_DSPSFT + 1) >> 1);
8939               max_range = ((OP_MASK_DSPSFT + 1) >> 1) - 1;
8940               if (imm_expr.X_add_number < min_range ||
8941                   imm_expr.X_add_number > max_range)
8942                 {
8943                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8944                           (long) min_range, (long) max_range,
8945                           (long) imm_expr.X_add_number);
8946                 }
8947               INSERT_OPERAND (DSPSFT, *ip, imm_expr.X_add_number);
8948               imm_expr.X_op = O_absent;
8949               s = expr_end;
8950               continue;
8951
8952             case '\'': /* dsp 6-bit unsigned immediate in bit 16 */
8953               my_getExpression (&imm_expr, s);
8954               check_absolute_expr (ip, &imm_expr);
8955               if (imm_expr.X_add_number & ~OP_MASK_RDDSP)
8956                 {
8957                   as_bad (_("DSP immediate not in range 0..%d (%lu)"),
8958                           OP_MASK_RDDSP,
8959                           (unsigned long) imm_expr.X_add_number);
8960                 }
8961               INSERT_OPERAND (RDDSP, *ip, imm_expr.X_add_number);
8962               imm_expr.X_op = O_absent;
8963               s = expr_end;
8964               continue;
8965
8966             case ':': /* dsp 7-bit signed immediate in bit 19 */
8967               my_getExpression (&imm_expr, s);
8968               check_absolute_expr (ip, &imm_expr);
8969               min_range = -((OP_MASK_DSPSFT_7 + 1) >> 1);
8970               max_range = ((OP_MASK_DSPSFT_7 + 1) >> 1) - 1;
8971               if (imm_expr.X_add_number < min_range ||
8972                   imm_expr.X_add_number > max_range)
8973                 {
8974                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8975                           (long) min_range, (long) max_range,
8976                           (long) imm_expr.X_add_number);
8977                 }
8978               INSERT_OPERAND (DSPSFT_7, *ip, imm_expr.X_add_number);
8979               imm_expr.X_op = O_absent;
8980               s = expr_end;
8981               continue;
8982
8983             case '@': /* dsp 10-bit signed immediate in bit 16 */
8984               my_getExpression (&imm_expr, s);
8985               check_absolute_expr (ip, &imm_expr);
8986               min_range = -((OP_MASK_IMM10 + 1) >> 1);
8987               max_range = ((OP_MASK_IMM10 + 1) >> 1) - 1;
8988               if (imm_expr.X_add_number < min_range ||
8989                   imm_expr.X_add_number > max_range)
8990                 {
8991                   as_bad (_("DSP immediate not in range %ld..%ld (%ld)"),
8992                           (long) min_range, (long) max_range,
8993                           (long) imm_expr.X_add_number);
8994                 }
8995               INSERT_OPERAND (IMM10, *ip, imm_expr.X_add_number);
8996               imm_expr.X_op = O_absent;
8997               s = expr_end;
8998               continue;
8999
9000             case '!': /* MT usermode flag bit.  */
9001               my_getExpression (&imm_expr, s);
9002               check_absolute_expr (ip, &imm_expr);
9003               if (imm_expr.X_add_number & ~OP_MASK_MT_U)
9004                 as_bad (_("MT usermode bit not 0 or 1 (%lu)"),
9005                         (unsigned long) imm_expr.X_add_number);
9006               INSERT_OPERAND (MT_U, *ip, imm_expr.X_add_number);
9007               imm_expr.X_op = O_absent;
9008               s = expr_end;
9009               continue;
9010
9011             case '$': /* MT load high flag bit.  */
9012               my_getExpression (&imm_expr, s);
9013               check_absolute_expr (ip, &imm_expr);
9014               if (imm_expr.X_add_number & ~OP_MASK_MT_H)
9015                 as_bad (_("MT load high bit not 0 or 1 (%lu)"),
9016                         (unsigned long) imm_expr.X_add_number);
9017               INSERT_OPERAND (MT_H, *ip, imm_expr.X_add_number);
9018               imm_expr.X_op = O_absent;
9019               s = expr_end;
9020               continue;
9021
9022             case '*': /* four dsp accumulators in bits 18,19 */ 
9023               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9024                   s[3] >= '0' && s[3] <= '3')
9025                 {
9026                   regno = s[3] - '0';
9027                   s += 4;
9028                   INSERT_OPERAND (MTACC_T, *ip, regno);
9029                   continue;
9030                 }
9031               else
9032                 as_bad (_("Invalid dsp/smartmips acc register"));
9033               break;
9034
9035             case '&': /* four dsp accumulators in bits 13,14 */ 
9036               if (s[0] == '$' && s[1] == 'a' && s[2] == 'c' &&
9037                   s[3] >= '0' && s[3] <= '3')
9038                 {
9039                   regno = s[3] - '0';
9040                   s += 4;
9041                   INSERT_OPERAND (MTACC_D, *ip, regno);
9042                   continue;
9043                 }
9044               else
9045                 as_bad (_("Invalid dsp/smartmips acc register"));
9046               break;
9047
9048             case ',':
9049               ++argnum;
9050               if (*s++ == *args)
9051                 continue;
9052               s--;
9053               switch (*++args)
9054                 {
9055                 case 'r':
9056                 case 'v':
9057                   INSERT_OPERAND (RS, *ip, lastregno);
9058                   continue;
9059
9060                 case 'w':
9061                   INSERT_OPERAND (RT, *ip, lastregno);
9062                   continue;
9063
9064                 case 'W':
9065                   INSERT_OPERAND (FT, *ip, lastregno);
9066                   continue;
9067
9068                 case 'V':
9069                   INSERT_OPERAND (FS, *ip, lastregno);
9070                   continue;
9071                 }
9072               break;
9073
9074             case '(':
9075               /* Handle optional base register.
9076                  Either the base register is omitted or
9077                  we must have a left paren.  */
9078               /* This is dependent on the next operand specifier
9079                  is a base register specification.  */
9080               gas_assert (args[1] == 'b' || args[1] == '5'
9081                       || args[1] == '-' || args[1] == '4');
9082               if (*s == '\0')
9083                 return;
9084
9085             case ')':           /* these must match exactly */
9086             case '[':
9087             case ']':
9088               if (*s++ == *args)
9089                 continue;
9090               break;
9091
9092             case '+':           /* Opcode extension character.  */
9093               switch (*++args)
9094                 {
9095                 case '1':       /* UDI immediates.  */
9096                 case '2':
9097                 case '3':
9098                 case '4':
9099                   {
9100                     const struct mips_immed *imm = mips_immed;
9101
9102                     while (imm->type && imm->type != *args)
9103                       ++imm;
9104                     if (! imm->type)
9105                       internalError ();
9106                     my_getExpression (&imm_expr, s);
9107                     check_absolute_expr (ip, &imm_expr);
9108                     if ((unsigned long) imm_expr.X_add_number & ~imm->mask)
9109                       {
9110                         as_warn (_("Illegal %s number (%lu, 0x%lx)"),
9111                                  imm->desc ? imm->desc : ip->insn_mo->name,
9112                                  (unsigned long) imm_expr.X_add_number,
9113                                  (unsigned long) imm_expr.X_add_number);
9114                               imm_expr.X_add_number &= imm->mask;
9115                       }
9116                     ip->insn_opcode |= ((unsigned long) imm_expr.X_add_number
9117                                         << imm->shift);
9118                     imm_expr.X_op = O_absent;
9119                     s = expr_end;
9120                   }
9121                   continue;
9122                   
9123                 case 'A':               /* ins/ext position, becomes LSB.  */
9124                   limlo = 0;
9125                   limhi = 31;
9126                   goto do_lsb;
9127                 case 'E':
9128                   limlo = 32;
9129                   limhi = 63;
9130                   goto do_lsb;
9131 do_lsb:
9132                   my_getExpression (&imm_expr, s);
9133                   check_absolute_expr (ip, &imm_expr);
9134                   if ((unsigned long) imm_expr.X_add_number < limlo
9135                       || (unsigned long) imm_expr.X_add_number > limhi)
9136                     {
9137                       as_bad (_("Improper position (%lu)"),
9138                               (unsigned long) imm_expr.X_add_number);
9139                       imm_expr.X_add_number = limlo;
9140                     }
9141                   lastpos = imm_expr.X_add_number;
9142                   INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9143                   imm_expr.X_op = O_absent;
9144                   s = expr_end;
9145                   continue;
9146
9147                 case 'B':               /* ins size, becomes MSB.  */
9148                   limlo = 1;
9149                   limhi = 32;
9150                   goto do_msb;
9151                 case 'F':
9152                   limlo = 33;
9153                   limhi = 64;
9154                   goto do_msb;
9155 do_msb:
9156                   my_getExpression (&imm_expr, s);
9157                   check_absolute_expr (ip, &imm_expr);
9158                   /* Check for negative input so that small negative numbers
9159                      will not succeed incorrectly.  The checks against
9160                      (pos+size) transitively check "size" itself,
9161                      assuming that "pos" is reasonable.  */
9162                   if ((long) imm_expr.X_add_number < 0
9163                       || ((unsigned long) imm_expr.X_add_number
9164                           + lastpos) < limlo
9165                       || ((unsigned long) imm_expr.X_add_number
9166                           + lastpos) > limhi)
9167                     {
9168                       as_bad (_("Improper insert size (%lu, position %lu)"),
9169                               (unsigned long) imm_expr.X_add_number,
9170                               (unsigned long) lastpos);
9171                       imm_expr.X_add_number = limlo - lastpos;
9172                     }
9173                   INSERT_OPERAND (INSMSB, *ip,
9174                                  lastpos + imm_expr.X_add_number - 1);
9175                   imm_expr.X_op = O_absent;
9176                   s = expr_end;
9177                   continue;
9178
9179                 case 'C':               /* ext size, becomes MSBD.  */
9180                   limlo = 1;
9181                   limhi = 32;
9182                   goto do_msbd;
9183                 case 'G':
9184                   limlo = 33;
9185                   limhi = 64;
9186                   goto do_msbd;
9187                 case 'H':
9188                   limlo = 33;
9189                   limhi = 64;
9190                   goto do_msbd;
9191 do_msbd:
9192                   my_getExpression (&imm_expr, s);
9193                   check_absolute_expr (ip, &imm_expr);
9194                   /* Check for negative input so that small negative numbers
9195                      will not succeed incorrectly.  The checks against
9196                      (pos+size) transitively check "size" itself,
9197                      assuming that "pos" is reasonable.  */
9198                   if ((long) imm_expr.X_add_number < 0
9199                       || ((unsigned long) imm_expr.X_add_number
9200                           + lastpos) < limlo
9201                       || ((unsigned long) imm_expr.X_add_number
9202                           + lastpos) > limhi)
9203                     {
9204                       as_bad (_("Improper extract size (%lu, position %lu)"),
9205                               (unsigned long) imm_expr.X_add_number,
9206                               (unsigned long) lastpos);
9207                       imm_expr.X_add_number = limlo - lastpos;
9208                     }
9209                   INSERT_OPERAND (EXTMSBD, *ip, imm_expr.X_add_number - 1);
9210                   imm_expr.X_op = O_absent;
9211                   s = expr_end;
9212                   continue;
9213
9214                 case 'D':
9215                   /* +D is for disassembly only; never match.  */
9216                   break;
9217
9218                 case 'I':
9219                   /* "+I" is like "I", except that imm2_expr is used.  */
9220                   my_getExpression (&imm2_expr, s);
9221                   if (imm2_expr.X_op != O_big
9222                       && imm2_expr.X_op != O_constant)
9223                   insn_error = _("absolute expression required");
9224                   if (HAVE_32BIT_GPRS)
9225                     normalize_constant_expr (&imm2_expr);
9226                   s = expr_end;
9227                   continue;
9228
9229                 case 'T': /* Coprocessor register.  */
9230                   /* +T is for disassembly only; never match.  */
9231                   break;
9232
9233                 case 't': /* Coprocessor register number.  */
9234                   if (s[0] == '$' && ISDIGIT (s[1]))
9235                     {
9236                       ++s;
9237                       regno = 0;
9238                       do
9239                         {
9240                           regno *= 10;
9241                           regno += *s - '0';
9242                           ++s;
9243                         }
9244                       while (ISDIGIT (*s));
9245                       if (regno > 31)
9246                         as_bad (_("Invalid register number (%d)"), regno);
9247                       else
9248                         {
9249                           INSERT_OPERAND (RT, *ip, regno);
9250                           continue;
9251                         }
9252                     }
9253                   else
9254                     as_bad (_("Invalid coprocessor 0 register number"));
9255                   break;
9256
9257                 case 'x':
9258                   /* bbit[01] and bbit[01]32 bit index.  Give error if index
9259                      is not in the valid range.  */
9260                   my_getExpression (&imm_expr, s);
9261                   check_absolute_expr (ip, &imm_expr);
9262                   if ((unsigned) imm_expr.X_add_number > 31)
9263                     {
9264                       as_bad (_("Improper bit index (%lu)"),
9265                               (unsigned long) imm_expr.X_add_number);
9266                       imm_expr.X_add_number = 0;
9267                     }
9268                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number);
9269                   imm_expr.X_op = O_absent;
9270                   s = expr_end;
9271                   continue;
9272
9273                 case 'X':
9274                   /* bbit[01] bit index when bbit is used but we generate
9275                      bbit[01]32 because the index is over 32.  Move to the
9276                      next candidate if index is not in the valid range.  */
9277                   my_getExpression (&imm_expr, s);
9278                   check_absolute_expr (ip, &imm_expr);
9279                   if ((unsigned) imm_expr.X_add_number < 32
9280                       || (unsigned) imm_expr.X_add_number > 63)
9281                     break;
9282                   INSERT_OPERAND (BBITIND, *ip, imm_expr.X_add_number - 32);
9283                   imm_expr.X_op = O_absent;
9284                   s = expr_end;
9285                   continue;
9286
9287                 case 'p':
9288                   /* cins, cins32, exts and exts32 position field.  Give error
9289                      if it's not in the valid range.  */
9290                   my_getExpression (&imm_expr, s);
9291                   check_absolute_expr (ip, &imm_expr);
9292                   if ((unsigned) imm_expr.X_add_number > 31)
9293                     {
9294                       as_bad (_("Improper position (%lu)"),
9295                               (unsigned long) imm_expr.X_add_number);
9296                       imm_expr.X_add_number = 0;
9297                     }
9298                   /* Make the pos explicit to simplify +S.  */
9299                   lastpos = imm_expr.X_add_number + 32;
9300                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number);
9301                   imm_expr.X_op = O_absent;
9302                   s = expr_end;
9303                   continue;
9304
9305                 case 'P':
9306                   /* cins, cins32, exts and exts32 position field.  Move to
9307                      the next candidate if it's not in the valid range.  */
9308                   my_getExpression (&imm_expr, s);
9309                   check_absolute_expr (ip, &imm_expr);
9310                   if ((unsigned) imm_expr.X_add_number < 32
9311                       || (unsigned) imm_expr.X_add_number > 63)
9312                     break;
9313                   lastpos = imm_expr.X_add_number;
9314                   INSERT_OPERAND (CINSPOS, *ip, imm_expr.X_add_number - 32);
9315                   imm_expr.X_op = O_absent;
9316                   s = expr_end;
9317                   continue;
9318
9319                 case 's':
9320                   /* cins and exts length-minus-one field.  */
9321                   my_getExpression (&imm_expr, s);
9322                   check_absolute_expr (ip, &imm_expr);
9323                   if ((unsigned long) imm_expr.X_add_number > 31)
9324                     {
9325                       as_bad (_("Improper size (%lu)"),
9326                               (unsigned long) imm_expr.X_add_number);
9327                       imm_expr.X_add_number = 0;
9328                     }
9329                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9330                   imm_expr.X_op = O_absent;
9331                   s = expr_end;
9332                   continue;
9333
9334                 case 'S':
9335                   /* cins32/exts32 and cins/exts aliasing cint32/exts32
9336                      length-minus-one field.  */
9337                   my_getExpression (&imm_expr, s);
9338                   check_absolute_expr (ip, &imm_expr);
9339                   if ((long) imm_expr.X_add_number < 0
9340                       || (unsigned long) imm_expr.X_add_number + lastpos > 63)
9341                     {
9342                       as_bad (_("Improper size (%lu)"),
9343                               (unsigned long) imm_expr.X_add_number);
9344                       imm_expr.X_add_number = 0;
9345                     }
9346                   INSERT_OPERAND (CINSLM1, *ip, imm_expr.X_add_number);
9347                   imm_expr.X_op = O_absent;
9348                   s = expr_end;
9349                   continue;
9350
9351                 case 'Q':
9352                   /* seqi/snei immediate field.  */
9353                   my_getExpression (&imm_expr, s);
9354                   check_absolute_expr (ip, &imm_expr);
9355                   if ((long) imm_expr.X_add_number < -512
9356                       || (long) imm_expr.X_add_number >= 512)
9357                     {
9358                       as_bad (_("Improper immediate (%ld)"),
9359                                (long) imm_expr.X_add_number);
9360                       imm_expr.X_add_number = 0;
9361                     }
9362                   INSERT_OPERAND (SEQI, *ip, imm_expr.X_add_number);
9363                   imm_expr.X_op = O_absent;
9364                   s = expr_end;
9365                   continue;
9366
9367                 default:
9368                   as_bad (_("internal: bad mips opcode (unknown extension operand type `+%c'): %s %s"),
9369                     *args, insn->name, insn->args);
9370                   /* Further processing is fruitless.  */
9371                   return;
9372                 }
9373               break;
9374
9375             case '<':           /* must be at least one digit */
9376               /*
9377                * According to the manual, if the shift amount is greater
9378                * than 31 or less than 0, then the shift amount should be
9379                * mod 32.  In reality the mips assembler issues an error.
9380                * We issue a warning and mask out all but the low 5 bits.
9381                */
9382               my_getExpression (&imm_expr, s);
9383               check_absolute_expr (ip, &imm_expr);
9384               if ((unsigned long) imm_expr.X_add_number > 31)
9385                 as_warn (_("Improper shift amount (%lu)"),
9386                          (unsigned long) imm_expr.X_add_number);
9387               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9388               imm_expr.X_op = O_absent;
9389               s = expr_end;
9390               continue;
9391
9392             case '>':           /* shift amount minus 32 */
9393               my_getExpression (&imm_expr, s);
9394               check_absolute_expr (ip, &imm_expr);
9395               if ((unsigned long) imm_expr.X_add_number < 32
9396                   || (unsigned long) imm_expr.X_add_number > 63)
9397                 break;
9398               INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number - 32);
9399               imm_expr.X_op = O_absent;
9400               s = expr_end;
9401               continue;
9402
9403             case 'k':           /* cache code */
9404             case 'h':           /* prefx code */
9405             case '1':           /* sync type */
9406               my_getExpression (&imm_expr, s);
9407               check_absolute_expr (ip, &imm_expr);
9408               if ((unsigned long) imm_expr.X_add_number > 31)
9409                 as_warn (_("Invalid value for `%s' (%lu)"),
9410                          ip->insn_mo->name,
9411                          (unsigned long) imm_expr.X_add_number);
9412               if (*args == 'k')
9413                 {
9414                   if (mips_fix_cn63xxp1 && strcmp ("pref", insn->name) == 0)
9415                     switch (imm_expr.X_add_number)
9416                       {
9417                       case 5:
9418                       case 25:
9419                       case 26:
9420                       case 27:
9421                       case 28:
9422                       case 29:
9423                       case 30:
9424                       case 31:  /* These are ok.  */
9425                         break;
9426
9427                       default:  /* The rest must be changed to 28.  */
9428                         imm_expr.X_add_number = 28;
9429                         break;
9430                       }
9431                   INSERT_OPERAND (CACHE, *ip, imm_expr.X_add_number);
9432                 }
9433               else if (*args == 'h')
9434                 INSERT_OPERAND (PREFX, *ip, imm_expr.X_add_number);
9435               else
9436                 INSERT_OPERAND (SHAMT, *ip, imm_expr.X_add_number);
9437               imm_expr.X_op = O_absent;
9438               s = expr_end;
9439               continue;
9440
9441             case 'c':           /* break code */
9442               my_getExpression (&imm_expr, s);
9443               check_absolute_expr (ip, &imm_expr);
9444               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE)
9445                 as_warn (_("Code for %s not in range 0..1023 (%lu)"),
9446                          ip->insn_mo->name,
9447                          (unsigned long) imm_expr.X_add_number);
9448               INSERT_OPERAND (CODE, *ip, imm_expr.X_add_number);
9449               imm_expr.X_op = O_absent;
9450               s = expr_end;
9451               continue;
9452
9453             case 'q':           /* lower break code */
9454               my_getExpression (&imm_expr, s);
9455               check_absolute_expr (ip, &imm_expr);
9456               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE2)
9457                 as_warn (_("Lower code for %s not in range 0..1023 (%lu)"),
9458                          ip->insn_mo->name,
9459                          (unsigned long) imm_expr.X_add_number);
9460               INSERT_OPERAND (CODE2, *ip, imm_expr.X_add_number);
9461               imm_expr.X_op = O_absent;
9462               s = expr_end;
9463               continue;
9464
9465             case 'B':           /* 20-bit syscall/break code.  */
9466               my_getExpression (&imm_expr, s);
9467               check_absolute_expr (ip, &imm_expr);
9468               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE20)
9469                 as_warn (_("Code for %s not in range 0..1048575 (%lu)"),
9470                          ip->insn_mo->name,
9471                          (unsigned long) imm_expr.X_add_number);
9472               INSERT_OPERAND (CODE20, *ip, imm_expr.X_add_number);
9473               imm_expr.X_op = O_absent;
9474               s = expr_end;
9475               continue;
9476
9477             case 'C':           /* Coprocessor code */
9478               my_getExpression (&imm_expr, s);
9479               check_absolute_expr (ip, &imm_expr);
9480               if ((unsigned long) imm_expr.X_add_number > OP_MASK_COPZ)
9481                 {
9482                   as_warn (_("Coproccesor code > 25 bits (%lu)"),
9483                            (unsigned long) imm_expr.X_add_number);
9484                   imm_expr.X_add_number &= OP_MASK_COPZ;
9485                 }
9486               INSERT_OPERAND (COPZ, *ip, imm_expr.X_add_number);
9487               imm_expr.X_op = O_absent;
9488               s = expr_end;
9489               continue;
9490
9491             case 'J':           /* 19-bit wait code.  */
9492               my_getExpression (&imm_expr, s);
9493               check_absolute_expr (ip, &imm_expr);
9494               if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19)
9495                 {
9496                   as_warn (_("Illegal 19-bit code (%lu)"),
9497                            (unsigned long) imm_expr.X_add_number);
9498                   imm_expr.X_add_number &= OP_MASK_CODE19;
9499                 }
9500               INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number);
9501               imm_expr.X_op = O_absent;
9502               s = expr_end;
9503               continue;
9504
9505             case 'P':           /* Performance register.  */
9506               my_getExpression (&imm_expr, s);
9507               check_absolute_expr (ip, &imm_expr);
9508               if (imm_expr.X_add_number != 0 && imm_expr.X_add_number != 1)
9509                 as_warn (_("Invalid performance register (%lu)"),
9510                          (unsigned long) imm_expr.X_add_number);
9511               INSERT_OPERAND (PERFREG, *ip, imm_expr.X_add_number);
9512               imm_expr.X_op = O_absent;
9513               s = expr_end;
9514               continue;
9515
9516             case 'G':           /* Coprocessor destination register.  */
9517               if (((ip->insn_opcode >> OP_SH_OP) & OP_MASK_OP) == OP_OP_COP0)
9518                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
9519               else
9520                 ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9521               INSERT_OPERAND (RD, *ip, regno);
9522               if (ok) 
9523                 {
9524                   lastregno = regno;
9525                   continue;
9526                 }
9527               else
9528                 break;
9529
9530             case 'b':           /* base register */
9531             case 'd':           /* destination register */
9532             case 's':           /* source register */
9533             case 't':           /* target register */
9534             case 'r':           /* both target and source */
9535             case 'v':           /* both dest and source */
9536             case 'w':           /* both dest and target */
9537             case 'E':           /* coprocessor target register */
9538             case 'K':           /* 'rdhwr' destination register */
9539             case 'x':           /* ignore register name */
9540             case 'z':           /* must be zero register */
9541             case 'U':           /* destination register (clo/clz).  */
9542             case 'g':           /* coprocessor destination register */
9543               s_reset = s;            
9544               if (*args == 'E' || *args == 'K')
9545                 ok = reg_lookup (&s, RTYPE_NUM, &regno);
9546               else
9547                 {
9548                   ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno);
9549                   if (regno == AT && mips_opts.at)
9550                     {
9551                       if (mips_opts.at == ATREG)
9552                         as_warn (_("used $at without \".set noat\""));
9553                       else
9554                         as_warn (_("used $%u with \".set at=$%u\""),
9555                                  regno, mips_opts.at);
9556                     }
9557                 }
9558               if (ok)
9559                 {
9560                   c = *args;
9561                   if (*s == ' ')
9562                     ++s;
9563                   if (args[1] != *s)
9564                     {
9565                       if (c == 'r' || c == 'v' || c == 'w')
9566                         {
9567                           regno = lastregno;
9568                           s = s_reset;
9569                           ++args;
9570                         }
9571                     }
9572                   /* 'z' only matches $0.  */
9573                   if (c == 'z' && regno != 0)
9574                     break;
9575
9576                   if (c == 's' && !strncmp (ip->insn_mo->name, "jalr", 4))
9577                     {
9578                       if (regno == lastregno)
9579                         {
9580                           insn_error = _("source and destination must be different");
9581                           continue;
9582                         }
9583                       if (regno == 31 && lastregno == 0xffffffff)
9584                         {
9585                           insn_error = _("a destination register must be supplied");
9586                           continue;
9587                         }
9588                     }
9589         /* Now that we have assembled one operand, we use the args string
9590          * to figure out where it goes in the instruction.  */
9591                   switch (c)
9592                     {
9593                     case 'r':
9594                     case 's':
9595                     case 'v':
9596                     case 'b':
9597                       INSERT_OPERAND (RS, *ip, regno);
9598                       break;
9599                     case 'd':
9600                     case 'G':
9601                     case 'K':
9602                     case 'g':
9603                       INSERT_OPERAND (RD, *ip, regno);
9604                       break;
9605                     case 'U':
9606                       INSERT_OPERAND (RD, *ip, regno);
9607                       INSERT_OPERAND (RT, *ip, regno);
9608                       break;
9609                     case 'w':
9610                     case 't':
9611                     case 'E':
9612                       INSERT_OPERAND (RT, *ip, regno);
9613                       break;
9614                     case 'x':
9615                       /* This case exists because on the r3000 trunc
9616                          expands into a macro which requires a gp
9617                          register.  On the r6000 or r4000 it is
9618                          assembled into a single instruction which
9619                          ignores the register.  Thus the insn version
9620                          is MIPS_ISA2 and uses 'x', and the macro
9621                          version is MIPS_ISA1 and uses 't'.  */
9622                       break;
9623                     case 'z':
9624                       /* This case is for the div instruction, which
9625                          acts differently if the destination argument
9626                          is $0.  This only matches $0, and is checked
9627                          outside the switch.  */
9628                       break;
9629                     case 'D':
9630                       /* Itbl operand; not yet implemented. FIXME ?? */
9631                       break;
9632                       /* What about all other operands like 'i', which
9633                          can be specified in the opcode table? */
9634                     }
9635                   lastregno = regno;
9636                   continue;
9637                 }
9638               switch (*args++)
9639                 {
9640                 case 'r':
9641                 case 'v':
9642                   INSERT_OPERAND (RS, *ip, lastregno);
9643                   continue;
9644                 case 'w':
9645                   INSERT_OPERAND (RT, *ip, lastregno);
9646                   continue;
9647                 }
9648               break;
9649
9650             case 'O':           /* MDMX alignment immediate constant.  */
9651               my_getExpression (&imm_expr, s);
9652               check_absolute_expr (ip, &imm_expr);
9653               if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
9654                 as_warn (_("Improper align amount (%ld), using low bits"),
9655                          (long) imm_expr.X_add_number);
9656               INSERT_OPERAND (ALN, *ip, imm_expr.X_add_number);
9657               imm_expr.X_op = O_absent;
9658               s = expr_end;
9659               continue;
9660
9661             case 'Q':           /* MDMX vector, element sel, or const.  */
9662               if (s[0] != '$')
9663                 {
9664                   /* MDMX Immediate.  */
9665                   my_getExpression (&imm_expr, s);
9666                   check_absolute_expr (ip, &imm_expr);
9667                   if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
9668                     as_warn (_("Invalid MDMX Immediate (%ld)"),
9669                              (long) imm_expr.X_add_number);
9670                   INSERT_OPERAND (FT, *ip, imm_expr.X_add_number);
9671                   if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9672                     ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
9673                   else
9674                     ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
9675                   imm_expr.X_op = O_absent;
9676                   s = expr_end;
9677                   continue;
9678                 }
9679               /* Not MDMX Immediate.  Fall through.  */
9680             case 'X':           /* MDMX destination register.  */
9681             case 'Y':           /* MDMX source register.  */
9682             case 'Z':           /* MDMX target register.  */
9683               is_mdmx = 1;
9684             case 'D':           /* floating point destination register */
9685             case 'S':           /* floating point source register */
9686             case 'T':           /* floating point target register */
9687             case 'R':           /* floating point source register */
9688             case 'V':
9689             case 'W':
9690               rtype = RTYPE_FPU;
9691               if (is_mdmx
9692                   || (mips_opts.ase_mdmx
9693                       && (ip->insn_mo->pinfo & FP_D)
9694                       && (ip->insn_mo->pinfo & (INSN_COPROC_MOVE_DELAY
9695                                                 | INSN_COPROC_MEMORY_DELAY
9696                                                 | INSN_LOAD_COPROC_DELAY
9697                                                 | INSN_LOAD_MEMORY_DELAY
9698                                                 | INSN_STORE_MEMORY))))
9699                 rtype |= RTYPE_VEC;
9700               s_reset = s;
9701               if (reg_lookup (&s, rtype, &regno))
9702                 {
9703                   if ((regno & 1) != 0
9704                       && HAVE_32BIT_FPRS
9705                       && ! mips_oddfpreg_ok (ip->insn_mo, argnum))
9706                     as_warn (_("Float register should be even, was %d"),
9707                              regno);
9708
9709                   c = *args;
9710                   if (*s == ' ')
9711                     ++s;
9712                   if (args[1] != *s)
9713                     {
9714                       if (c == 'V' || c == 'W')
9715                         {
9716                           regno = lastregno;
9717                           s = s_reset;
9718                           ++args;
9719                         }
9720                     }
9721                   switch (c)
9722                     {
9723                     case 'D':
9724                     case 'X':
9725                       INSERT_OPERAND (FD, *ip, regno);
9726                       break;
9727                     case 'V':
9728                     case 'S':
9729                     case 'Y':
9730                       INSERT_OPERAND (FS, *ip, regno);
9731                       break;
9732                     case 'Q':
9733                       /* This is like 'Z', but also needs to fix the MDMX
9734                          vector/scalar select bits.  Note that the
9735                          scalar immediate case is handled above.  */
9736                       if (*s == '[')
9737                         {
9738                           int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
9739                           int max_el = (is_qh ? 3 : 7);
9740                           s++;
9741                           my_getExpression(&imm_expr, s);
9742                           check_absolute_expr (ip, &imm_expr);
9743                           s = expr_end;
9744                           if (imm_expr.X_add_number > max_el)
9745                             as_bad (_("Bad element selector %ld"),
9746                                     (long) imm_expr.X_add_number);
9747                           imm_expr.X_add_number &= max_el;
9748                           ip->insn_opcode |= (imm_expr.X_add_number
9749                                               << (OP_SH_VSEL +
9750                                                   (is_qh ? 2 : 1)));
9751                           imm_expr.X_op = O_absent;
9752                           if (*s != ']')
9753                             as_warn (_("Expecting ']' found '%s'"), s);
9754                           else
9755                             s++;
9756                         }
9757                       else
9758                         {
9759                           if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
9760                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
9761                                                 << OP_SH_VSEL);
9762                           else
9763                             ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
9764                                                 OP_SH_VSEL);
9765                         }
9766                       /* Fall through */
9767                     case 'W':
9768                     case 'T':
9769                     case 'Z':
9770                       INSERT_OPERAND (FT, *ip, regno);
9771                       break;
9772                     case 'R':
9773                       INSERT_OPERAND (FR, *ip, regno);
9774                       break;
9775                     }
9776                   lastregno = regno;
9777                   continue;
9778                 }
9779
9780               switch (*args++)
9781                 {
9782                 case 'V':
9783                   INSERT_OPERAND (FS, *ip, lastregno);
9784                   continue;
9785                 case 'W':
9786                   INSERT_OPERAND (FT, *ip, lastregno);
9787                   continue;
9788                 }
9789               break;
9790
9791             case 'I':
9792               my_getExpression (&imm_expr, s);
9793               if (imm_expr.X_op != O_big
9794                   && imm_expr.X_op != O_constant)
9795                 insn_error = _("absolute expression required");
9796               if (HAVE_32BIT_GPRS)
9797                 normalize_constant_expr (&imm_expr);
9798               s = expr_end;
9799               continue;
9800
9801             case 'A':
9802               my_getExpression (&offset_expr, s);
9803               normalize_address_expr (&offset_expr);
9804               *imm_reloc = BFD_RELOC_32;
9805               s = expr_end;
9806               continue;
9807
9808             case 'F':
9809             case 'L':
9810             case 'f':
9811             case 'l':
9812               {
9813                 int f64;
9814                 int using_gprs;
9815                 char *save_in;
9816                 char *err;
9817                 unsigned char temp[8];
9818                 int len;
9819                 unsigned int length;
9820                 segT seg;
9821                 subsegT subseg;
9822                 char *p;
9823
9824                 /* These only appear as the last operand in an
9825                    instruction, and every instruction that accepts
9826                    them in any variant accepts them in all variants.
9827                    This means we don't have to worry about backing out
9828                    any changes if the instruction does not match.
9829
9830                    The difference between them is the size of the
9831                    floating point constant and where it goes.  For 'F'
9832                    and 'L' the constant is 64 bits; for 'f' and 'l' it
9833                    is 32 bits.  Where the constant is placed is based
9834                    on how the MIPS assembler does things:
9835                     F -- .rdata
9836                     L -- .lit8
9837                     f -- immediate value
9838                     l -- .lit4
9839
9840                     The .lit4 and .lit8 sections are only used if
9841                     permitted by the -G argument.
9842
9843                     The code below needs to know whether the target register
9844                     is 32 or 64 bits wide.  It relies on the fact 'f' and
9845                     'F' are used with GPR-based instructions and 'l' and
9846                     'L' are used with FPR-based instructions.  */
9847
9848                 f64 = *args == 'F' || *args == 'L';
9849                 using_gprs = *args == 'F' || *args == 'f';
9850
9851                 save_in = input_line_pointer;
9852                 input_line_pointer = s;
9853                 err = md_atof (f64 ? 'd' : 'f', (char *) temp, &len);
9854                 length = len;
9855                 s = input_line_pointer;
9856                 input_line_pointer = save_in;
9857                 if (err != NULL && *err != '\0')
9858                   {
9859                     as_bad (_("Bad floating point constant: %s"), err);
9860                     memset (temp, '\0', sizeof temp);
9861                     length = f64 ? 8 : 4;
9862                   }
9863
9864                 gas_assert (length == (unsigned) (f64 ? 8 : 4));
9865
9866                 if (*args == 'f'
9867                     || (*args == 'l'
9868                         && (g_switch_value < 4
9869                             || (temp[0] == 0 && temp[1] == 0)
9870                             || (temp[2] == 0 && temp[3] == 0))))
9871                   {
9872                     imm_expr.X_op = O_constant;
9873                     if (! target_big_endian)
9874                       imm_expr.X_add_number = bfd_getl32 (temp);
9875                     else
9876                       imm_expr.X_add_number = bfd_getb32 (temp);
9877                   }
9878                 else if (length > 4
9879                          && ! mips_disable_float_construction
9880                          /* Constants can only be constructed in GPRs and
9881                             copied to FPRs if the GPRs are at least as wide
9882                             as the FPRs.  Force the constant into memory if
9883                             we are using 64-bit FPRs but the GPRs are only
9884                             32 bits wide.  */
9885                          && (using_gprs
9886                              || ! (HAVE_64BIT_FPRS && HAVE_32BIT_GPRS))
9887                          && ((temp[0] == 0 && temp[1] == 0)
9888                              || (temp[2] == 0 && temp[3] == 0))
9889                          && ((temp[4] == 0 && temp[5] == 0)
9890                              || (temp[6] == 0 && temp[7] == 0)))
9891                   {
9892                     /* The value is simple enough to load with a couple of
9893                        instructions.  If using 32-bit registers, set
9894                        imm_expr to the high order 32 bits and offset_expr to
9895                        the low order 32 bits.  Otherwise, set imm_expr to
9896                        the entire 64 bit constant.  */
9897                     if (using_gprs ? HAVE_32BIT_GPRS : HAVE_32BIT_FPRS)
9898                       {
9899                         imm_expr.X_op = O_constant;
9900                         offset_expr.X_op = O_constant;
9901                         if (! target_big_endian)
9902                           {
9903                             imm_expr.X_add_number = bfd_getl32 (temp + 4);
9904                             offset_expr.X_add_number = bfd_getl32 (temp);
9905                           }
9906                         else
9907                           {
9908                             imm_expr.X_add_number = bfd_getb32 (temp);
9909                             offset_expr.X_add_number = bfd_getb32 (temp + 4);
9910                           }
9911                         if (offset_expr.X_add_number == 0)
9912                           offset_expr.X_op = O_absent;
9913                       }
9914                     else if (sizeof (imm_expr.X_add_number) > 4)
9915                       {
9916                         imm_expr.X_op = O_constant;
9917                         if (! target_big_endian)
9918                           imm_expr.X_add_number = bfd_getl64 (temp);
9919                         else
9920                           imm_expr.X_add_number = bfd_getb64 (temp);
9921                       }
9922                     else
9923                       {
9924                         imm_expr.X_op = O_big;
9925                         imm_expr.X_add_number = 4;
9926                         if (! target_big_endian)
9927                           {
9928                             generic_bignum[0] = bfd_getl16 (temp);
9929                             generic_bignum[1] = bfd_getl16 (temp + 2);
9930                             generic_bignum[2] = bfd_getl16 (temp + 4);
9931                             generic_bignum[3] = bfd_getl16 (temp + 6);
9932                           }
9933                         else
9934                           {
9935                             generic_bignum[0] = bfd_getb16 (temp + 6);
9936                             generic_bignum[1] = bfd_getb16 (temp + 4);
9937                             generic_bignum[2] = bfd_getb16 (temp + 2);
9938                             generic_bignum[3] = bfd_getb16 (temp);
9939                           }
9940                       }
9941                   }
9942                 else
9943                   {
9944                     const char *newname;
9945                     segT new_seg;
9946
9947                     /* Switch to the right section.  */
9948                     seg = now_seg;
9949                     subseg = now_subseg;
9950                     switch (*args)
9951                       {
9952                       default: /* unused default case avoids warnings.  */
9953                       case 'L':
9954                         newname = RDATA_SECTION_NAME;
9955                         if (g_switch_value >= 8)
9956                           newname = ".lit8";
9957                         break;
9958                       case 'F':
9959                         newname = RDATA_SECTION_NAME;
9960                         break;
9961                       case 'l':
9962                         gas_assert (g_switch_value >= 4);
9963                         newname = ".lit4";
9964                         break;
9965                       }
9966                     new_seg = subseg_new (newname, (subsegT) 0);
9967                     if (IS_ELF)
9968                       bfd_set_section_flags (stdoutput, new_seg,
9969                                              (SEC_ALLOC
9970                                               | SEC_LOAD
9971                                               | SEC_READONLY
9972                                               | SEC_DATA));
9973                     frag_align (*args == 'l' ? 2 : 3, 0, 0);
9974                     if (IS_ELF && strncmp (TARGET_OS, "elf", 3) != 0)
9975                       record_alignment (new_seg, 4);
9976                     else
9977                       record_alignment (new_seg, *args == 'l' ? 2 : 3);
9978                     if (seg == now_seg)
9979                       as_bad (_("Can't use floating point insn in this section"));
9980
9981                     /* Set the argument to the current address in the
9982                        section.  */
9983                     offset_expr.X_op = O_symbol;
9984                     offset_expr.X_add_symbol = symbol_temp_new_now ();
9985                     offset_expr.X_add_number = 0;
9986
9987                     /* Put the floating point number into the section.  */
9988                     p = frag_more ((int) length);
9989                     memcpy (p, temp, length);
9990
9991                     /* Switch back to the original section.  */
9992                     subseg_set (seg, subseg);
9993                   }
9994               }
9995               continue;
9996
9997             case 'i':           /* 16 bit unsigned immediate */
9998             case 'j':           /* 16 bit signed immediate */
9999               *imm_reloc = BFD_RELOC_LO16;
10000               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0)
10001                 {
10002                   int more;
10003                   offsetT minval, maxval;
10004
10005                   more = (insn + 1 < &mips_opcodes[NUMOPCODES]
10006                           && strcmp (insn->name, insn[1].name) == 0);
10007
10008                   /* If the expression was written as an unsigned number,
10009                      only treat it as signed if there are no more
10010                      alternatives.  */
10011                   if (more
10012                       && *args == 'j'
10013                       && sizeof (imm_expr.X_add_number) <= 4
10014                       && imm_expr.X_op == O_constant
10015                       && imm_expr.X_add_number < 0
10016                       && imm_expr.X_unsigned
10017                       && HAVE_64BIT_GPRS)
10018                     break;
10019
10020                   /* For compatibility with older assemblers, we accept
10021                      0x8000-0xffff as signed 16-bit numbers when only
10022                      signed numbers are allowed.  */
10023                   if (*args == 'i')
10024                     minval = 0, maxval = 0xffff;
10025                   else if (more)
10026                     minval = -0x8000, maxval = 0x7fff;
10027                   else
10028                     minval = -0x8000, maxval = 0xffff;
10029
10030                   if (imm_expr.X_op != O_constant
10031                       || imm_expr.X_add_number < minval
10032                       || imm_expr.X_add_number > maxval)
10033                     {
10034                       if (more)
10035                         break;
10036                       if (imm_expr.X_op == O_constant
10037                           || imm_expr.X_op == O_big)
10038                         as_bad (_("expression out of range"));
10039                     }
10040                 }
10041               s = expr_end;
10042               continue;
10043
10044             case 'o':           /* 16 bit offset */
10045               /* Check whether there is only a single bracketed expression
10046                  left.  If so, it must be the base register and the
10047                  constant must be zero.  */
10048               if (*s == '(' && strchr (s + 1, '(') == 0)
10049                 {
10050                   offset_expr.X_op = O_constant;
10051                   offset_expr.X_add_number = 0;
10052                   continue;
10053                 }
10054
10055               /* If this value won't fit into a 16 bit offset, then go
10056                  find a macro that will generate the 32 bit offset
10057                  code pattern.  */
10058               if (my_getSmallExpression (&offset_expr, offset_reloc, s) == 0
10059                   && (offset_expr.X_op != O_constant
10060                       || offset_expr.X_add_number >= 0x8000
10061                       || offset_expr.X_add_number < -0x8000))
10062                 break;
10063
10064               s = expr_end;
10065               continue;
10066
10067             case 'p':           /* pc relative offset */
10068               *offset_reloc = BFD_RELOC_16_PCREL_S2;
10069               my_getExpression (&offset_expr, s);
10070               s = expr_end;
10071               continue;
10072
10073             case 'u':           /* upper 16 bits */
10074               if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0
10075                   && imm_expr.X_op == O_constant
10076                   && (imm_expr.X_add_number < 0
10077                       || imm_expr.X_add_number >= 0x10000))
10078                 as_bad (_("lui expression not in range 0..65535"));
10079               s = expr_end;
10080               continue;
10081
10082             case 'a':           /* 26 bit address */
10083               my_getExpression (&offset_expr, s);
10084               s = expr_end;
10085               *offset_reloc = BFD_RELOC_MIPS_JMP;
10086               continue;
10087
10088             case 'N':           /* 3 bit branch condition code */
10089             case 'M':           /* 3 bit compare condition code */
10090               rtype = RTYPE_CCC;
10091               if (ip->insn_mo->pinfo & (FP_D| FP_S))
10092                 rtype |= RTYPE_FCC;
10093               if (!reg_lookup (&s, rtype, &regno))
10094                 break;
10095               if ((strcmp(str + strlen(str) - 3, ".ps") == 0
10096                    || strcmp(str + strlen(str) - 5, "any2f") == 0
10097                    || strcmp(str + strlen(str) - 5, "any2t") == 0)
10098                   && (regno & 1) != 0)
10099                 as_warn (_("Condition code register should be even for %s, was %d"),
10100                          str, regno);
10101               if ((strcmp(str + strlen(str) - 5, "any4f") == 0
10102                    || strcmp(str + strlen(str) - 5, "any4t") == 0)
10103                   && (regno & 3) != 0)
10104                 as_warn (_("Condition code register should be 0 or 4 for %s, was %d"),
10105                          str, regno);
10106               if (*args == 'N')
10107                 INSERT_OPERAND (BCC, *ip, regno);
10108               else
10109                 INSERT_OPERAND (CCC, *ip, regno);
10110               continue;
10111
10112             case 'H':
10113               if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
10114                 s += 2;
10115               if (ISDIGIT (*s))
10116                 {
10117                   c = 0;
10118                   do
10119                     {
10120                       c *= 10;
10121                       c += *s - '0';
10122                       ++s;
10123                     }
10124                   while (ISDIGIT (*s));
10125                 }
10126               else
10127                 c = 8; /* Invalid sel value.  */
10128
10129               if (c > 7)
10130                 as_bad (_("invalid coprocessor sub-selection value (0-7)"));
10131               ip->insn_opcode |= c;
10132               continue;
10133
10134             case 'e':
10135               /* Must be at least one digit.  */
10136               my_getExpression (&imm_expr, s);
10137               check_absolute_expr (ip, &imm_expr);
10138
10139               if ((unsigned long) imm_expr.X_add_number
10140                   > (unsigned long) OP_MASK_VECBYTE)
10141                 {
10142                   as_bad (_("bad byte vector index (%ld)"),
10143                            (long) imm_expr.X_add_number);
10144                   imm_expr.X_add_number = 0;
10145                 }
10146
10147               INSERT_OPERAND (VECBYTE, *ip, imm_expr.X_add_number);
10148               imm_expr.X_op = O_absent;
10149               s = expr_end;
10150               continue;
10151
10152             case '%':
10153               my_getExpression (&imm_expr, s);
10154               check_absolute_expr (ip, &imm_expr);
10155
10156               if ((unsigned long) imm_expr.X_add_number
10157                   > (unsigned long) OP_MASK_VECALIGN)
10158                 {
10159                   as_bad (_("bad byte vector index (%ld)"),
10160                            (long) imm_expr.X_add_number);
10161                   imm_expr.X_add_number = 0;
10162                 }
10163
10164               INSERT_OPERAND (VECALIGN, *ip, imm_expr.X_add_number);
10165               imm_expr.X_op = O_absent;
10166               s = expr_end;
10167               continue;
10168
10169             default:
10170               as_bad (_("bad char = '%c'\n"), *args);
10171               internalError ();
10172             }
10173           break;
10174         }
10175       /* Args don't match.  */
10176       if (insn + 1 < &mips_opcodes[NUMOPCODES] &&
10177           !strcmp (insn->name, insn[1].name))
10178         {
10179           ++insn;
10180           s = argsStart;
10181           insn_error = _("illegal operands");
10182           continue;
10183         }
10184       if (save_c)
10185         *(--argsStart) = save_c;
10186       insn_error = _("illegal operands");
10187       return;
10188     }
10189 }
10190
10191 #define SKIP_SPACE_TABS(S) { while (*(S) == ' ' || *(S) == '\t') ++(S); }
10192
10193 /* This routine assembles an instruction into its binary format when
10194    assembling for the mips16.  As a side effect, it sets one of the
10195    global variables imm_reloc or offset_reloc to the type of
10196    relocation to do if one of the operands is an address expression.
10197    It also sets mips16_small and mips16_ext if the user explicitly
10198    requested a small or extended instruction.  */
10199
10200 static void
10201 mips16_ip (char *str, struct mips_cl_insn *ip)
10202 {
10203   char *s;
10204   const char *args;
10205   struct mips_opcode *insn;
10206   char *argsstart;
10207   unsigned int regno;
10208   unsigned int lastregno = 0;
10209   char *s_reset;
10210   size_t i;
10211
10212   insn_error = NULL;
10213
10214   mips16_small = FALSE;
10215   mips16_ext = FALSE;
10216
10217   for (s = str; ISLOWER (*s); ++s)
10218     ;
10219   switch (*s)
10220     {
10221     case '\0':
10222       break;
10223
10224     case ' ':
10225       *s++ = '\0';
10226       break;
10227
10228     case '.':
10229       if (s[1] == 't' && s[2] == ' ')
10230         {
10231           *s = '\0';
10232           mips16_small = TRUE;
10233           s += 3;
10234           break;
10235         }
10236       else if (s[1] == 'e' && s[2] == ' ')
10237         {
10238           *s = '\0';
10239           mips16_ext = TRUE;
10240           s += 3;
10241           break;
10242         }
10243       /* Fall through.  */
10244     default:
10245       insn_error = _("unknown opcode");
10246       return;
10247     }
10248
10249   if (mips_opts.noautoextend && ! mips16_ext)
10250     mips16_small = TRUE;
10251
10252   if ((insn = (struct mips_opcode *) hash_find (mips16_op_hash, str)) == NULL)
10253     {
10254       insn_error = _("unrecognized opcode");
10255       return;
10256     }
10257
10258   argsstart = s;
10259   for (;;)
10260     {
10261       bfd_boolean ok;
10262
10263       gas_assert (strcmp (insn->name, str) == 0);
10264
10265       ok = is_opcode_valid_16 (insn);
10266       if (! ok)
10267         {
10268           if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes]
10269               && strcmp (insn->name, insn[1].name) == 0)
10270             {
10271               ++insn;
10272               continue;
10273             }
10274           else
10275             {
10276               if (!insn_error)
10277                 {
10278                   static char buf[100];
10279                   sprintf (buf,
10280                            _("opcode not supported on this processor: %s (%s)"),
10281                            mips_cpu_info_from_arch (mips_opts.arch)->name,
10282                            mips_cpu_info_from_isa (mips_opts.isa)->name);
10283                   insn_error = buf;
10284                 }
10285               return;
10286             }
10287         }
10288
10289       create_insn (ip, insn);
10290       imm_expr.X_op = O_absent;
10291       imm_reloc[0] = BFD_RELOC_UNUSED;
10292       imm_reloc[1] = BFD_RELOC_UNUSED;
10293       imm_reloc[2] = BFD_RELOC_UNUSED;
10294       imm2_expr.X_op = O_absent;
10295       offset_expr.X_op = O_absent;
10296       offset_reloc[0] = BFD_RELOC_UNUSED;
10297       offset_reloc[1] = BFD_RELOC_UNUSED;
10298       offset_reloc[2] = BFD_RELOC_UNUSED;
10299       for (args = insn->args; 1; ++args)
10300         {
10301           int c;
10302
10303           if (*s == ' ')
10304             ++s;
10305
10306           /* In this switch statement we call break if we did not find
10307              a match, continue if we did find a match, or return if we
10308              are done.  */
10309
10310           c = *args;
10311           switch (c)
10312             {
10313             case '\0':
10314               if (*s == '\0')
10315                 {
10316                   /* Stuff the immediate value in now, if we can.  */
10317                   if (imm_expr.X_op == O_constant
10318                       && *imm_reloc > BFD_RELOC_UNUSED
10319                       && *imm_reloc != BFD_RELOC_MIPS16_GOT16
10320                       && *imm_reloc != BFD_RELOC_MIPS16_CALL16
10321                       && insn->pinfo != INSN_MACRO)
10322                     {
10323                       valueT tmp;
10324
10325                       switch (*offset_reloc)
10326                         {
10327                           case BFD_RELOC_MIPS16_HI16_S:
10328                             tmp = (imm_expr.X_add_number + 0x8000) >> 16;
10329                             break;
10330
10331                           case BFD_RELOC_MIPS16_HI16:
10332                             tmp = imm_expr.X_add_number >> 16;
10333                             break;
10334
10335                           case BFD_RELOC_MIPS16_LO16:
10336                             tmp = ((imm_expr.X_add_number + 0x8000) & 0xffff)
10337                                   - 0x8000;
10338                             break;
10339
10340                           case BFD_RELOC_UNUSED:
10341                             tmp = imm_expr.X_add_number;
10342                             break;
10343
10344                           default:
10345                             internalError ();
10346                         }
10347                       *offset_reloc = BFD_RELOC_UNUSED;
10348
10349                       mips16_immed (NULL, 0, *imm_reloc - BFD_RELOC_UNUSED,
10350                                     tmp, TRUE, mips16_small,
10351                                     mips16_ext, &ip->insn_opcode,
10352                                     &ip->use_extend, &ip->extend);
10353                       imm_expr.X_op = O_absent;
10354                       *imm_reloc = BFD_RELOC_UNUSED;
10355                     }
10356
10357                   return;
10358                 }
10359               break;
10360
10361             case ',':
10362               if (*s++ == c)
10363                 continue;
10364               s--;
10365               switch (*++args)
10366                 {
10367                 case 'v':
10368                   MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10369                   continue;
10370                 case 'w':
10371                   MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10372                   continue;
10373                 }
10374               break;
10375
10376             case '(':
10377             case ')':
10378               if (*s++ == c)
10379                 continue;
10380               break;
10381
10382             case 'v':
10383             case 'w':
10384               if (s[0] != '$')
10385                 {
10386                   if (c == 'v')
10387                     MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10388                   else
10389                     MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10390                   ++args;
10391                   continue;
10392                 }
10393               /* Fall through.  */
10394             case 'x':
10395             case 'y':
10396             case 'z':
10397             case 'Z':
10398             case '0':
10399             case 'S':
10400             case 'R':
10401             case 'X':
10402             case 'Y':
10403               s_reset = s;
10404               if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &regno))
10405                 {
10406                   if (c == 'v' || c == 'w')
10407                     {
10408                       if (c == 'v')
10409                         MIPS16_INSERT_OPERAND (RX, *ip, lastregno);
10410                       else
10411                         MIPS16_INSERT_OPERAND (RY, *ip, lastregno);
10412                       ++args;
10413                       continue;
10414                     }
10415                   break;
10416                 }
10417
10418               if (*s == ' ')
10419                 ++s;
10420               if (args[1] != *s)
10421                 {
10422                   if (c == 'v' || c == 'w')
10423                     {
10424                       regno = mips16_to_32_reg_map[lastregno];
10425                       s = s_reset;
10426                       ++args;
10427                     }
10428                 }
10429
10430               switch (c)
10431                 {
10432                 case 'x':
10433                 case 'y':
10434                 case 'z':
10435                 case 'v':
10436                 case 'w':
10437                 case 'Z':
10438                   regno = mips32_to_16_reg_map[regno];
10439                   break;
10440
10441                 case '0':
10442                   if (regno != 0)
10443                     regno = ILLEGAL_REG;
10444                   break;
10445
10446                 case 'S':
10447                   if (regno != SP)
10448                     regno = ILLEGAL_REG;
10449                   break;
10450
10451                 case 'R':
10452                   if (regno != RA)
10453                     regno = ILLEGAL_REG;
10454                   break;
10455
10456                 case 'X':
10457                 case 'Y':
10458                   if (regno == AT && mips_opts.at)
10459                     {
10460                       if (mips_opts.at == ATREG)
10461                         as_warn (_("used $at without \".set noat\""));
10462                       else
10463                         as_warn (_("used $%u with \".set at=$%u\""),
10464                                  regno, mips_opts.at);
10465                     }
10466                   break;
10467
10468                 default:
10469                   internalError ();
10470                 }
10471
10472               if (regno == ILLEGAL_REG)
10473                 break;
10474
10475               switch (c)
10476                 {
10477                 case 'x':
10478                 case 'v':
10479                   MIPS16_INSERT_OPERAND (RX, *ip, regno);
10480                   break;
10481                 case 'y':
10482                 case 'w':
10483                   MIPS16_INSERT_OPERAND (RY, *ip, regno);
10484                   break;
10485                 case 'z':
10486                   MIPS16_INSERT_OPERAND (RZ, *ip, regno);
10487                   break;
10488                 case 'Z':
10489                   MIPS16_INSERT_OPERAND (MOVE32Z, *ip, regno);
10490                 case '0':
10491                 case 'S':
10492                 case 'R':
10493                   break;
10494                 case 'X':
10495                   MIPS16_INSERT_OPERAND (REGR32, *ip, regno);
10496                   break;
10497                 case 'Y':
10498                   regno = ((regno & 7) << 2) | ((regno & 0x18) >> 3);
10499                   MIPS16_INSERT_OPERAND (REG32R, *ip, regno);
10500                   break;
10501                 default:
10502                   internalError ();
10503                 }
10504
10505               lastregno = regno;
10506               continue;
10507
10508             case 'P':
10509               if (strncmp (s, "$pc", 3) == 0)
10510                 {
10511                   s += 3;
10512                   continue;
10513                 }
10514               break;
10515
10516             case '5':
10517             case 'H':
10518             case 'W':
10519             case 'D':
10520             case 'j':
10521             case 'V':
10522             case 'C':
10523             case 'U':
10524             case 'k':
10525             case 'K':
10526               i = my_getSmallExpression (&imm_expr, imm_reloc, s);
10527               if (i > 0)
10528                 {
10529                   if (imm_expr.X_op != O_constant)
10530                     {
10531                       mips16_ext = TRUE;
10532                       ip->use_extend = TRUE;
10533                       ip->extend = 0;
10534                     }
10535                   else
10536                     {
10537                       /* We need to relax this instruction.  */
10538                       *offset_reloc = *imm_reloc;
10539                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10540                     }
10541                   s = expr_end;
10542                   continue;
10543                 }
10544               *imm_reloc = BFD_RELOC_UNUSED;
10545               /* Fall through.  */
10546             case '<':
10547             case '>':
10548             case '[':
10549             case ']':
10550             case '4':
10551             case '8':
10552               my_getExpression (&imm_expr, s);
10553               if (imm_expr.X_op == O_register)
10554                 {
10555                   /* What we thought was an expression turned out to
10556                      be a register.  */
10557
10558                   if (s[0] == '(' && args[1] == '(')
10559                     {
10560                       /* It looks like the expression was omitted
10561                          before a register indirection, which means
10562                          that the expression is implicitly zero.  We
10563                          still set up imm_expr, so that we handle
10564                          explicit extensions correctly.  */
10565                       imm_expr.X_op = O_constant;
10566                       imm_expr.X_add_number = 0;
10567                       *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10568                       continue;
10569                     }
10570
10571                   break;
10572                 }
10573
10574               /* We need to relax this instruction.  */
10575               *imm_reloc = (int) BFD_RELOC_UNUSED + c;
10576               s = expr_end;
10577               continue;
10578
10579             case 'p':
10580             case 'q':
10581             case 'A':
10582             case 'B':
10583             case 'E':
10584               /* We use offset_reloc rather than imm_reloc for the PC
10585                  relative operands.  This lets macros with both
10586                  immediate and address operands work correctly.  */
10587               my_getExpression (&offset_expr, s);
10588
10589               if (offset_expr.X_op == O_register)
10590                 break;
10591
10592               /* We need to relax this instruction.  */
10593               *offset_reloc = (int) BFD_RELOC_UNUSED + c;
10594               s = expr_end;
10595               continue;
10596
10597             case '6':           /* break code */
10598               my_getExpression (&imm_expr, s);
10599               check_absolute_expr (ip, &imm_expr);
10600               if ((unsigned long) imm_expr.X_add_number > 63)
10601                 as_warn (_("Invalid value for `%s' (%lu)"),
10602                          ip->insn_mo->name,
10603                          (unsigned long) imm_expr.X_add_number);
10604               MIPS16_INSERT_OPERAND (IMM6, *ip, imm_expr.X_add_number);
10605               imm_expr.X_op = O_absent;
10606               s = expr_end;
10607               continue;
10608
10609             case 'a':           /* 26 bit address */
10610               my_getExpression (&offset_expr, s);
10611               s = expr_end;
10612               *offset_reloc = BFD_RELOC_MIPS16_JMP;
10613               ip->insn_opcode <<= 16;
10614               continue;
10615
10616             case 'l':           /* register list for entry macro */
10617             case 'L':           /* register list for exit macro */
10618               {
10619                 int mask;
10620
10621                 if (c == 'l')
10622                   mask = 0;
10623                 else
10624                   mask = 7 << 3;
10625                 while (*s != '\0')
10626                   {
10627                     unsigned int freg, reg1, reg2;
10628
10629                     while (*s == ' ' || *s == ',')
10630                       ++s;
10631                     if (reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10632                       freg = 0;
10633                     else if (reg_lookup (&s, RTYPE_FPU, &reg1))
10634                       freg = 1;
10635                     else
10636                       {
10637                         as_bad (_("can't parse register list"));
10638                         break;
10639                       }
10640                     if (*s == ' ')
10641                       ++s;
10642                     if (*s != '-')
10643                       reg2 = reg1;
10644                     else
10645                       {
10646                         ++s;
10647                         if (!reg_lookup (&s, freg ? RTYPE_FPU 
10648                                          : (RTYPE_GP | RTYPE_NUM), &reg2))
10649                           {
10650                             as_bad (_("invalid register list"));
10651                             break;
10652                           }
10653                       }
10654                     if (freg && reg1 == 0 && reg2 == 0 && c == 'L')
10655                       {
10656                         mask &= ~ (7 << 3);
10657                         mask |= 5 << 3;
10658                       }
10659                     else if (freg && reg1 == 0 && reg2 == 1 && c == 'L')
10660                       {
10661                         mask &= ~ (7 << 3);
10662                         mask |= 6 << 3;
10663                       }
10664                     else if (reg1 == 4 && reg2 >= 4 && reg2 <= 7 && c != 'L')
10665                       mask |= (reg2 - 3) << 3;
10666                     else if (reg1 == 16 && reg2 >= 16 && reg2 <= 17)
10667                       mask |= (reg2 - 15) << 1;
10668                     else if (reg1 == RA && reg2 == RA)
10669                       mask |= 1;
10670                     else
10671                       {
10672                         as_bad (_("invalid register list"));
10673                         break;
10674                       }
10675                   }
10676                 /* The mask is filled in in the opcode table for the
10677                    benefit of the disassembler.  We remove it before
10678                    applying the actual mask.  */
10679                 ip->insn_opcode &= ~ ((7 << 3) << MIPS16OP_SH_IMM6);
10680                 ip->insn_opcode |= mask << MIPS16OP_SH_IMM6;
10681               }
10682             continue;
10683
10684             case 'm':           /* Register list for save insn.  */
10685             case 'M':           /* Register list for restore insn.  */
10686               {
10687                 int opcode = 0;
10688                 int framesz = 0, seen_framesz = 0;
10689                 int nargs = 0, statics = 0, sregs = 0;
10690
10691                 while (*s != '\0')
10692                   {
10693                     unsigned int reg1, reg2;
10694
10695                     SKIP_SPACE_TABS (s);
10696                     while (*s == ',')
10697                       ++s;
10698                     SKIP_SPACE_TABS (s);
10699
10700                     my_getExpression (&imm_expr, s);
10701                     if (imm_expr.X_op == O_constant)
10702                       {
10703                         /* Handle the frame size.  */
10704                         if (seen_framesz)
10705                           {
10706                             as_bad (_("more than one frame size in list"));
10707                             break;
10708                           }
10709                         seen_framesz = 1;
10710                         framesz = imm_expr.X_add_number;
10711                         imm_expr.X_op = O_absent;
10712                         s = expr_end;
10713                         continue;
10714                       }
10715
10716                     if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg1))
10717                       {
10718                         as_bad (_("can't parse register list"));
10719                         break;
10720                       }
10721
10722                     while (*s == ' ')
10723                       ++s;
10724
10725                     if (*s != '-')
10726                       reg2 = reg1;
10727                     else
10728                       {
10729                         ++s;
10730                         if (! reg_lookup (&s, RTYPE_GP | RTYPE_NUM, &reg2)
10731                             || reg2 < reg1)
10732                           {
10733                             as_bad (_("can't parse register list"));
10734                             break;
10735                           }
10736                       }
10737
10738                     while (reg1 <= reg2)
10739                       {
10740                         if (reg1 >= 4 && reg1 <= 7)
10741                           {
10742                             if (!seen_framesz)
10743                                 /* args $a0-$a3 */
10744                                 nargs |= 1 << (reg1 - 4);
10745                             else
10746                                 /* statics $a0-$a3 */
10747                                 statics |= 1 << (reg1 - 4);
10748                           }
10749                         else if ((reg1 >= 16 && reg1 <= 23) || reg1 == 30)
10750                           {
10751                             /* $s0-$s8 */
10752                             sregs |= 1 << ((reg1 == 30) ? 8 : (reg1 - 16));
10753                           }
10754                         else if (reg1 == 31)
10755                           {
10756                             /* Add $ra to insn.  */
10757                             opcode |= 0x40;
10758                           }
10759                         else
10760                           {
10761                             as_bad (_("unexpected register in list"));
10762                             break;
10763                           }
10764                         if (++reg1 == 24)
10765                           reg1 = 30;
10766                       }
10767                   }
10768
10769                 /* Encode args/statics combination.  */
10770                 if (nargs & statics)
10771                   as_bad (_("arg/static registers overlap"));
10772                 else if (nargs == 0xf)
10773                   /* All $a0-$a3 are args.  */
10774                   opcode |= MIPS16_ALL_ARGS << 16;
10775                 else if (statics == 0xf)
10776                   /* All $a0-$a3 are statics.  */
10777                   opcode |= MIPS16_ALL_STATICS << 16;
10778                 else 
10779                   {
10780                     int narg = 0, nstat = 0;
10781
10782                     /* Count arg registers.  */
10783                     while (nargs & 0x1)
10784                       {
10785                         nargs >>= 1;
10786                         narg++;
10787                       }
10788                     if (nargs != 0)
10789                       as_bad (_("invalid arg register list"));
10790
10791                     /* Count static registers.  */
10792                     while (statics & 0x8)
10793                       {
10794                         statics = (statics << 1) & 0xf;
10795                         nstat++;
10796                       }
10797                     if (statics != 0) 
10798                       as_bad (_("invalid static register list"));
10799
10800                     /* Encode args/statics.  */
10801                     opcode |= ((narg << 2) | nstat) << 16;
10802                   }
10803
10804                 /* Encode $s0/$s1.  */
10805                 if (sregs & (1 << 0))           /* $s0 */
10806                   opcode |= 0x20;
10807                 if (sregs & (1 << 1))           /* $s1 */
10808                   opcode |= 0x10;
10809                 sregs >>= 2;
10810
10811                 if (sregs != 0)
10812                   {
10813                     /* Count regs $s2-$s8.  */
10814                     int nsreg = 0;
10815                     while (sregs & 1)
10816                       {
10817                         sregs >>= 1;
10818                         nsreg++;
10819                       }
10820                     if (sregs != 0)
10821                       as_bad (_("invalid static register list"));
10822                     /* Encode $s2-$s8. */
10823                     opcode |= nsreg << 24;
10824                   }
10825
10826                 /* Encode frame size.  */
10827                 if (!seen_framesz)
10828                   as_bad (_("missing frame size"));
10829                 else if ((framesz & 7) != 0 || framesz < 0
10830                          || framesz > 0xff * 8)
10831                   as_bad (_("invalid frame size"));
10832                 else if (framesz != 128 || (opcode >> 16) != 0)
10833                   {
10834                     framesz /= 8;
10835                     opcode |= (((framesz & 0xf0) << 16)
10836                              | (framesz & 0x0f));
10837                   }
10838
10839                 /* Finally build the instruction.  */
10840                 if ((opcode >> 16) != 0 || framesz == 0)
10841                   {
10842                     ip->use_extend = TRUE;
10843                     ip->extend = opcode >> 16;
10844                   }
10845                 ip->insn_opcode |= opcode & 0x7f;
10846               }
10847             continue;
10848
10849             case 'e':           /* extend code */
10850               my_getExpression (&imm_expr, s);
10851               check_absolute_expr (ip, &imm_expr);
10852               if ((unsigned long) imm_expr.X_add_number > 0x7ff)
10853                 {
10854                   as_warn (_("Invalid value for `%s' (%lu)"),
10855                            ip->insn_mo->name,
10856                            (unsigned long) imm_expr.X_add_number);
10857                   imm_expr.X_add_number &= 0x7ff;
10858                 }
10859               ip->insn_opcode |= imm_expr.X_add_number;
10860               imm_expr.X_op = O_absent;
10861               s = expr_end;
10862               continue;
10863
10864             default:
10865               internalError ();
10866             }
10867           break;
10868         }
10869
10870       /* Args don't match.  */
10871       if (insn + 1 < &mips16_opcodes[bfd_mips16_num_opcodes] &&
10872           strcmp (insn->name, insn[1].name) == 0)
10873         {
10874           ++insn;
10875           s = argsstart;
10876           continue;
10877         }
10878
10879       insn_error = _("illegal operands");
10880
10881       return;
10882     }
10883 }
10884
10885 /* This structure holds information we know about a mips16 immediate
10886    argument type.  */
10887
10888 struct mips16_immed_operand
10889 {
10890   /* The type code used in the argument string in the opcode table.  */
10891   int type;
10892   /* The number of bits in the short form of the opcode.  */
10893   int nbits;
10894   /* The number of bits in the extended form of the opcode.  */
10895   int extbits;
10896   /* The amount by which the short form is shifted when it is used;
10897      for example, the sw instruction has a shift count of 2.  */
10898   int shift;
10899   /* The amount by which the short form is shifted when it is stored
10900      into the instruction code.  */
10901   int op_shift;
10902   /* Non-zero if the short form is unsigned.  */
10903   int unsp;
10904   /* Non-zero if the extended form is unsigned.  */
10905   int extu;
10906   /* Non-zero if the value is PC relative.  */
10907   int pcrel;
10908 };
10909
10910 /* The mips16 immediate operand types.  */
10911
10912 static const struct mips16_immed_operand mips16_immed_operands[] =
10913 {
10914   { '<',  3,  5, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10915   { '>',  3,  5, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10916   { '[',  3,  6, 0, MIPS16OP_SH_RZ,   1, 1, 0 },
10917   { ']',  3,  6, 0, MIPS16OP_SH_RX,   1, 1, 0 },
10918   { '4',  4, 15, 0, MIPS16OP_SH_IMM4, 0, 0, 0 },
10919   { '5',  5, 16, 0, MIPS16OP_SH_IMM5, 1, 0, 0 },
10920   { 'H',  5, 16, 1, MIPS16OP_SH_IMM5, 1, 0, 0 },
10921   { 'W',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 0 },
10922   { 'D',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 0 },
10923   { 'j',  5, 16, 0, MIPS16OP_SH_IMM5, 0, 0, 0 },
10924   { '8',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 0, 0 },
10925   { 'V',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 0 },
10926   { 'C',  8, 16, 3, MIPS16OP_SH_IMM8, 1, 0, 0 },
10927   { 'U',  8, 16, 0, MIPS16OP_SH_IMM8, 1, 1, 0 },
10928   { 'k',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 0 },
10929   { 'K',  8, 16, 3, MIPS16OP_SH_IMM8, 0, 0, 0 },
10930   { 'p',  8, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10931   { 'q', 11, 16, 0, MIPS16OP_SH_IMM8, 0, 0, 1 },
10932   { 'A',  8, 16, 2, MIPS16OP_SH_IMM8, 1, 0, 1 },
10933   { 'B',  5, 16, 3, MIPS16OP_SH_IMM5, 1, 0, 1 },
10934   { 'E',  5, 16, 2, MIPS16OP_SH_IMM5, 1, 0, 1 }
10935 };
10936
10937 #define MIPS16_NUM_IMMED \
10938   (sizeof mips16_immed_operands / sizeof mips16_immed_operands[0])
10939
10940 /* Handle a mips16 instruction with an immediate value.  This or's the
10941    small immediate value into *INSN.  It sets *USE_EXTEND to indicate
10942    whether an extended value is needed; if one is needed, it sets
10943    *EXTEND to the value.  The argument type is TYPE.  The value is VAL.
10944    If SMALL is true, an unextended opcode was explicitly requested.
10945    If EXT is true, an extended opcode was explicitly requested.  If
10946    WARN is true, warn if EXT does not match reality.  */
10947
10948 static void
10949 mips16_immed (char *file, unsigned int line, int type, offsetT val,
10950               bfd_boolean warn, bfd_boolean small, bfd_boolean ext,
10951               unsigned long *insn, bfd_boolean *use_extend,
10952               unsigned short *extend)
10953 {
10954   const struct mips16_immed_operand *op;
10955   int mintiny, maxtiny;
10956   bfd_boolean needext;
10957
10958   op = mips16_immed_operands;
10959   while (op->type != type)
10960     {
10961       ++op;
10962       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
10963     }
10964
10965   if (op->unsp)
10966     {
10967       if (type == '<' || type == '>' || type == '[' || type == ']')
10968         {
10969           mintiny = 1;
10970           maxtiny = 1 << op->nbits;
10971         }
10972       else
10973         {
10974           mintiny = 0;
10975           maxtiny = (1 << op->nbits) - 1;
10976         }
10977     }
10978   else
10979     {
10980       mintiny = - (1 << (op->nbits - 1));
10981       maxtiny = (1 << (op->nbits - 1)) - 1;
10982     }
10983
10984   /* Branch offsets have an implicit 0 in the lowest bit.  */
10985   if (type == 'p' || type == 'q')
10986     val /= 2;
10987
10988   if ((val & ((1 << op->shift) - 1)) != 0
10989       || val < (mintiny << op->shift)
10990       || val > (maxtiny << op->shift))
10991     needext = TRUE;
10992   else
10993     needext = FALSE;
10994
10995   if (warn && ext && ! needext)
10996     as_warn_where (file, line,
10997                    _("extended operand requested but not required"));
10998   if (small && needext)
10999     as_bad_where (file, line, _("invalid unextended operand value"));
11000
11001   if (small || (! ext && ! needext))
11002     {
11003       int insnval;
11004
11005       *use_extend = FALSE;
11006       insnval = ((val >> op->shift) & ((1 << op->nbits) - 1));
11007       insnval <<= op->op_shift;
11008       *insn |= insnval;
11009     }
11010   else
11011     {
11012       long minext, maxext;
11013       int extval;
11014
11015       if (op->extu)
11016         {
11017           minext = 0;
11018           maxext = (1 << op->extbits) - 1;
11019         }
11020       else
11021         {
11022           minext = - (1 << (op->extbits - 1));
11023           maxext = (1 << (op->extbits - 1)) - 1;
11024         }
11025       if (val < minext || val > maxext)
11026         as_bad_where (file, line,
11027                       _("operand value out of range for instruction"));
11028
11029       *use_extend = TRUE;
11030       if (op->extbits == 16)
11031         {
11032           extval = ((val >> 11) & 0x1f) | (val & 0x7e0);
11033           val &= 0x1f;
11034         }
11035       else if (op->extbits == 15)
11036         {
11037           extval = ((val >> 11) & 0xf) | (val & 0x7f0);
11038           val &= 0xf;
11039         }
11040       else
11041         {
11042           extval = ((val & 0x1f) << 6) | (val & 0x20);
11043           val = 0;
11044         }
11045
11046       *extend = (unsigned short) extval;
11047       *insn |= val;
11048     }
11049 }
11050 \f
11051 struct percent_op_match
11052 {
11053   const char *str;
11054   bfd_reloc_code_real_type reloc;
11055 };
11056
11057 static const struct percent_op_match mips_percent_op[] =
11058 {
11059   {"%lo", BFD_RELOC_LO16},
11060 #ifdef OBJ_ELF
11061   {"%call_hi", BFD_RELOC_MIPS_CALL_HI16},
11062   {"%call_lo", BFD_RELOC_MIPS_CALL_LO16},
11063   {"%call16", BFD_RELOC_MIPS_CALL16},
11064   {"%got_disp", BFD_RELOC_MIPS_GOT_DISP},
11065   {"%got_page", BFD_RELOC_MIPS_GOT_PAGE},
11066   {"%got_ofst", BFD_RELOC_MIPS_GOT_OFST},
11067   {"%got_hi", BFD_RELOC_MIPS_GOT_HI16},
11068   {"%got_lo", BFD_RELOC_MIPS_GOT_LO16},
11069   {"%got", BFD_RELOC_MIPS_GOT16},
11070   {"%gp_rel", BFD_RELOC_GPREL16},
11071   {"%half", BFD_RELOC_16},
11072   {"%highest", BFD_RELOC_MIPS_HIGHEST},
11073   {"%higher", BFD_RELOC_MIPS_HIGHER},
11074   {"%neg", BFD_RELOC_MIPS_SUB},
11075   {"%tlsgd", BFD_RELOC_MIPS_TLS_GD},
11076   {"%tlsldm", BFD_RELOC_MIPS_TLS_LDM},
11077   {"%dtprel_hi", BFD_RELOC_MIPS_TLS_DTPREL_HI16},
11078   {"%dtprel_lo", BFD_RELOC_MIPS_TLS_DTPREL_LO16},
11079   {"%tprel_hi", BFD_RELOC_MIPS_TLS_TPREL_HI16},
11080   {"%tprel_lo", BFD_RELOC_MIPS_TLS_TPREL_LO16},
11081   {"%gottprel", BFD_RELOC_MIPS_TLS_GOTTPREL},
11082 #endif
11083   {"%hi", BFD_RELOC_HI16_S}
11084 };
11085
11086 static const struct percent_op_match mips16_percent_op[] =
11087 {
11088   {"%lo", BFD_RELOC_MIPS16_LO16},
11089   {"%gprel", BFD_RELOC_MIPS16_GPREL},
11090   {"%got", BFD_RELOC_MIPS16_GOT16},
11091   {"%call16", BFD_RELOC_MIPS16_CALL16},
11092   {"%hi", BFD_RELOC_MIPS16_HI16_S}
11093 };
11094
11095
11096 /* Return true if *STR points to a relocation operator.  When returning true,
11097    move *STR over the operator and store its relocation code in *RELOC.
11098    Leave both *STR and *RELOC alone when returning false.  */
11099
11100 static bfd_boolean
11101 parse_relocation (char **str, bfd_reloc_code_real_type *reloc)
11102 {
11103   const struct percent_op_match *percent_op;
11104   size_t limit, i;
11105
11106   if (mips_opts.mips16)
11107     {
11108       percent_op = mips16_percent_op;
11109       limit = ARRAY_SIZE (mips16_percent_op);
11110     }
11111   else
11112     {
11113       percent_op = mips_percent_op;
11114       limit = ARRAY_SIZE (mips_percent_op);
11115     }
11116
11117   for (i = 0; i < limit; i++)
11118     if (strncasecmp (*str, percent_op[i].str, strlen (percent_op[i].str)) == 0)
11119       {
11120         int len = strlen (percent_op[i].str);
11121
11122         if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
11123           continue;
11124
11125         *str += strlen (percent_op[i].str);
11126         *reloc = percent_op[i].reloc;
11127
11128         /* Check whether the output BFD supports this relocation.
11129            If not, issue an error and fall back on something safe.  */
11130         if (!bfd_reloc_type_lookup (stdoutput, percent_op[i].reloc))
11131           {
11132             as_bad (_("relocation %s isn't supported by the current ABI"),
11133                     percent_op[i].str);
11134             *reloc = BFD_RELOC_UNUSED;
11135           }
11136         return TRUE;
11137       }
11138   return FALSE;
11139 }
11140
11141
11142 /* Parse string STR as a 16-bit relocatable operand.  Store the
11143    expression in *EP and the relocations in the array starting
11144    at RELOC.  Return the number of relocation operators used.
11145
11146    On exit, EXPR_END points to the first character after the expression.  */
11147
11148 static size_t
11149 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
11150                        char *str)
11151 {
11152   bfd_reloc_code_real_type reversed_reloc[3];
11153   size_t reloc_index, i;
11154   int crux_depth, str_depth;
11155   char *crux;
11156
11157   /* Search for the start of the main expression, recoding relocations
11158      in REVERSED_RELOC.  End the loop with CRUX pointing to the start
11159      of the main expression and with CRUX_DEPTH containing the number
11160      of open brackets at that point.  */
11161   reloc_index = -1;
11162   str_depth = 0;
11163   do
11164     {
11165       reloc_index++;
11166       crux = str;
11167       crux_depth = str_depth;
11168
11169       /* Skip over whitespace and brackets, keeping count of the number
11170          of brackets.  */
11171       while (*str == ' ' || *str == '\t' || *str == '(')
11172         if (*str++ == '(')
11173           str_depth++;
11174     }
11175   while (*str == '%'
11176          && reloc_index < (HAVE_NEWABI ? 3 : 1)
11177          && parse_relocation (&str, &reversed_reloc[reloc_index]));
11178
11179   my_getExpression (ep, crux);
11180   str = expr_end;
11181
11182   /* Match every open bracket.  */
11183   while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
11184     if (*str++ == ')')
11185       crux_depth--;
11186
11187   if (crux_depth > 0)
11188     as_bad (_("unclosed '('"));
11189
11190   expr_end = str;
11191
11192   if (reloc_index != 0)
11193     {
11194       prev_reloc_op_frag = frag_now;
11195       for (i = 0; i < reloc_index; i++)
11196         reloc[i] = reversed_reloc[reloc_index - 1 - i];
11197     }
11198
11199   return reloc_index;
11200 }
11201
11202 static void
11203 my_getExpression (expressionS *ep, char *str)
11204 {
11205   char *save_in;
11206   valueT val;
11207
11208   save_in = input_line_pointer;
11209   input_line_pointer = str;
11210   expression (ep);
11211   expr_end = input_line_pointer;
11212   input_line_pointer = save_in;
11213
11214   /* If we are in mips16 mode, and this is an expression based on `.',
11215      then we bump the value of the symbol by 1 since that is how other
11216      text symbols are handled.  We don't bother to handle complex
11217      expressions, just `.' plus or minus a constant.  */
11218   if (mips_opts.mips16
11219       && ep->X_op == O_symbol
11220       && strcmp (S_GET_NAME (ep->X_add_symbol), FAKE_LABEL_NAME) == 0
11221       && S_GET_SEGMENT (ep->X_add_symbol) == now_seg
11222       && symbol_get_frag (ep->X_add_symbol) == frag_now
11223       && symbol_constant_p (ep->X_add_symbol)
11224       && (val = S_GET_VALUE (ep->X_add_symbol)) == frag_now_fix ())
11225     S_SET_VALUE (ep->X_add_symbol, val + 1);
11226 }
11227
11228 char *
11229 md_atof (int type, char *litP, int *sizeP)
11230 {
11231   return ieee_md_atof (type, litP, sizeP, target_big_endian);
11232 }
11233
11234 void
11235 md_number_to_chars (char *buf, valueT val, int n)
11236 {
11237   if (target_big_endian)
11238     number_to_chars_bigendian (buf, val, n);
11239   else
11240     number_to_chars_littleendian (buf, val, n);
11241 }
11242 \f
11243 #ifdef OBJ_ELF
11244 static int support_64bit_objects(void)
11245 {
11246   const char **list, **l;
11247   int yes;
11248
11249   list = bfd_target_list ();
11250   for (l = list; *l != NULL; l++)
11251 #ifdef TE_TMIPS
11252     /* This is traditional mips */
11253     if (strcmp (*l, "elf64-tradbigmips") == 0
11254         || strcmp (*l, "elf64-tradlittlemips") == 0)
11255 #else
11256     if (strcmp (*l, "elf64-bigmips") == 0
11257         || strcmp (*l, "elf64-littlemips") == 0)
11258 #endif
11259       break;
11260   yes = (*l != NULL);
11261   free (list);
11262   return yes;
11263 }
11264 #endif /* OBJ_ELF */
11265
11266 const char *md_shortopts = "O::g::G:";
11267
11268 enum options
11269   {
11270     OPTION_MARCH = OPTION_MD_BASE,
11271     OPTION_MTUNE,
11272     OPTION_MIPS1,
11273     OPTION_MIPS2,
11274     OPTION_MIPS3,
11275     OPTION_MIPS4,
11276     OPTION_MIPS5,
11277     OPTION_MIPS32,
11278     OPTION_MIPS64,
11279     OPTION_MIPS32R2,
11280     OPTION_MIPS64R2,
11281     OPTION_MIPS16,
11282     OPTION_NO_MIPS16,
11283     OPTION_MIPS3D,
11284     OPTION_NO_MIPS3D,
11285     OPTION_MDMX,
11286     OPTION_NO_MDMX,
11287     OPTION_DSP,
11288     OPTION_NO_DSP,
11289     OPTION_MT,
11290     OPTION_NO_MT,
11291     OPTION_SMARTMIPS,
11292     OPTION_NO_SMARTMIPS,
11293     OPTION_DSPR2,
11294     OPTION_NO_DSPR2,
11295     OPTION_COMPAT_ARCH_BASE,
11296     OPTION_M4650,
11297     OPTION_NO_M4650,
11298     OPTION_M4010,
11299     OPTION_NO_M4010,
11300     OPTION_M4100,
11301     OPTION_NO_M4100,
11302     OPTION_M3900,
11303     OPTION_NO_M3900,
11304     OPTION_M7000_HILO_FIX,
11305     OPTION_MNO_7000_HILO_FIX, 
11306     OPTION_FIX_24K,
11307     OPTION_NO_FIX_24K,
11308     OPTION_FIX_LOONGSON2F_JUMP,
11309     OPTION_NO_FIX_LOONGSON2F_JUMP,
11310     OPTION_FIX_LOONGSON2F_NOP,
11311     OPTION_NO_FIX_LOONGSON2F_NOP,
11312     OPTION_FIX_VR4120,
11313     OPTION_NO_FIX_VR4120,
11314     OPTION_FIX_VR4130,
11315     OPTION_NO_FIX_VR4130,
11316     OPTION_FIX_CN63XXP1,
11317     OPTION_NO_FIX_CN63XXP1,
11318     OPTION_TRAP,
11319     OPTION_BREAK,
11320     OPTION_EB,
11321     OPTION_EL,
11322     OPTION_FP32,
11323     OPTION_GP32,
11324     OPTION_CONSTRUCT_FLOATS,
11325     OPTION_NO_CONSTRUCT_FLOATS,
11326     OPTION_FP64,
11327     OPTION_GP64,
11328     OPTION_RELAX_BRANCH,
11329     OPTION_NO_RELAX_BRANCH,
11330     OPTION_MSHARED,
11331     OPTION_MNO_SHARED,
11332     OPTION_MSYM32,
11333     OPTION_MNO_SYM32,
11334     OPTION_SOFT_FLOAT,
11335     OPTION_HARD_FLOAT,
11336     OPTION_SINGLE_FLOAT,
11337     OPTION_DOUBLE_FLOAT,
11338     OPTION_32,
11339 #ifdef OBJ_ELF
11340     OPTION_CALL_SHARED,
11341     OPTION_CALL_NONPIC,
11342     OPTION_NON_SHARED,
11343     OPTION_XGOT,
11344     OPTION_MABI,
11345     OPTION_N32,
11346     OPTION_64,
11347     OPTION_MDEBUG,
11348     OPTION_NO_MDEBUG,
11349     OPTION_PDR,
11350     OPTION_NO_PDR,
11351     OPTION_MVXWORKS_PIC,
11352 #endif /* OBJ_ELF */
11353     OPTION_END_OF_ENUM    
11354   };
11355   
11356 struct option md_longopts[] =
11357 {
11358   /* Options which specify architecture.  */
11359   {"march", required_argument, NULL, OPTION_MARCH},
11360   {"mtune", required_argument, NULL, OPTION_MTUNE},
11361   {"mips0", no_argument, NULL, OPTION_MIPS1},
11362   {"mips1", no_argument, NULL, OPTION_MIPS1},
11363   {"mips2", no_argument, NULL, OPTION_MIPS2},
11364   {"mips3", no_argument, NULL, OPTION_MIPS3},
11365   {"mips4", no_argument, NULL, OPTION_MIPS4},
11366   {"mips5", no_argument, NULL, OPTION_MIPS5},
11367   {"mips32", no_argument, NULL, OPTION_MIPS32},
11368   {"mips64", no_argument, NULL, OPTION_MIPS64},
11369   {"mips32r2", no_argument, NULL, OPTION_MIPS32R2},
11370   {"mips64r2", no_argument, NULL, OPTION_MIPS64R2},
11371
11372   /* Options which specify Application Specific Extensions (ASEs).  */
11373   {"mips16", no_argument, NULL, OPTION_MIPS16},
11374   {"no-mips16", no_argument, NULL, OPTION_NO_MIPS16},
11375   {"mips3d", no_argument, NULL, OPTION_MIPS3D},
11376   {"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
11377   {"mdmx", no_argument, NULL, OPTION_MDMX},
11378   {"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
11379   {"mdsp", no_argument, NULL, OPTION_DSP},
11380   {"mno-dsp", no_argument, NULL, OPTION_NO_DSP},
11381   {"mmt", no_argument, NULL, OPTION_MT},
11382   {"mno-mt", no_argument, NULL, OPTION_NO_MT},
11383   {"msmartmips", no_argument, NULL, OPTION_SMARTMIPS},
11384   {"mno-smartmips", no_argument, NULL, OPTION_NO_SMARTMIPS},
11385   {"mdspr2", no_argument, NULL, OPTION_DSPR2},
11386   {"mno-dspr2", no_argument, NULL, OPTION_NO_DSPR2},
11387
11388   /* Old-style architecture options.  Don't add more of these.  */
11389   {"m4650", no_argument, NULL, OPTION_M4650},
11390   {"no-m4650", no_argument, NULL, OPTION_NO_M4650},
11391   {"m4010", no_argument, NULL, OPTION_M4010},
11392   {"no-m4010", no_argument, NULL, OPTION_NO_M4010},
11393   {"m4100", no_argument, NULL, OPTION_M4100},
11394   {"no-m4100", no_argument, NULL, OPTION_NO_M4100},
11395   {"m3900", no_argument, NULL, OPTION_M3900},
11396   {"no-m3900", no_argument, NULL, OPTION_NO_M3900},
11397
11398   /* Options which enable bug fixes.  */
11399   {"mfix7000", no_argument, NULL, OPTION_M7000_HILO_FIX},
11400   {"no-fix-7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11401   {"mno-fix7000", no_argument, NULL, OPTION_MNO_7000_HILO_FIX},
11402   {"mfix-loongson2f-jump", no_argument, NULL, OPTION_FIX_LOONGSON2F_JUMP},
11403   {"mno-fix-loongson2f-jump", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_JUMP},
11404   {"mfix-loongson2f-nop", no_argument, NULL, OPTION_FIX_LOONGSON2F_NOP},
11405   {"mno-fix-loongson2f-nop", no_argument, NULL, OPTION_NO_FIX_LOONGSON2F_NOP},
11406   {"mfix-vr4120",    no_argument, NULL, OPTION_FIX_VR4120},
11407   {"mno-fix-vr4120", no_argument, NULL, OPTION_NO_FIX_VR4120},
11408   {"mfix-vr4130",    no_argument, NULL, OPTION_FIX_VR4130},
11409   {"mno-fix-vr4130", no_argument, NULL, OPTION_NO_FIX_VR4130},
11410   {"mfix-24k",    no_argument, NULL, OPTION_FIX_24K},
11411   {"mno-fix-24k", no_argument, NULL, OPTION_NO_FIX_24K},
11412   {"mfix-cn63xxp1", no_argument, NULL, OPTION_FIX_CN63XXP1},
11413   {"mno-fix-cn63xxp1", no_argument, NULL, OPTION_NO_FIX_CN63XXP1},
11414
11415   /* Miscellaneous options.  */
11416   {"trap", no_argument, NULL, OPTION_TRAP},
11417   {"no-break", no_argument, NULL, OPTION_TRAP},
11418   {"break", no_argument, NULL, OPTION_BREAK},
11419   {"no-trap", no_argument, NULL, OPTION_BREAK},
11420   {"EB", no_argument, NULL, OPTION_EB},
11421   {"EL", no_argument, NULL, OPTION_EL},
11422   {"mfp32", no_argument, NULL, OPTION_FP32},
11423   {"mgp32", no_argument, NULL, OPTION_GP32},
11424   {"construct-floats", no_argument, NULL, OPTION_CONSTRUCT_FLOATS},
11425   {"no-construct-floats", no_argument, NULL, OPTION_NO_CONSTRUCT_FLOATS},
11426   {"mfp64", no_argument, NULL, OPTION_FP64},
11427   {"mgp64", no_argument, NULL, OPTION_GP64},
11428   {"relax-branch", no_argument, NULL, OPTION_RELAX_BRANCH},
11429   {"no-relax-branch", no_argument, NULL, OPTION_NO_RELAX_BRANCH},
11430   {"mshared", no_argument, NULL, OPTION_MSHARED},
11431   {"mno-shared", no_argument, NULL, OPTION_MNO_SHARED},
11432   {"msym32", no_argument, NULL, OPTION_MSYM32},
11433   {"mno-sym32", no_argument, NULL, OPTION_MNO_SYM32},
11434   {"msoft-float", no_argument, NULL, OPTION_SOFT_FLOAT},
11435   {"mhard-float", no_argument, NULL, OPTION_HARD_FLOAT},
11436   {"msingle-float", no_argument, NULL, OPTION_SINGLE_FLOAT},
11437   {"mdouble-float", no_argument, NULL, OPTION_DOUBLE_FLOAT},
11438
11439   /* Strictly speaking this next option is ELF specific,
11440      but we allow it for other ports as well in order to
11441      make testing easier.  */
11442   {"32",          no_argument, NULL, OPTION_32},
11443   
11444   /* ELF-specific options.  */
11445 #ifdef OBJ_ELF
11446   {"KPIC",        no_argument, NULL, OPTION_CALL_SHARED},
11447   {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
11448   {"call_nonpic", no_argument, NULL, OPTION_CALL_NONPIC},
11449   {"non_shared",  no_argument, NULL, OPTION_NON_SHARED},
11450   {"xgot",        no_argument, NULL, OPTION_XGOT},
11451   {"mabi", required_argument, NULL, OPTION_MABI},
11452   {"n32",         no_argument, NULL, OPTION_N32},
11453   {"64",          no_argument, NULL, OPTION_64},
11454   {"mdebug", no_argument, NULL, OPTION_MDEBUG},
11455   {"no-mdebug", no_argument, NULL, OPTION_NO_MDEBUG},
11456   {"mpdr", no_argument, NULL, OPTION_PDR},
11457   {"mno-pdr", no_argument, NULL, OPTION_NO_PDR},
11458   {"mvxworks-pic", no_argument, NULL, OPTION_MVXWORKS_PIC},
11459 #endif /* OBJ_ELF */
11460
11461   {NULL, no_argument, NULL, 0}
11462 };
11463 size_t md_longopts_size = sizeof (md_longopts);
11464
11465 /* Set STRING_PTR (either &mips_arch_string or &mips_tune_string) to
11466    NEW_VALUE.  Warn if another value was already specified.  Note:
11467    we have to defer parsing the -march and -mtune arguments in order
11468    to handle 'from-abi' correctly, since the ABI might be specified
11469    in a later argument.  */
11470
11471 static void
11472 mips_set_option_string (const char **string_ptr, const char *new_value)
11473 {
11474   if (*string_ptr != 0 && strcasecmp (*string_ptr, new_value) != 0)
11475     as_warn (_("A different %s was already specified, is now %s"),
11476              string_ptr == &mips_arch_string ? "-march" : "-mtune",
11477              new_value);
11478
11479   *string_ptr = new_value;
11480 }
11481
11482 int
11483 md_parse_option (int c, char *arg)
11484 {
11485   switch (c)
11486     {
11487     case OPTION_CONSTRUCT_FLOATS:
11488       mips_disable_float_construction = 0;
11489       break;
11490
11491     case OPTION_NO_CONSTRUCT_FLOATS:
11492       mips_disable_float_construction = 1;
11493       break;
11494
11495     case OPTION_TRAP:
11496       mips_trap = 1;
11497       break;
11498
11499     case OPTION_BREAK:
11500       mips_trap = 0;
11501       break;
11502
11503     case OPTION_EB:
11504       target_big_endian = 1;
11505       break;
11506
11507     case OPTION_EL:
11508       target_big_endian = 0;
11509       break;
11510
11511     case 'O':
11512       if (arg == NULL)
11513         mips_optimize = 1;
11514       else if (arg[0] == '0')
11515         mips_optimize = 0;
11516       else if (arg[0] == '1')
11517         mips_optimize = 1;
11518       else
11519         mips_optimize = 2;
11520       break;
11521
11522     case 'g':
11523       if (arg == NULL)
11524         mips_debug = 2;
11525       else
11526         mips_debug = atoi (arg);
11527       break;
11528
11529     case OPTION_MIPS1:
11530       file_mips_isa = ISA_MIPS1;
11531       break;
11532
11533     case OPTION_MIPS2:
11534       file_mips_isa = ISA_MIPS2;
11535       break;
11536
11537     case OPTION_MIPS3:
11538       file_mips_isa = ISA_MIPS3;
11539       break;
11540
11541     case OPTION_MIPS4:
11542       file_mips_isa = ISA_MIPS4;
11543       break;
11544
11545     case OPTION_MIPS5:
11546       file_mips_isa = ISA_MIPS5;
11547       break;
11548
11549     case OPTION_MIPS32:
11550       file_mips_isa = ISA_MIPS32;
11551       break;
11552
11553     case OPTION_MIPS32R2:
11554       file_mips_isa = ISA_MIPS32R2;
11555       break;
11556
11557     case OPTION_MIPS64R2:
11558       file_mips_isa = ISA_MIPS64R2;
11559       break;
11560
11561     case OPTION_MIPS64:
11562       file_mips_isa = ISA_MIPS64;
11563       break;
11564
11565     case OPTION_MTUNE:
11566       mips_set_option_string (&mips_tune_string, arg);
11567       break;
11568
11569     case OPTION_MARCH:
11570       mips_set_option_string (&mips_arch_string, arg);
11571       break;
11572
11573     case OPTION_M4650:
11574       mips_set_option_string (&mips_arch_string, "4650");
11575       mips_set_option_string (&mips_tune_string, "4650");
11576       break;
11577
11578     case OPTION_NO_M4650:
11579       break;
11580
11581     case OPTION_M4010:
11582       mips_set_option_string (&mips_arch_string, "4010");
11583       mips_set_option_string (&mips_tune_string, "4010");
11584       break;
11585
11586     case OPTION_NO_M4010:
11587       break;
11588
11589     case OPTION_M4100:
11590       mips_set_option_string (&mips_arch_string, "4100");
11591       mips_set_option_string (&mips_tune_string, "4100");
11592       break;
11593
11594     case OPTION_NO_M4100:
11595       break;
11596
11597     case OPTION_M3900:
11598       mips_set_option_string (&mips_arch_string, "3900");
11599       mips_set_option_string (&mips_tune_string, "3900");
11600       break;
11601
11602     case OPTION_NO_M3900:
11603       break;
11604
11605     case OPTION_MDMX:
11606       mips_opts.ase_mdmx = 1;
11607       break;
11608
11609     case OPTION_NO_MDMX:
11610       mips_opts.ase_mdmx = 0;
11611       break;
11612
11613     case OPTION_DSP:
11614       mips_opts.ase_dsp = 1;
11615       mips_opts.ase_dspr2 = 0;
11616       break;
11617
11618     case OPTION_NO_DSP:
11619       mips_opts.ase_dsp = 0;
11620       mips_opts.ase_dspr2 = 0;
11621       break;
11622
11623     case OPTION_DSPR2:
11624       mips_opts.ase_dspr2 = 1;
11625       mips_opts.ase_dsp = 1;
11626       break;
11627
11628     case OPTION_NO_DSPR2:
11629       mips_opts.ase_dspr2 = 0;
11630       mips_opts.ase_dsp = 0;
11631       break;
11632
11633     case OPTION_MT:
11634       mips_opts.ase_mt = 1;
11635       break;
11636
11637     case OPTION_NO_MT:
11638       mips_opts.ase_mt = 0;
11639       break;
11640
11641     case OPTION_MIPS16:
11642       mips_opts.mips16 = 1;
11643       mips_no_prev_insn ();
11644       break;
11645
11646     case OPTION_NO_MIPS16:
11647       mips_opts.mips16 = 0;
11648       mips_no_prev_insn ();
11649       break;
11650
11651     case OPTION_MIPS3D:
11652       mips_opts.ase_mips3d = 1;
11653       break;
11654
11655     case OPTION_NO_MIPS3D:
11656       mips_opts.ase_mips3d = 0;
11657       break;
11658
11659     case OPTION_SMARTMIPS:
11660       mips_opts.ase_smartmips = 1;
11661       break;
11662
11663     case OPTION_NO_SMARTMIPS:
11664       mips_opts.ase_smartmips = 0;
11665       break;
11666
11667     case OPTION_FIX_24K:
11668       mips_fix_24k = 1;
11669       break;
11670
11671     case OPTION_NO_FIX_24K:
11672       mips_fix_24k = 0;
11673       break;
11674
11675     case OPTION_FIX_LOONGSON2F_JUMP:
11676       mips_fix_loongson2f_jump = TRUE;
11677       break;
11678
11679     case OPTION_NO_FIX_LOONGSON2F_JUMP:
11680       mips_fix_loongson2f_jump = FALSE;
11681       break;
11682
11683     case OPTION_FIX_LOONGSON2F_NOP:
11684       mips_fix_loongson2f_nop = TRUE;
11685       break;
11686
11687     case OPTION_NO_FIX_LOONGSON2F_NOP:
11688       mips_fix_loongson2f_nop = FALSE;
11689       break;
11690
11691     case OPTION_FIX_VR4120:
11692       mips_fix_vr4120 = 1;
11693       break;
11694
11695     case OPTION_NO_FIX_VR4120:
11696       mips_fix_vr4120 = 0;
11697       break;
11698
11699     case OPTION_FIX_VR4130:
11700       mips_fix_vr4130 = 1;
11701       break;
11702
11703     case OPTION_NO_FIX_VR4130:
11704       mips_fix_vr4130 = 0;
11705       break;
11706
11707     case OPTION_FIX_CN63XXP1:
11708       mips_fix_cn63xxp1 = TRUE;
11709       break;
11710
11711     case OPTION_NO_FIX_CN63XXP1:
11712       mips_fix_cn63xxp1 = FALSE;
11713       break;
11714
11715     case OPTION_RELAX_BRANCH:
11716       mips_relax_branch = 1;
11717       break;
11718
11719     case OPTION_NO_RELAX_BRANCH:
11720       mips_relax_branch = 0;
11721       break;
11722
11723     case OPTION_MSHARED:
11724       mips_in_shared = TRUE;
11725       break;
11726
11727     case OPTION_MNO_SHARED:
11728       mips_in_shared = FALSE;
11729       break;
11730
11731     case OPTION_MSYM32:
11732       mips_opts.sym32 = TRUE;
11733       break;
11734
11735     case OPTION_MNO_SYM32:
11736       mips_opts.sym32 = FALSE;
11737       break;
11738
11739 #ifdef OBJ_ELF
11740       /* When generating ELF code, we permit -KPIC and -call_shared to
11741          select SVR4_PIC, and -non_shared to select no PIC.  This is
11742          intended to be compatible with Irix 5.  */
11743     case OPTION_CALL_SHARED:
11744       if (!IS_ELF)
11745         {
11746           as_bad (_("-call_shared is supported only for ELF format"));
11747           return 0;
11748         }
11749       mips_pic = SVR4_PIC;
11750       mips_abicalls = TRUE;
11751       break;
11752
11753     case OPTION_CALL_NONPIC:
11754       if (!IS_ELF)
11755         {
11756           as_bad (_("-call_nonpic is supported only for ELF format"));
11757           return 0;
11758         }
11759       mips_pic = NO_PIC;
11760       mips_abicalls = TRUE;
11761       break;
11762
11763     case OPTION_NON_SHARED:
11764       if (!IS_ELF)
11765         {
11766           as_bad (_("-non_shared is supported only for ELF format"));
11767           return 0;
11768         }
11769       mips_pic = NO_PIC;
11770       mips_abicalls = FALSE;
11771       break;
11772
11773       /* The -xgot option tells the assembler to use 32 bit offsets
11774          when accessing the got in SVR4_PIC mode.  It is for Irix
11775          compatibility.  */
11776     case OPTION_XGOT:
11777       mips_big_got = 1;
11778       break;
11779 #endif /* OBJ_ELF */
11780
11781     case 'G':
11782       g_switch_value = atoi (arg);
11783       g_switch_seen = 1;
11784       break;
11785
11786       /* The -32, -n32 and -64 options are shortcuts for -mabi=32, -mabi=n32
11787          and -mabi=64.  */
11788     case OPTION_32:
11789       if (IS_ELF)
11790         mips_abi = O32_ABI;
11791       /* We silently ignore -32 for non-ELF targets.  This greatly
11792          simplifies the construction of the MIPS GAS test cases.  */
11793       break;
11794
11795 #ifdef OBJ_ELF
11796     case OPTION_N32:
11797       if (!IS_ELF)
11798         {
11799           as_bad (_("-n32 is supported for ELF format only"));
11800           return 0;
11801         }
11802       mips_abi = N32_ABI;
11803       break;
11804
11805     case OPTION_64:
11806       if (!IS_ELF)
11807         {
11808           as_bad (_("-64 is supported for ELF format only"));
11809           return 0;
11810         }
11811       mips_abi = N64_ABI;
11812       if (!support_64bit_objects())
11813         as_fatal (_("No compiled in support for 64 bit object file format"));
11814       break;
11815 #endif /* OBJ_ELF */
11816
11817     case OPTION_GP32:
11818       file_mips_gp32 = 1;
11819       break;
11820
11821     case OPTION_GP64:
11822       file_mips_gp32 = 0;
11823       break;
11824
11825     case OPTION_FP32:
11826       file_mips_fp32 = 1;
11827       break;
11828
11829     case OPTION_FP64:
11830       file_mips_fp32 = 0;
11831       break;
11832
11833     case OPTION_SINGLE_FLOAT:
11834       file_mips_single_float = 1;
11835       break;
11836
11837     case OPTION_DOUBLE_FLOAT:
11838       file_mips_single_float = 0;
11839       break;
11840
11841     case OPTION_SOFT_FLOAT:
11842       file_mips_soft_float = 1;
11843       break;
11844
11845     case OPTION_HARD_FLOAT:
11846       file_mips_soft_float = 0;
11847       break;
11848
11849 #ifdef OBJ_ELF
11850     case OPTION_MABI:
11851       if (!IS_ELF)
11852         {
11853           as_bad (_("-mabi is supported for ELF format only"));
11854           return 0;
11855         }
11856       if (strcmp (arg, "32") == 0)
11857         mips_abi = O32_ABI;
11858       else if (strcmp (arg, "o64") == 0)
11859         mips_abi = O64_ABI;
11860       else if (strcmp (arg, "n32") == 0)
11861         mips_abi = N32_ABI;
11862       else if (strcmp (arg, "64") == 0)
11863         {
11864           mips_abi = N64_ABI;
11865           if (! support_64bit_objects())
11866             as_fatal (_("No compiled in support for 64 bit object file "
11867                         "format"));
11868         }
11869       else if (strcmp (arg, "eabi") == 0)
11870         mips_abi = EABI_ABI;
11871       else
11872         {
11873           as_fatal (_("invalid abi -mabi=%s"), arg);
11874           return 0;
11875         }
11876       break;
11877 #endif /* OBJ_ELF */
11878
11879     case OPTION_M7000_HILO_FIX:
11880       mips_7000_hilo_fix = TRUE;
11881       break;
11882
11883     case OPTION_MNO_7000_HILO_FIX:
11884       mips_7000_hilo_fix = FALSE;
11885       break;
11886
11887 #ifdef OBJ_ELF
11888     case OPTION_MDEBUG:
11889       mips_flag_mdebug = TRUE;
11890       break;
11891
11892     case OPTION_NO_MDEBUG:
11893       mips_flag_mdebug = FALSE;
11894       break;
11895
11896     case OPTION_PDR:
11897       mips_flag_pdr = TRUE;
11898       break;
11899
11900     case OPTION_NO_PDR:
11901       mips_flag_pdr = FALSE;
11902       break;
11903
11904     case OPTION_MVXWORKS_PIC:
11905       mips_pic = VXWORKS_PIC;
11906       break;
11907 #endif /* OBJ_ELF */
11908
11909     default:
11910       return 0;
11911     }
11912
11913     mips_fix_loongson2f = mips_fix_loongson2f_nop || mips_fix_loongson2f_jump;
11914
11915   return 1;
11916 }
11917 \f
11918 /* Set up globals to generate code for the ISA or processor
11919    described by INFO.  */
11920
11921 static void
11922 mips_set_architecture (const struct mips_cpu_info *info)
11923 {
11924   if (info != 0)
11925     {
11926       file_mips_arch = info->cpu;
11927       mips_opts.arch = info->cpu;
11928       mips_opts.isa = info->isa;
11929     }
11930 }
11931
11932
11933 /* Likewise for tuning.  */
11934
11935 static void
11936 mips_set_tune (const struct mips_cpu_info *info)
11937 {
11938   if (info != 0)
11939     mips_tune = info->cpu;
11940 }
11941
11942
11943 void
11944 mips_after_parse_args (void)
11945 {
11946   const struct mips_cpu_info *arch_info = 0;
11947   const struct mips_cpu_info *tune_info = 0;
11948
11949   /* GP relative stuff not working for PE */
11950   if (strncmp (TARGET_OS, "pe", 2) == 0)
11951     {
11952       if (g_switch_seen && g_switch_value != 0)
11953         as_bad (_("-G not supported in this configuration."));
11954       g_switch_value = 0;
11955     }
11956
11957   if (mips_abi == NO_ABI)
11958     mips_abi = MIPS_DEFAULT_ABI;
11959
11960   /* The following code determines the architecture and register size.
11961      Similar code was added to GCC 3.3 (see override_options() in
11962      config/mips/mips.c).  The GAS and GCC code should be kept in sync
11963      as much as possible.  */
11964
11965   if (mips_arch_string != 0)
11966     arch_info = mips_parse_cpu ("-march", mips_arch_string);
11967
11968   if (file_mips_isa != ISA_UNKNOWN)
11969     {
11970       /* Handle -mipsN.  At this point, file_mips_isa contains the
11971          ISA level specified by -mipsN, while arch_info->isa contains
11972          the -march selection (if any).  */
11973       if (arch_info != 0)
11974         {
11975           /* -march takes precedence over -mipsN, since it is more descriptive.
11976              There's no harm in specifying both as long as the ISA levels
11977              are the same.  */
11978           if (file_mips_isa != arch_info->isa)
11979             as_bad (_("-%s conflicts with the other architecture options, which imply -%s"),
11980                     mips_cpu_info_from_isa (file_mips_isa)->name,
11981                     mips_cpu_info_from_isa (arch_info->isa)->name);
11982         }
11983       else
11984         arch_info = mips_cpu_info_from_isa (file_mips_isa);
11985     }
11986
11987   if (arch_info == 0)
11988     arch_info = mips_parse_cpu ("default CPU", MIPS_CPU_STRING_DEFAULT);
11989
11990   if (ABI_NEEDS_64BIT_REGS (mips_abi) && !ISA_HAS_64BIT_REGS (arch_info->isa))
11991     as_bad (_("-march=%s is not compatible with the selected ABI"),
11992             arch_info->name);
11993
11994   mips_set_architecture (arch_info);
11995
11996   /* Optimize for file_mips_arch, unless -mtune selects a different processor.  */
11997   if (mips_tune_string != 0)
11998     tune_info = mips_parse_cpu ("-mtune", mips_tune_string);
11999
12000   if (tune_info == 0)
12001     mips_set_tune (arch_info);
12002   else
12003     mips_set_tune (tune_info);
12004
12005   if (file_mips_gp32 >= 0)
12006     {
12007       /* The user specified the size of the integer registers.  Make sure
12008          it agrees with the ABI and ISA.  */
12009       if (file_mips_gp32 == 0 && !ISA_HAS_64BIT_REGS (mips_opts.isa))
12010         as_bad (_("-mgp64 used with a 32-bit processor"));
12011       else if (file_mips_gp32 == 1 && ABI_NEEDS_64BIT_REGS (mips_abi))
12012         as_bad (_("-mgp32 used with a 64-bit ABI"));
12013       else if (file_mips_gp32 == 0 && ABI_NEEDS_32BIT_REGS (mips_abi))
12014         as_bad (_("-mgp64 used with a 32-bit ABI"));
12015     }
12016   else
12017     {
12018       /* Infer the integer register size from the ABI and processor.
12019          Restrict ourselves to 32-bit registers if that's all the
12020          processor has, or if the ABI cannot handle 64-bit registers.  */
12021       file_mips_gp32 = (ABI_NEEDS_32BIT_REGS (mips_abi)
12022                         || !ISA_HAS_64BIT_REGS (mips_opts.isa));
12023     }
12024
12025   switch (file_mips_fp32)
12026     {
12027     default:
12028     case -1:
12029       /* No user specified float register size.
12030          ??? GAS treats single-float processors as though they had 64-bit
12031          float registers (although it complains when double-precision
12032          instructions are used).  As things stand, saying they have 32-bit
12033          registers would lead to spurious "register must be even" messages.
12034          So here we assume float registers are never smaller than the
12035          integer ones.  */
12036       if (file_mips_gp32 == 0)
12037         /* 64-bit integer registers implies 64-bit float registers.  */
12038         file_mips_fp32 = 0;
12039       else if ((mips_opts.ase_mips3d > 0 || mips_opts.ase_mdmx > 0)
12040                && ISA_HAS_64BIT_FPRS (mips_opts.isa))
12041         /* -mips3d and -mdmx imply 64-bit float registers, if possible.  */
12042         file_mips_fp32 = 0;
12043       else
12044         /* 32-bit float registers.  */
12045         file_mips_fp32 = 1;
12046       break;
12047
12048     /* The user specified the size of the float registers.  Check if it
12049        agrees with the ABI and ISA.  */
12050     case 0:
12051       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
12052         as_bad (_("-mfp64 used with a 32-bit fpu"));
12053       else if (ABI_NEEDS_32BIT_REGS (mips_abi)
12054                && !ISA_HAS_MXHC1 (mips_opts.isa))
12055         as_warn (_("-mfp64 used with a 32-bit ABI"));
12056       break;
12057     case 1:
12058       if (ABI_NEEDS_64BIT_REGS (mips_abi))
12059         as_warn (_("-mfp32 used with a 64-bit ABI"));
12060       break;
12061     }
12062
12063   /* End of GCC-shared inference code.  */
12064
12065   /* This flag is set when we have a 64-bit capable CPU but use only
12066      32-bit wide registers.  Note that EABI does not use it.  */
12067   if (ISA_HAS_64BIT_REGS (mips_opts.isa)
12068       && ((mips_abi == NO_ABI && file_mips_gp32 == 1)
12069           || mips_abi == O32_ABI))
12070     mips_32bitmode = 1;
12071
12072   if (mips_opts.isa == ISA_MIPS1 && mips_trap)
12073     as_bad (_("trap exception not supported at ISA 1"));
12074
12075   /* If the selected architecture includes support for ASEs, enable
12076      generation of code for them.  */
12077   if (mips_opts.mips16 == -1)
12078     mips_opts.mips16 = (CPU_HAS_MIPS16 (file_mips_arch)) ? 1 : 0;
12079   if (mips_opts.ase_mips3d == -1)
12080     mips_opts.ase_mips3d = ((arch_info->flags & MIPS_CPU_ASE_MIPS3D)
12081                             && file_mips_fp32 == 0) ? 1 : 0;
12082   if (mips_opts.ase_mips3d && file_mips_fp32 == 1)
12083     as_bad (_("-mfp32 used with -mips3d"));
12084
12085   if (mips_opts.ase_mdmx == -1)
12086     mips_opts.ase_mdmx = ((arch_info->flags & MIPS_CPU_ASE_MDMX)
12087                           && file_mips_fp32 == 0) ? 1 : 0;
12088   if (mips_opts.ase_mdmx && file_mips_fp32 == 1)
12089     as_bad (_("-mfp32 used with -mdmx"));
12090
12091   if (mips_opts.ase_smartmips == -1)
12092     mips_opts.ase_smartmips = (arch_info->flags & MIPS_CPU_ASE_SMARTMIPS) ? 1 : 0;
12093   if (mips_opts.ase_smartmips && !ISA_SUPPORTS_SMARTMIPS)
12094     as_warn (_("%s ISA does not support SmartMIPS"), 
12095              mips_cpu_info_from_isa (mips_opts.isa)->name);
12096
12097   if (mips_opts.ase_dsp == -1)
12098     mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12099   if (mips_opts.ase_dsp && !ISA_SUPPORTS_DSP_ASE)
12100     as_warn (_("%s ISA does not support DSP ASE"), 
12101              mips_cpu_info_from_isa (mips_opts.isa)->name);
12102
12103   if (mips_opts.ase_dspr2 == -1)
12104     {
12105       mips_opts.ase_dspr2 = (arch_info->flags & MIPS_CPU_ASE_DSPR2) ? 1 : 0;
12106       mips_opts.ase_dsp = (arch_info->flags & MIPS_CPU_ASE_DSP) ? 1 : 0;
12107     }
12108   if (mips_opts.ase_dspr2 && !ISA_SUPPORTS_DSPR2_ASE)
12109     as_warn (_("%s ISA does not support DSP R2 ASE"),
12110              mips_cpu_info_from_isa (mips_opts.isa)->name);
12111
12112   if (mips_opts.ase_mt == -1)
12113     mips_opts.ase_mt = (arch_info->flags & MIPS_CPU_ASE_MT) ? 1 : 0;
12114   if (mips_opts.ase_mt && !ISA_SUPPORTS_MT_ASE)
12115     as_warn (_("%s ISA does not support MT ASE"),
12116              mips_cpu_info_from_isa (mips_opts.isa)->name);
12117
12118   file_mips_isa = mips_opts.isa;
12119   file_ase_mips16 = mips_opts.mips16;
12120   file_ase_mips3d = mips_opts.ase_mips3d;
12121   file_ase_mdmx = mips_opts.ase_mdmx;
12122   file_ase_smartmips = mips_opts.ase_smartmips;
12123   file_ase_dsp = mips_opts.ase_dsp;
12124   file_ase_dspr2 = mips_opts.ase_dspr2;
12125   file_ase_mt = mips_opts.ase_mt;
12126   mips_opts.gp32 = file_mips_gp32;
12127   mips_opts.fp32 = file_mips_fp32;
12128   mips_opts.soft_float = file_mips_soft_float;
12129   mips_opts.single_float = file_mips_single_float;
12130
12131   if (mips_flag_mdebug < 0)
12132     {
12133 #ifdef OBJ_MAYBE_ECOFF
12134       if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour)
12135         mips_flag_mdebug = 1;
12136       else
12137 #endif /* OBJ_MAYBE_ECOFF */
12138         mips_flag_mdebug = 0;
12139     }
12140 }
12141 \f
12142 void
12143 mips_init_after_args (void)
12144 {
12145   /* initialize opcodes */
12146   bfd_mips_num_opcodes = bfd_mips_num_builtin_opcodes;
12147   mips_opcodes = (struct mips_opcode *) mips_builtin_opcodes;
12148 }
12149
12150 long
12151 md_pcrel_from (fixS *fixP)
12152 {
12153   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
12154   switch (fixP->fx_r_type)
12155     {
12156     case BFD_RELOC_16_PCREL_S2:
12157     case BFD_RELOC_MIPS_JMP:
12158       /* Return the address of the delay slot.  */
12159       return addr + 4;
12160     default:
12161       /* We have no relocation type for PC relative MIPS16 instructions.  */
12162       if (fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != now_seg)
12163         as_bad_where (fixP->fx_file, fixP->fx_line,
12164                       _("PC relative MIPS16 instruction references a different section"));
12165       return addr;
12166     }
12167 }
12168
12169 /* This is called before the symbol table is processed.  In order to
12170    work with gcc when using mips-tfile, we must keep all local labels.
12171    However, in other cases, we want to discard them.  If we were
12172    called with -g, but we didn't see any debugging information, it may
12173    mean that gcc is smuggling debugging information through to
12174    mips-tfile, in which case we must generate all local labels.  */
12175
12176 void
12177 mips_frob_file_before_adjust (void)
12178 {
12179 #ifndef NO_ECOFF_DEBUGGING
12180   if (ECOFF_DEBUGGING
12181       && mips_debug != 0
12182       && ! ecoff_debugging_seen)
12183     flag_keep_locals = 1;
12184 #endif
12185 }
12186
12187 /* Sort any unmatched HI16 and GOT16 relocs so that they immediately precede
12188    the corresponding LO16 reloc.  This is called before md_apply_fix and
12189    tc_gen_reloc.  Unmatched relocs can only be generated by use of explicit
12190    relocation operators.
12191
12192    For our purposes, a %lo() expression matches a %got() or %hi()
12193    expression if:
12194
12195       (a) it refers to the same symbol; and
12196       (b) the offset applied in the %lo() expression is no lower than
12197           the offset applied in the %got() or %hi().
12198
12199    (b) allows us to cope with code like:
12200
12201         lui     $4,%hi(foo)
12202         lh      $4,%lo(foo+2)($4)
12203
12204    ...which is legal on RELA targets, and has a well-defined behaviour
12205    if the user knows that adding 2 to "foo" will not induce a carry to
12206    the high 16 bits.
12207
12208    When several %lo()s match a particular %got() or %hi(), we use the
12209    following rules to distinguish them:
12210
12211      (1) %lo()s with smaller offsets are a better match than %lo()s with
12212          higher offsets.
12213
12214      (2) %lo()s with no matching %got() or %hi() are better than those
12215          that already have a matching %got() or %hi().
12216
12217      (3) later %lo()s are better than earlier %lo()s.
12218
12219    These rules are applied in order.
12220
12221    (1) means, among other things, that %lo()s with identical offsets are
12222    chosen if they exist.
12223
12224    (2) means that we won't associate several high-part relocations with
12225    the same low-part relocation unless there's no alternative.  Having
12226    several high parts for the same low part is a GNU extension; this rule
12227    allows careful users to avoid it.
12228
12229    (3) is purely cosmetic.  mips_hi_fixup_list is is in reverse order,
12230    with the last high-part relocation being at the front of the list.
12231    It therefore makes sense to choose the last matching low-part
12232    relocation, all other things being equal.  It's also easier
12233    to code that way.  */
12234
12235 void
12236 mips_frob_file (void)
12237 {
12238   struct mips_hi_fixup *l;
12239   bfd_reloc_code_real_type looking_for_rtype = BFD_RELOC_UNUSED;
12240
12241   for (l = mips_hi_fixup_list; l != NULL; l = l->next)
12242     {
12243       segment_info_type *seginfo;
12244       bfd_boolean matched_lo_p;
12245       fixS **hi_pos, **lo_pos, **pos;
12246
12247       gas_assert (reloc_needs_lo_p (l->fixp->fx_r_type));
12248
12249       /* If a GOT16 relocation turns out to be against a global symbol,
12250          there isn't supposed to be a matching LO.  */
12251       if (got16_reloc_p (l->fixp->fx_r_type)
12252           && !pic_need_relax (l->fixp->fx_addsy, l->seg))
12253         continue;
12254
12255       /* Check quickly whether the next fixup happens to be a matching %lo.  */
12256       if (fixup_has_matching_lo_p (l->fixp))
12257         continue;
12258
12259       seginfo = seg_info (l->seg);
12260
12261       /* Set HI_POS to the position of this relocation in the chain.
12262          Set LO_POS to the position of the chosen low-part relocation.
12263          MATCHED_LO_P is true on entry to the loop if *POS is a low-part
12264          relocation that matches an immediately-preceding high-part
12265          relocation.  */
12266       hi_pos = NULL;
12267       lo_pos = NULL;
12268       matched_lo_p = FALSE;
12269       looking_for_rtype = matching_lo_reloc (l->fixp->fx_r_type);
12270
12271       for (pos = &seginfo->fix_root; *pos != NULL; pos = &(*pos)->fx_next)
12272         {
12273           if (*pos == l->fixp)
12274             hi_pos = pos;
12275
12276           if ((*pos)->fx_r_type == looking_for_rtype
12277               && symbol_same_p ((*pos)->fx_addsy, l->fixp->fx_addsy)
12278               && (*pos)->fx_offset >= l->fixp->fx_offset
12279               && (lo_pos == NULL
12280                   || (*pos)->fx_offset < (*lo_pos)->fx_offset
12281                   || (!matched_lo_p
12282                       && (*pos)->fx_offset == (*lo_pos)->fx_offset)))
12283             lo_pos = pos;
12284
12285           matched_lo_p = (reloc_needs_lo_p ((*pos)->fx_r_type)
12286                           && fixup_has_matching_lo_p (*pos));
12287         }
12288
12289       /* If we found a match, remove the high-part relocation from its
12290          current position and insert it before the low-part relocation.
12291          Make the offsets match so that fixup_has_matching_lo_p()
12292          will return true.
12293
12294          We don't warn about unmatched high-part relocations since some
12295          versions of gcc have been known to emit dead "lui ...%hi(...)"
12296          instructions.  */
12297       if (lo_pos != NULL)
12298         {
12299           l->fixp->fx_offset = (*lo_pos)->fx_offset;
12300           if (l->fixp->fx_next != *lo_pos)
12301             {
12302               *hi_pos = l->fixp->fx_next;
12303               l->fixp->fx_next = *lo_pos;
12304               *lo_pos = l->fixp;
12305             }
12306         }
12307     }
12308 }
12309
12310 /* We may have combined relocations without symbols in the N32/N64 ABI.
12311    We have to prevent gas from dropping them.  */
12312
12313 int
12314 mips_force_relocation (fixS *fixp)
12315 {
12316   if (generic_force_reloc (fixp))
12317     return 1;
12318
12319   if (HAVE_NEWABI
12320       && S_GET_SEGMENT (fixp->fx_addsy) == bfd_abs_section_ptr
12321       && (fixp->fx_r_type == BFD_RELOC_MIPS_SUB
12322           || hi16_reloc_p (fixp->fx_r_type)
12323           || lo16_reloc_p (fixp->fx_r_type)))
12324     return 1;
12325
12326   return 0;
12327 }
12328
12329 /* Apply a fixup to the object file.  */
12330
12331 void
12332 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
12333 {
12334   bfd_byte *buf;
12335   long insn;
12336   reloc_howto_type *howto;
12337
12338   /* We ignore generic BFD relocations we don't know about.  */
12339   howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
12340   if (! howto)
12341     return;
12342
12343   gas_assert (fixP->fx_size == 4
12344           || fixP->fx_r_type == BFD_RELOC_16
12345           || fixP->fx_r_type == BFD_RELOC_64
12346           || fixP->fx_r_type == BFD_RELOC_CTOR
12347           || fixP->fx_r_type == BFD_RELOC_MIPS_SUB
12348           || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
12349           || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
12350           || fixP->fx_r_type == BFD_RELOC_MIPS_TLS_DTPREL64);
12351
12352   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
12353
12354   gas_assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
12355
12356   /* Don't treat parts of a composite relocation as done.  There are two
12357      reasons for this:
12358
12359      (1) The second and third parts will be against 0 (RSS_UNDEF) but
12360          should nevertheless be emitted if the first part is.
12361
12362      (2) In normal usage, composite relocations are never assembly-time
12363          constants.  The easiest way of dealing with the pathological
12364          exceptions is to generate a relocation against STN_UNDEF and
12365          leave everything up to the linker.  */
12366   if (fixP->fx_addsy == NULL && !fixP->fx_pcrel && fixP->fx_tcbit == 0)
12367     fixP->fx_done = 1;
12368
12369   switch (fixP->fx_r_type)
12370     {
12371     case BFD_RELOC_MIPS_TLS_GD:
12372     case BFD_RELOC_MIPS_TLS_LDM:
12373     case BFD_RELOC_MIPS_TLS_DTPREL32:
12374     case BFD_RELOC_MIPS_TLS_DTPREL64:
12375     case BFD_RELOC_MIPS_TLS_DTPREL_HI16:
12376     case BFD_RELOC_MIPS_TLS_DTPREL_LO16:
12377     case BFD_RELOC_MIPS_TLS_GOTTPREL:
12378     case BFD_RELOC_MIPS_TLS_TPREL_HI16:
12379     case BFD_RELOC_MIPS_TLS_TPREL_LO16:
12380       S_SET_THREAD_LOCAL (fixP->fx_addsy);
12381       /* fall through */
12382
12383     case BFD_RELOC_MIPS_JMP:
12384     case BFD_RELOC_MIPS_SHIFT5:
12385     case BFD_RELOC_MIPS_SHIFT6:
12386     case BFD_RELOC_MIPS_GOT_DISP:
12387     case BFD_RELOC_MIPS_GOT_PAGE:
12388     case BFD_RELOC_MIPS_GOT_OFST:
12389     case BFD_RELOC_MIPS_SUB:
12390     case BFD_RELOC_MIPS_INSERT_A:
12391     case BFD_RELOC_MIPS_INSERT_B:
12392     case BFD_RELOC_MIPS_DELETE:
12393     case BFD_RELOC_MIPS_HIGHEST:
12394     case BFD_RELOC_MIPS_HIGHER:
12395     case BFD_RELOC_MIPS_SCN_DISP:
12396     case BFD_RELOC_MIPS_REL16:
12397     case BFD_RELOC_MIPS_RELGOT:
12398     case BFD_RELOC_MIPS_JALR:
12399     case BFD_RELOC_HI16:
12400     case BFD_RELOC_HI16_S:
12401     case BFD_RELOC_GPREL16:
12402     case BFD_RELOC_MIPS_LITERAL:
12403     case BFD_RELOC_MIPS_CALL16:
12404     case BFD_RELOC_MIPS_GOT16:
12405     case BFD_RELOC_GPREL32:
12406     case BFD_RELOC_MIPS_GOT_HI16:
12407     case BFD_RELOC_MIPS_GOT_LO16:
12408     case BFD_RELOC_MIPS_CALL_HI16:
12409     case BFD_RELOC_MIPS_CALL_LO16:
12410     case BFD_RELOC_MIPS16_GPREL:
12411     case BFD_RELOC_MIPS16_GOT16:
12412     case BFD_RELOC_MIPS16_CALL16:
12413     case BFD_RELOC_MIPS16_HI16:
12414     case BFD_RELOC_MIPS16_HI16_S:
12415     case BFD_RELOC_MIPS16_JMP:
12416       /* Nothing needed to do.  The value comes from the reloc entry.  */
12417       break;
12418
12419     case BFD_RELOC_64:
12420       /* This is handled like BFD_RELOC_32, but we output a sign
12421          extended value if we are only 32 bits.  */
12422       if (fixP->fx_done)
12423         {
12424           if (8 <= sizeof (valueT))
12425             md_number_to_chars ((char *) buf, *valP, 8);
12426           else
12427             {
12428               valueT hiv;
12429
12430               if ((*valP & 0x80000000) != 0)
12431                 hiv = 0xffffffff;
12432               else
12433                 hiv = 0;
12434               md_number_to_chars ((char *)(buf + (target_big_endian ? 4 : 0)),
12435                                   *valP, 4);
12436               md_number_to_chars ((char *)(buf + (target_big_endian ? 0 : 4)),
12437                                   hiv, 4);
12438             }
12439         }
12440       break;
12441
12442     case BFD_RELOC_RVA:
12443     case BFD_RELOC_32:
12444     case BFD_RELOC_16:
12445       /* If we are deleting this reloc entry, we must fill in the
12446          value now.  This can happen if we have a .word which is not
12447          resolved when it appears but is later defined.  */
12448       if (fixP->fx_done)
12449         md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
12450       break;
12451
12452     case BFD_RELOC_LO16:
12453     case BFD_RELOC_MIPS16_LO16:
12454       /* FIXME: Now that embedded-PIC is gone, some of this code/comment
12455          may be safe to remove, but if so it's not obvious.  */
12456       /* When handling an embedded PIC switch statement, we can wind
12457          up deleting a LO16 reloc.  See the 'o' case in mips_ip.  */
12458       if (fixP->fx_done)
12459         {
12460           if (*valP + 0x8000 > 0xffff)
12461             as_bad_where (fixP->fx_file, fixP->fx_line,
12462                           _("relocation overflow"));
12463           if (target_big_endian)
12464             buf += 2;
12465           md_number_to_chars ((char *) buf, *valP, 2);
12466         }
12467       break;
12468
12469     case BFD_RELOC_16_PCREL_S2:
12470       if ((*valP & 0x3) != 0)
12471         as_bad_where (fixP->fx_file, fixP->fx_line,
12472                       _("Branch to misaligned address (%lx)"), (long) *valP);
12473
12474       /* We need to save the bits in the instruction since fixup_segment()
12475          might be deleting the relocation entry (i.e., a branch within
12476          the current segment).  */
12477       if (! fixP->fx_done)
12478         break;
12479
12480       /* Update old instruction data.  */
12481       if (target_big_endian)
12482         insn = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
12483       else
12484         insn = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
12485
12486       if (*valP + 0x20000 <= 0x3ffff)
12487         {
12488           insn |= (*valP >> 2) & 0xffff;
12489           md_number_to_chars ((char *) buf, insn, 4);
12490         }
12491       else if (mips_pic == NO_PIC
12492                && fixP->fx_done
12493                && fixP->fx_frag->fr_address >= text_section->vma
12494                && (fixP->fx_frag->fr_address
12495                    < text_section->vma + bfd_get_section_size (text_section))
12496                && ((insn & 0xffff0000) == 0x10000000     /* beq $0,$0 */
12497                    || (insn & 0xffff0000) == 0x04010000  /* bgez $0 */
12498                    || (insn & 0xffff0000) == 0x04110000)) /* bgezal $0 */
12499         {
12500           /* The branch offset is too large.  If this is an
12501              unconditional branch, and we are not generating PIC code,
12502              we can convert it to an absolute jump instruction.  */
12503           if ((insn & 0xffff0000) == 0x04110000)         /* bgezal $0 */
12504             insn = 0x0c000000;  /* jal */
12505           else
12506             insn = 0x08000000;  /* j */
12507           fixP->fx_r_type = BFD_RELOC_MIPS_JMP;
12508           fixP->fx_done = 0;
12509           fixP->fx_addsy = section_symbol (text_section);
12510           *valP += md_pcrel_from (fixP);
12511           md_number_to_chars ((char *) buf, insn, 4);
12512         }
12513       else
12514         {
12515           /* If we got here, we have branch-relaxation disabled,
12516              and there's nothing we can do to fix this instruction
12517              without turning it into a longer sequence.  */
12518           as_bad_where (fixP->fx_file, fixP->fx_line,
12519                         _("Branch out of range"));
12520         }
12521       break;
12522
12523     case BFD_RELOC_VTABLE_INHERIT:
12524       fixP->fx_done = 0;
12525       if (fixP->fx_addsy
12526           && !S_IS_DEFINED (fixP->fx_addsy)
12527           && !S_IS_WEAK (fixP->fx_addsy))
12528         S_SET_WEAK (fixP->fx_addsy);
12529       break;
12530
12531     case BFD_RELOC_VTABLE_ENTRY:
12532       fixP->fx_done = 0;
12533       break;
12534
12535     default:
12536       internalError ();
12537     }
12538
12539   /* Remember value for tc_gen_reloc.  */
12540   fixP->fx_addnumber = *valP;
12541 }
12542
12543 static symbolS *
12544 get_symbol (void)
12545 {
12546   int c;
12547   char *name;
12548   symbolS *p;
12549
12550   name = input_line_pointer;
12551   c = get_symbol_end ();
12552   p = (symbolS *) symbol_find_or_make (name);
12553   *input_line_pointer = c;
12554   return p;
12555 }
12556
12557 /* Align the current frag to a given power of two.  If a particular
12558    fill byte should be used, FILL points to an integer that contains
12559    that byte, otherwise FILL is null.
12560
12561    The MIPS assembler also automatically adjusts any preceding
12562    label.  */
12563
12564 static void
12565 mips_align (int to, int *fill, symbolS *label)
12566 {
12567   mips_emit_delays ();
12568   mips_record_mips16_mode ();
12569   if (fill == NULL && subseg_text_p (now_seg))
12570     frag_align_code (to, 0);
12571   else
12572     frag_align (to, fill ? *fill : 0, 0);
12573   record_alignment (now_seg, to);
12574   if (label != NULL)
12575     {
12576       gas_assert (S_GET_SEGMENT (label) == now_seg);
12577       symbol_set_frag (label, frag_now);
12578       S_SET_VALUE (label, (valueT) frag_now_fix ());
12579     }
12580 }
12581
12582 /* Align to a given power of two.  .align 0 turns off the automatic
12583    alignment used by the data creating pseudo-ops.  */
12584
12585 static void
12586 s_align (int x ATTRIBUTE_UNUSED)
12587 {
12588   int temp, fill_value, *fill_ptr;
12589   long max_alignment = 28;
12590
12591   /* o Note that the assembler pulls down any immediately preceding label
12592        to the aligned address.
12593      o It's not documented but auto alignment is reinstated by
12594        a .align pseudo instruction.
12595      o Note also that after auto alignment is turned off the mips assembler
12596        issues an error on attempt to assemble an improperly aligned data item.
12597        We don't.  */
12598
12599   temp = get_absolute_expression ();
12600   if (temp > max_alignment)
12601     as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
12602   else if (temp < 0)
12603     {
12604       as_warn (_("Alignment negative: 0 assumed."));
12605       temp = 0;
12606     }
12607   if (*input_line_pointer == ',')
12608     {
12609       ++input_line_pointer;
12610       fill_value = get_absolute_expression ();
12611       fill_ptr = &fill_value;
12612     }
12613   else
12614     fill_ptr = 0;
12615   if (temp)
12616     {
12617       segment_info_type *si = seg_info (now_seg);
12618       struct insn_label_list *l = si->label_list;
12619       /* Auto alignment should be switched on by next section change.  */
12620       auto_align = 1;
12621       mips_align (temp, fill_ptr, l != NULL ? l->label : NULL);
12622     }
12623   else
12624     {
12625       auto_align = 0;
12626     }
12627
12628   demand_empty_rest_of_line ();
12629 }
12630
12631 static void
12632 s_change_sec (int sec)
12633 {
12634   segT seg;
12635
12636 #ifdef OBJ_ELF
12637   /* The ELF backend needs to know that we are changing sections, so
12638      that .previous works correctly.  We could do something like check
12639      for an obj_section_change_hook macro, but that might be confusing
12640      as it would not be appropriate to use it in the section changing
12641      functions in read.c, since obj-elf.c intercepts those.  FIXME:
12642      This should be cleaner, somehow.  */
12643   if (IS_ELF)
12644     obj_elf_section_change_hook ();
12645 #endif
12646
12647   mips_emit_delays ();
12648
12649   switch (sec)
12650     {
12651     case 't':
12652       s_text (0);
12653       break;
12654     case 'd':
12655       s_data (0);
12656       break;
12657     case 'b':
12658       subseg_set (bss_section, (subsegT) get_absolute_expression ());
12659       demand_empty_rest_of_line ();
12660       break;
12661
12662     case 'r':
12663       seg = subseg_new (RDATA_SECTION_NAME,
12664                         (subsegT) get_absolute_expression ());
12665       if (IS_ELF)
12666         {
12667           bfd_set_section_flags (stdoutput, seg, (SEC_ALLOC | SEC_LOAD
12668                                                   | SEC_READONLY | SEC_RELOC
12669                                                   | SEC_DATA));
12670           if (strncmp (TARGET_OS, "elf", 3) != 0)
12671             record_alignment (seg, 4);
12672         }
12673       demand_empty_rest_of_line ();
12674       break;
12675
12676     case 's':
12677       seg = subseg_new (".sdata", (subsegT) get_absolute_expression ());
12678       if (IS_ELF)
12679         {
12680           bfd_set_section_flags (stdoutput, seg,
12681                                  SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA);
12682           if (strncmp (TARGET_OS, "elf", 3) != 0)
12683             record_alignment (seg, 4);
12684         }
12685       demand_empty_rest_of_line ();
12686       break;
12687
12688     case 'B':
12689       seg = subseg_new (".sbss", (subsegT) get_absolute_expression ());
12690       if (IS_ELF)
12691         {
12692           bfd_set_section_flags (stdoutput, seg, SEC_ALLOC);
12693           if (strncmp (TARGET_OS, "elf", 3) != 0)
12694             record_alignment (seg, 4);
12695         }
12696       demand_empty_rest_of_line ();
12697       break;
12698     }
12699
12700   auto_align = 1;
12701 }
12702
12703 void
12704 s_change_section (int ignore ATTRIBUTE_UNUSED)
12705 {
12706 #ifdef OBJ_ELF
12707   char *section_name;
12708   char c;
12709   char next_c = 0;
12710   int section_type;
12711   int section_flag;
12712   int section_entry_size;
12713   int section_alignment;
12714
12715   if (!IS_ELF)
12716     return;
12717
12718   section_name = input_line_pointer;
12719   c = get_symbol_end ();
12720   if (c)
12721     next_c = *(input_line_pointer + 1);
12722
12723   /* Do we have .section Name<,"flags">?  */
12724   if (c != ',' || (c == ',' && next_c == '"'))
12725     {
12726       /* just after name is now '\0'.  */
12727       *input_line_pointer = c;
12728       input_line_pointer = section_name;
12729       obj_elf_section (ignore);
12730       return;
12731     }
12732   input_line_pointer++;
12733
12734   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
12735   if (c == ',')
12736     section_type = get_absolute_expression ();
12737   else
12738     section_type = 0;
12739   if (*input_line_pointer++ == ',')
12740     section_flag = get_absolute_expression ();
12741   else
12742     section_flag = 0;
12743   if (*input_line_pointer++ == ',')
12744     section_entry_size = get_absolute_expression ();
12745   else
12746     section_entry_size = 0;
12747   if (*input_line_pointer++ == ',')
12748     section_alignment = get_absolute_expression ();
12749   else
12750     section_alignment = 0;
12751   /* FIXME: really ignore?  */
12752   (void) section_alignment;
12753
12754   section_name = xstrdup (section_name);
12755
12756   /* When using the generic form of .section (as implemented by obj-elf.c),
12757      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
12758      traditionally had to fall back on the more common @progbits instead.
12759
12760      There's nothing really harmful in this, since bfd will correct
12761      SHT_PROGBITS to SHT_MIPS_DWARF before writing out the file.  But it
12762      means that, for backwards compatibility, the special_section entries
12763      for dwarf sections must use SHT_PROGBITS rather than SHT_MIPS_DWARF.
12764
12765      Even so, we shouldn't force users of the MIPS .section syntax to
12766      incorrectly label the sections as SHT_PROGBITS.  The best compromise
12767      seems to be to map SHT_MIPS_DWARF to SHT_PROGBITS before calling the
12768      generic type-checking code.  */
12769   if (section_type == SHT_MIPS_DWARF)
12770     section_type = SHT_PROGBITS;
12771
12772   obj_elf_change_section (section_name, section_type, section_flag,
12773                           section_entry_size, 0, 0, 0);
12774
12775   if (now_seg->name != section_name)
12776     free (section_name);
12777 #endif /* OBJ_ELF */
12778 }
12779
12780 void
12781 mips_enable_auto_align (void)
12782 {
12783   auto_align = 1;
12784 }
12785
12786 static void
12787 s_cons (int log_size)
12788 {
12789   segment_info_type *si = seg_info (now_seg);
12790   struct insn_label_list *l = si->label_list;
12791   symbolS *label;
12792
12793   label = l != NULL ? l->label : NULL;
12794   mips_emit_delays ();
12795   if (log_size > 0 && auto_align)
12796     mips_align (log_size, 0, label);
12797   mips_clear_insn_labels ();
12798   cons (1 << log_size);
12799 }
12800
12801 static void
12802 s_float_cons (int type)
12803 {
12804   segment_info_type *si = seg_info (now_seg);
12805   struct insn_label_list *l = si->label_list;
12806   symbolS *label;
12807
12808   label = l != NULL ? l->label : NULL;
12809
12810   mips_emit_delays ();
12811
12812   if (auto_align)
12813     {
12814       if (type == 'd')
12815         mips_align (3, 0, label);
12816       else
12817         mips_align (2, 0, label);
12818     }
12819
12820   mips_clear_insn_labels ();
12821
12822   float_cons (type);
12823 }
12824
12825 /* Handle .globl.  We need to override it because on Irix 5 you are
12826    permitted to say
12827        .globl foo .text
12828    where foo is an undefined symbol, to mean that foo should be
12829    considered to be the address of a function.  */
12830
12831 static void
12832 s_mips_globl (int x ATTRIBUTE_UNUSED)
12833 {
12834   char *name;
12835   int c;
12836   symbolS *symbolP;
12837   flagword flag;
12838
12839   do
12840     {
12841       name = input_line_pointer;
12842       c = get_symbol_end ();
12843       symbolP = symbol_find_or_make (name);
12844       S_SET_EXTERNAL (symbolP);
12845
12846       *input_line_pointer = c;
12847       SKIP_WHITESPACE ();
12848
12849       /* On Irix 5, every global symbol that is not explicitly labelled as
12850          being a function is apparently labelled as being an object.  */
12851       flag = BSF_OBJECT;
12852
12853       if (!is_end_of_line[(unsigned char) *input_line_pointer]
12854           && (*input_line_pointer != ','))
12855         {
12856           char *secname;
12857           asection *sec;
12858
12859           secname = input_line_pointer;
12860           c = get_symbol_end ();
12861           sec = bfd_get_section_by_name (stdoutput, secname);
12862           if (sec == NULL)
12863             as_bad (_("%s: no such section"), secname);
12864           *input_line_pointer = c;
12865
12866           if (sec != NULL && (sec->flags & SEC_CODE) != 0)
12867             flag = BSF_FUNCTION;
12868         }
12869
12870       symbol_get_bfdsym (symbolP)->flags |= flag;
12871
12872       c = *input_line_pointer;
12873       if (c == ',')
12874         {
12875           input_line_pointer++;
12876           SKIP_WHITESPACE ();
12877           if (is_end_of_line[(unsigned char) *input_line_pointer])
12878             c = '\n';
12879         }
12880     }
12881   while (c == ',');
12882
12883   demand_empty_rest_of_line ();
12884 }
12885
12886 static void
12887 s_option (int x ATTRIBUTE_UNUSED)
12888 {
12889   char *opt;
12890   char c;
12891
12892   opt = input_line_pointer;
12893   c = get_symbol_end ();
12894
12895   if (*opt == 'O')
12896     {
12897       /* FIXME: What does this mean?  */
12898     }
12899   else if (strncmp (opt, "pic", 3) == 0)
12900     {
12901       int i;
12902
12903       i = atoi (opt + 3);
12904       if (i == 0)
12905         mips_pic = NO_PIC;
12906       else if (i == 2)
12907         {
12908         mips_pic = SVR4_PIC;
12909           mips_abicalls = TRUE;
12910         }
12911       else
12912         as_bad (_(".option pic%d not supported"), i);
12913
12914       if (mips_pic == SVR4_PIC)
12915         {
12916           if (g_switch_seen && g_switch_value != 0)
12917             as_warn (_("-G may not be used with SVR4 PIC code"));
12918           g_switch_value = 0;
12919           bfd_set_gp_size (stdoutput, 0);
12920         }
12921     }
12922   else
12923     as_warn (_("Unrecognized option \"%s\""), opt);
12924
12925   *input_line_pointer = c;
12926   demand_empty_rest_of_line ();
12927 }
12928
12929 /* This structure is used to hold a stack of .set values.  */
12930
12931 struct mips_option_stack
12932 {
12933   struct mips_option_stack *next;
12934   struct mips_set_options options;
12935 };
12936
12937 static struct mips_option_stack *mips_opts_stack;
12938
12939 /* Handle the .set pseudo-op.  */
12940
12941 static void
12942 s_mipsset (int x ATTRIBUTE_UNUSED)
12943 {
12944   char *name = input_line_pointer, ch;
12945
12946   while (!is_end_of_line[(unsigned char) *input_line_pointer])
12947     ++input_line_pointer;
12948   ch = *input_line_pointer;
12949   *input_line_pointer = '\0';
12950
12951   if (strcmp (name, "reorder") == 0)
12952     {
12953       if (mips_opts.noreorder)
12954         end_noreorder ();
12955     }
12956   else if (strcmp (name, "noreorder") == 0)
12957     {
12958       if (!mips_opts.noreorder)
12959         start_noreorder ();
12960     }
12961   else if (strncmp (name, "at=", 3) == 0)
12962     {
12963       char *s = name + 3;
12964
12965       if (!reg_lookup (&s, RTYPE_NUM | RTYPE_GP, &mips_opts.at))
12966         as_bad (_("Unrecognized register name `%s'"), s);
12967     }
12968   else if (strcmp (name, "at") == 0)
12969     {
12970       mips_opts.at = ATREG;
12971     }
12972   else if (strcmp (name, "noat") == 0)
12973     {
12974       mips_opts.at = ZERO;
12975     }
12976   else if (strcmp (name, "macro") == 0)
12977     {
12978       mips_opts.warn_about_macros = 0;
12979     }
12980   else if (strcmp (name, "nomacro") == 0)
12981     {
12982       if (mips_opts.noreorder == 0)
12983         as_bad (_("`noreorder' must be set before `nomacro'"));
12984       mips_opts.warn_about_macros = 1;
12985     }
12986   else if (strcmp (name, "move") == 0 || strcmp (name, "novolatile") == 0)
12987     {
12988       mips_opts.nomove = 0;
12989     }
12990   else if (strcmp (name, "nomove") == 0 || strcmp (name, "volatile") == 0)
12991     {
12992       mips_opts.nomove = 1;
12993     }
12994   else if (strcmp (name, "bopt") == 0)
12995     {
12996       mips_opts.nobopt = 0;
12997     }
12998   else if (strcmp (name, "nobopt") == 0)
12999     {
13000       mips_opts.nobopt = 1;
13001     }
13002   else if (strcmp (name, "gp=default") == 0)
13003     mips_opts.gp32 = file_mips_gp32;
13004   else if (strcmp (name, "gp=32") == 0)
13005     mips_opts.gp32 = 1;
13006   else if (strcmp (name, "gp=64") == 0)
13007     {
13008       if (!ISA_HAS_64BIT_REGS (mips_opts.isa))
13009         as_warn (_("%s isa does not support 64-bit registers"),
13010                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13011       mips_opts.gp32 = 0;
13012     }
13013   else if (strcmp (name, "fp=default") == 0)
13014     mips_opts.fp32 = file_mips_fp32;
13015   else if (strcmp (name, "fp=32") == 0)
13016     mips_opts.fp32 = 1;
13017   else if (strcmp (name, "fp=64") == 0)
13018     {
13019       if (!ISA_HAS_64BIT_FPRS (mips_opts.isa))
13020         as_warn (_("%s isa does not support 64-bit floating point registers"),
13021                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13022       mips_opts.fp32 = 0;
13023     }
13024   else if (strcmp (name, "softfloat") == 0)
13025     mips_opts.soft_float = 1;
13026   else if (strcmp (name, "hardfloat") == 0)
13027     mips_opts.soft_float = 0;
13028   else if (strcmp (name, "singlefloat") == 0)
13029     mips_opts.single_float = 1;
13030   else if (strcmp (name, "doublefloat") == 0)
13031     mips_opts.single_float = 0;
13032   else if (strcmp (name, "mips16") == 0
13033            || strcmp (name, "MIPS-16") == 0)
13034     mips_opts.mips16 = 1;
13035   else if (strcmp (name, "nomips16") == 0
13036            || strcmp (name, "noMIPS-16") == 0)
13037     mips_opts.mips16 = 0;
13038   else if (strcmp (name, "smartmips") == 0)
13039     {
13040       if (!ISA_SUPPORTS_SMARTMIPS)
13041         as_warn (_("%s ISA does not support SmartMIPS ASE"), 
13042                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13043       mips_opts.ase_smartmips = 1;
13044     }
13045   else if (strcmp (name, "nosmartmips") == 0)
13046     mips_opts.ase_smartmips = 0;
13047   else if (strcmp (name, "mips3d") == 0)
13048     mips_opts.ase_mips3d = 1;
13049   else if (strcmp (name, "nomips3d") == 0)
13050     mips_opts.ase_mips3d = 0;
13051   else if (strcmp (name, "mdmx") == 0)
13052     mips_opts.ase_mdmx = 1;
13053   else if (strcmp (name, "nomdmx") == 0)
13054     mips_opts.ase_mdmx = 0;
13055   else if (strcmp (name, "dsp") == 0)
13056     {
13057       if (!ISA_SUPPORTS_DSP_ASE)
13058         as_warn (_("%s ISA does not support DSP ASE"), 
13059                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13060       mips_opts.ase_dsp = 1;
13061       mips_opts.ase_dspr2 = 0;
13062     }
13063   else if (strcmp (name, "nodsp") == 0)
13064     {
13065       mips_opts.ase_dsp = 0;
13066       mips_opts.ase_dspr2 = 0;
13067     }
13068   else if (strcmp (name, "dspr2") == 0)
13069     {
13070       if (!ISA_SUPPORTS_DSPR2_ASE)
13071         as_warn (_("%s ISA does not support DSP R2 ASE"),
13072                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13073       mips_opts.ase_dspr2 = 1;
13074       mips_opts.ase_dsp = 1;
13075     }
13076   else if (strcmp (name, "nodspr2") == 0)
13077     {
13078       mips_opts.ase_dspr2 = 0;
13079       mips_opts.ase_dsp = 0;
13080     }
13081   else if (strcmp (name, "mt") == 0)
13082     {
13083       if (!ISA_SUPPORTS_MT_ASE)
13084         as_warn (_("%s ISA does not support MT ASE"), 
13085                  mips_cpu_info_from_isa (mips_opts.isa)->name);
13086       mips_opts.ase_mt = 1;
13087     }
13088   else if (strcmp (name, "nomt") == 0)
13089     mips_opts.ase_mt = 0;
13090   else if (strncmp (name, "mips", 4) == 0 || strncmp (name, "arch=", 5) == 0)
13091     {
13092       int reset = 0;
13093
13094       /* Permit the user to change the ISA and architecture on the fly.
13095          Needless to say, misuse can cause serious problems.  */
13096       if (strcmp (name, "mips0") == 0 || strcmp (name, "arch=default") == 0)
13097         {
13098           reset = 1;
13099           mips_opts.isa = file_mips_isa;
13100           mips_opts.arch = file_mips_arch;
13101         }
13102       else if (strncmp (name, "arch=", 5) == 0)
13103         {
13104           const struct mips_cpu_info *p;
13105
13106           p = mips_parse_cpu("internal use", name + 5);
13107           if (!p)
13108             as_bad (_("unknown architecture %s"), name + 5);
13109           else
13110             {
13111               mips_opts.arch = p->cpu;
13112               mips_opts.isa = p->isa;
13113             }
13114         }
13115       else if (strncmp (name, "mips", 4) == 0)
13116         {
13117           const struct mips_cpu_info *p;
13118
13119           p = mips_parse_cpu("internal use", name);
13120           if (!p)
13121             as_bad (_("unknown ISA level %s"), name + 4);
13122           else
13123             {
13124               mips_opts.arch = p->cpu;
13125               mips_opts.isa = p->isa;
13126             }
13127         }
13128       else
13129         as_bad (_("unknown ISA or architecture %s"), name);
13130
13131       switch (mips_opts.isa)
13132         {
13133         case  0:
13134           break;
13135         case ISA_MIPS1:
13136         case ISA_MIPS2:
13137         case ISA_MIPS32:
13138         case ISA_MIPS32R2:
13139           mips_opts.gp32 = 1;
13140           mips_opts.fp32 = 1;
13141           break;
13142         case ISA_MIPS3:
13143         case ISA_MIPS4:
13144         case ISA_MIPS5:
13145         case ISA_MIPS64:
13146         case ISA_MIPS64R2:
13147           mips_opts.gp32 = 0;
13148           mips_opts.fp32 = 0;
13149           break;
13150         default:
13151           as_bad (_("unknown ISA level %s"), name + 4);
13152           break;
13153         }
13154       if (reset)
13155         {
13156           mips_opts.gp32 = file_mips_gp32;
13157           mips_opts.fp32 = file_mips_fp32;
13158         }
13159     }
13160   else if (strcmp (name, "autoextend") == 0)
13161     mips_opts.noautoextend = 0;
13162   else if (strcmp (name, "noautoextend") == 0)
13163     mips_opts.noautoextend = 1;
13164   else if (strcmp (name, "push") == 0)
13165     {
13166       struct mips_option_stack *s;
13167
13168       s = (struct mips_option_stack *) xmalloc (sizeof *s);
13169       s->next = mips_opts_stack;
13170       s->options = mips_opts;
13171       mips_opts_stack = s;
13172     }
13173   else if (strcmp (name, "pop") == 0)
13174     {
13175       struct mips_option_stack *s;
13176
13177       s = mips_opts_stack;
13178       if (s == NULL)
13179         as_bad (_(".set pop with no .set push"));
13180       else
13181         {
13182           /* If we're changing the reorder mode we need to handle
13183              delay slots correctly.  */
13184           if (s->options.noreorder && ! mips_opts.noreorder)
13185             start_noreorder ();
13186           else if (! s->options.noreorder && mips_opts.noreorder)
13187             end_noreorder ();
13188
13189           mips_opts = s->options;
13190           mips_opts_stack = s->next;
13191           free (s);
13192         }
13193     }
13194   else if (strcmp (name, "sym32") == 0)
13195     mips_opts.sym32 = TRUE;
13196   else if (strcmp (name, "nosym32") == 0)
13197     mips_opts.sym32 = FALSE;
13198   else if (strchr (name, ','))
13199     {
13200       /* Generic ".set" directive; use the generic handler.  */
13201       *input_line_pointer = ch;
13202       input_line_pointer = name;
13203       s_set (0);
13204       return;
13205     }
13206   else
13207     {
13208       as_warn (_("Tried to set unrecognized symbol: %s\n"), name);
13209     }
13210   *input_line_pointer = ch;
13211   demand_empty_rest_of_line ();
13212 }
13213
13214 /* Handle the .abicalls pseudo-op.  I believe this is equivalent to
13215    .option pic2.  It means to generate SVR4 PIC calls.  */
13216
13217 static void
13218 s_abicalls (int ignore ATTRIBUTE_UNUSED)
13219 {
13220   mips_pic = SVR4_PIC;
13221   mips_abicalls = TRUE;
13222
13223   if (g_switch_seen && g_switch_value != 0)
13224     as_warn (_("-G may not be used with SVR4 PIC code"));
13225   g_switch_value = 0;
13226
13227   bfd_set_gp_size (stdoutput, 0);
13228   demand_empty_rest_of_line ();
13229 }
13230
13231 /* Handle the .cpload pseudo-op.  This is used when generating SVR4
13232    PIC code.  It sets the $gp register for the function based on the
13233    function address, which is in the register named in the argument.
13234    This uses a relocation against _gp_disp, which is handled specially
13235    by the linker.  The result is:
13236         lui     $gp,%hi(_gp_disp)
13237         addiu   $gp,$gp,%lo(_gp_disp)
13238         addu    $gp,$gp,.cpload argument
13239    The .cpload argument is normally $25 == $t9.
13240
13241    The -mno-shared option changes this to:
13242         lui     $gp,%hi(__gnu_local_gp)
13243         addiu   $gp,$gp,%lo(__gnu_local_gp)
13244    and the argument is ignored.  This saves an instruction, but the
13245    resulting code is not position independent; it uses an absolute
13246    address for __gnu_local_gp.  Thus code assembled with -mno-shared
13247    can go into an ordinary executable, but not into a shared library.  */
13248
13249 static void
13250 s_cpload (int ignore ATTRIBUTE_UNUSED)
13251 {
13252   expressionS ex;
13253   int reg;
13254   int in_shared;
13255
13256   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13257      .cpload is ignored.  */
13258   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13259     {
13260       s_ignore (0);
13261       return;
13262     }
13263
13264   /* .cpload should be in a .set noreorder section.  */
13265   if (mips_opts.noreorder == 0)
13266     as_warn (_(".cpload not in noreorder section"));
13267
13268   reg = tc_get_register (0);
13269
13270   /* If we need to produce a 64-bit address, we are better off using
13271      the default instruction sequence.  */
13272   in_shared = mips_in_shared || HAVE_64BIT_SYMBOLS;
13273
13274   ex.X_op = O_symbol;
13275   ex.X_add_symbol = symbol_find_or_make (in_shared ? "_gp_disp" :
13276                                          "__gnu_local_gp");
13277   ex.X_op_symbol = NULL;
13278   ex.X_add_number = 0;
13279
13280   /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13281   symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13282
13283   macro_start ();
13284   macro_build_lui (&ex, mips_gp_register);
13285   macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13286                mips_gp_register, BFD_RELOC_LO16);
13287   if (in_shared)
13288     macro_build (NULL, "addu", "d,v,t", mips_gp_register,
13289                  mips_gp_register, reg);
13290   macro_end ();
13291
13292   demand_empty_rest_of_line ();
13293 }
13294
13295 /* Handle the .cpsetup pseudo-op defined for NewABI PIC code.  The syntax is:
13296      .cpsetup $reg1, offset|$reg2, label
13297
13298    If offset is given, this results in:
13299      sd         $gp, offset($sp)
13300      lui        $gp, %hi(%neg(%gp_rel(label)))
13301      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13302      daddu      $gp, $gp, $reg1
13303
13304    If $reg2 is given, this results in:
13305      daddu      $reg2, $gp, $0
13306      lui        $gp, %hi(%neg(%gp_rel(label)))
13307      addiu      $gp, $gp, %lo(%neg(%gp_rel(label)))
13308      daddu      $gp, $gp, $reg1
13309    $reg1 is normally $25 == $t9.
13310
13311    The -mno-shared option replaces the last three instructions with
13312         lui     $gp,%hi(_gp)
13313         addiu   $gp,$gp,%lo(_gp)  */
13314
13315 static void
13316 s_cpsetup (int ignore ATTRIBUTE_UNUSED)
13317 {
13318   expressionS ex_off;
13319   expressionS ex_sym;
13320   int reg1;
13321
13322   /* If we are not generating SVR4 PIC code, .cpsetup is ignored.
13323      We also need NewABI support.  */
13324   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13325     {
13326       s_ignore (0);
13327       return;
13328     }
13329
13330   reg1 = tc_get_register (0);
13331   SKIP_WHITESPACE ();
13332   if (*input_line_pointer != ',')
13333     {
13334       as_bad (_("missing argument separator ',' for .cpsetup"));
13335       return;
13336     }
13337   else
13338     ++input_line_pointer;
13339   SKIP_WHITESPACE ();
13340   if (*input_line_pointer == '$')
13341     {
13342       mips_cpreturn_register = tc_get_register (0);
13343       mips_cpreturn_offset = -1;
13344     }
13345   else
13346     {
13347       mips_cpreturn_offset = get_absolute_expression ();
13348       mips_cpreturn_register = -1;
13349     }
13350   SKIP_WHITESPACE ();
13351   if (*input_line_pointer != ',')
13352     {
13353       as_bad (_("missing argument separator ',' for .cpsetup"));
13354       return;
13355     }
13356   else
13357     ++input_line_pointer;
13358   SKIP_WHITESPACE ();
13359   expression (&ex_sym);
13360
13361   macro_start ();
13362   if (mips_cpreturn_register == -1)
13363     {
13364       ex_off.X_op = O_constant;
13365       ex_off.X_add_symbol = NULL;
13366       ex_off.X_op_symbol = NULL;
13367       ex_off.X_add_number = mips_cpreturn_offset;
13368
13369       macro_build (&ex_off, "sd", "t,o(b)", mips_gp_register,
13370                    BFD_RELOC_LO16, SP);
13371     }
13372   else
13373     macro_build (NULL, "daddu", "d,v,t", mips_cpreturn_register,
13374                  mips_gp_register, 0);
13375
13376   if (mips_in_shared || HAVE_64BIT_SYMBOLS)
13377     {
13378       macro_build (&ex_sym, "lui", "t,u", mips_gp_register,
13379                    -1, BFD_RELOC_GPREL16, BFD_RELOC_MIPS_SUB,
13380                    BFD_RELOC_HI16_S);
13381
13382       macro_build (&ex_sym, "addiu", "t,r,j", mips_gp_register,
13383                    mips_gp_register, -1, BFD_RELOC_GPREL16,
13384                    BFD_RELOC_MIPS_SUB, BFD_RELOC_LO16);
13385
13386       macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", mips_gp_register,
13387                    mips_gp_register, reg1);
13388     }
13389   else
13390     {
13391       expressionS ex;
13392
13393       ex.X_op = O_symbol;
13394       ex.X_add_symbol = symbol_find_or_make ("__gnu_local_gp");
13395       ex.X_op_symbol = NULL;
13396       ex.X_add_number = 0;
13397
13398       /* In ELF, this symbol is implicitly an STT_OBJECT symbol.  */
13399       symbol_get_bfdsym (ex.X_add_symbol)->flags |= BSF_OBJECT;
13400
13401       macro_build_lui (&ex, mips_gp_register);
13402       macro_build (&ex, "addiu", "t,r,j", mips_gp_register,
13403                    mips_gp_register, BFD_RELOC_LO16);
13404     }
13405
13406   macro_end ();
13407
13408   demand_empty_rest_of_line ();
13409 }
13410
13411 static void
13412 s_cplocal (int ignore ATTRIBUTE_UNUSED)
13413 {
13414   /* If we are not generating SVR4 PIC code, or if this is not NewABI code,
13415      .cplocal is ignored.  */
13416   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13417     {
13418       s_ignore (0);
13419       return;
13420     }
13421
13422   mips_gp_register = tc_get_register (0);
13423   demand_empty_rest_of_line ();
13424 }
13425
13426 /* Handle the .cprestore pseudo-op.  This stores $gp into a given
13427    offset from $sp.  The offset is remembered, and after making a PIC
13428    call $gp is restored from that location.  */
13429
13430 static void
13431 s_cprestore (int ignore ATTRIBUTE_UNUSED)
13432 {
13433   expressionS ex;
13434
13435   /* If we are not generating SVR4 PIC code, or if this is NewABI code,
13436      .cprestore is ignored.  */
13437   if (mips_pic != SVR4_PIC || HAVE_NEWABI)
13438     {
13439       s_ignore (0);
13440       return;
13441     }
13442
13443   mips_cprestore_offset = get_absolute_expression ();
13444   mips_cprestore_valid = 1;
13445
13446   ex.X_op = O_constant;
13447   ex.X_add_symbol = NULL;
13448   ex.X_op_symbol = NULL;
13449   ex.X_add_number = mips_cprestore_offset;
13450
13451   macro_start ();
13452   macro_build_ldst_constoffset (&ex, ADDRESS_STORE_INSN, mips_gp_register,
13453                                 SP, HAVE_64BIT_ADDRESSES);
13454   macro_end ();
13455
13456   demand_empty_rest_of_line ();
13457 }
13458
13459 /* Handle the .cpreturn pseudo-op defined for NewABI PIC code. If an offset
13460    was given in the preceding .cpsetup, it results in:
13461      ld         $gp, offset($sp)
13462
13463    If a register $reg2 was given there, it results in:
13464      daddu      $gp, $reg2, $0  */
13465
13466 static void
13467 s_cpreturn (int ignore ATTRIBUTE_UNUSED)
13468 {
13469   expressionS ex;
13470
13471   /* If we are not generating SVR4 PIC code, .cpreturn is ignored.
13472      We also need NewABI support.  */
13473   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13474     {
13475       s_ignore (0);
13476       return;
13477     }
13478
13479   macro_start ();
13480   if (mips_cpreturn_register == -1)
13481     {
13482       ex.X_op = O_constant;
13483       ex.X_add_symbol = NULL;
13484       ex.X_op_symbol = NULL;
13485       ex.X_add_number = mips_cpreturn_offset;
13486
13487       macro_build (&ex, "ld", "t,o(b)", mips_gp_register, BFD_RELOC_LO16, SP);
13488     }
13489   else
13490     macro_build (NULL, "daddu", "d,v,t", mips_gp_register,
13491                  mips_cpreturn_register, 0);
13492   macro_end ();
13493
13494   demand_empty_rest_of_line ();
13495 }
13496
13497 /* Handle the .dtprelword and .dtpreldword pseudo-ops.  They generate
13498    a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
13499    use in DWARF debug information.  */
13500
13501 static void
13502 s_dtprel_internal (size_t bytes)
13503 {
13504   expressionS ex;
13505   char *p;
13506
13507   expression (&ex);
13508
13509   if (ex.X_op != O_symbol)
13510     {
13511       as_bad (_("Unsupported use of %s"), (bytes == 8
13512                                            ? ".dtpreldword"
13513                                            : ".dtprelword"));
13514       ignore_rest_of_line ();
13515     }
13516
13517   p = frag_more (bytes);
13518   md_number_to_chars (p, 0, bytes);
13519   fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
13520                (bytes == 8
13521                 ? BFD_RELOC_MIPS_TLS_DTPREL64
13522                 : BFD_RELOC_MIPS_TLS_DTPREL32));
13523
13524   demand_empty_rest_of_line ();
13525 }
13526
13527 /* Handle .dtprelword.  */
13528
13529 static void
13530 s_dtprelword (int ignore ATTRIBUTE_UNUSED)
13531 {
13532   s_dtprel_internal (4);
13533 }
13534
13535 /* Handle .dtpreldword.  */
13536
13537 static void
13538 s_dtpreldword (int ignore ATTRIBUTE_UNUSED)
13539 {
13540   s_dtprel_internal (8);
13541 }
13542
13543 /* Handle the .gpvalue pseudo-op.  This is used when generating NewABI PIC
13544    code.  It sets the offset to use in gp_rel relocations.  */
13545
13546 static void
13547 s_gpvalue (int ignore ATTRIBUTE_UNUSED)
13548 {
13549   /* If we are not generating SVR4 PIC code, .gpvalue is ignored.
13550      We also need NewABI support.  */
13551   if (mips_pic != SVR4_PIC || ! HAVE_NEWABI)
13552     {
13553       s_ignore (0);
13554       return;
13555     }
13556
13557   mips_gprel_offset = get_absolute_expression ();
13558
13559   demand_empty_rest_of_line ();
13560 }
13561
13562 /* Handle the .gpword pseudo-op.  This is used when generating PIC
13563    code.  It generates a 32 bit GP relative reloc.  */
13564
13565 static void
13566 s_gpword (int ignore ATTRIBUTE_UNUSED)
13567 {
13568   segment_info_type *si;
13569   struct insn_label_list *l;
13570   symbolS *label;
13571   expressionS ex;
13572   char *p;
13573
13574   /* When not generating PIC code, this is treated as .word.  */
13575   if (mips_pic != SVR4_PIC)
13576     {
13577       s_cons (2);
13578       return;
13579     }
13580
13581   si = seg_info (now_seg);
13582   l = si->label_list;
13583   label = l != NULL ? l->label : NULL;
13584   mips_emit_delays ();
13585   if (auto_align)
13586     mips_align (2, 0, label);
13587   mips_clear_insn_labels ();
13588
13589   expression (&ex);
13590
13591   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13592     {
13593       as_bad (_("Unsupported use of .gpword"));
13594       ignore_rest_of_line ();
13595     }
13596
13597   p = frag_more (4);
13598   md_number_to_chars (p, 0, 4);
13599   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13600                BFD_RELOC_GPREL32);
13601
13602   demand_empty_rest_of_line ();
13603 }
13604
13605 static void
13606 s_gpdword (int ignore ATTRIBUTE_UNUSED)
13607 {
13608   segment_info_type *si;
13609   struct insn_label_list *l;
13610   symbolS *label;
13611   expressionS ex;
13612   char *p;
13613
13614   /* When not generating PIC code, this is treated as .dword.  */
13615   if (mips_pic != SVR4_PIC)
13616     {
13617       s_cons (3);
13618       return;
13619     }
13620
13621   si = seg_info (now_seg);
13622   l = si->label_list;
13623   label = l != NULL ? l->label : NULL;
13624   mips_emit_delays ();
13625   if (auto_align)
13626     mips_align (3, 0, label);
13627   mips_clear_insn_labels ();
13628
13629   expression (&ex);
13630
13631   if (ex.X_op != O_symbol || ex.X_add_number != 0)
13632     {
13633       as_bad (_("Unsupported use of .gpdword"));
13634       ignore_rest_of_line ();
13635     }
13636
13637   p = frag_more (8);
13638   md_number_to_chars (p, 0, 8);
13639   fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &ex, FALSE,
13640                BFD_RELOC_GPREL32)->fx_tcbit = 1;
13641
13642   /* GPREL32 composed with 64 gives a 64-bit GP offset.  */
13643   fix_new (frag_now, p - frag_now->fr_literal, 8, NULL, 0,
13644            FALSE, BFD_RELOC_64)->fx_tcbit = 1;
13645
13646   demand_empty_rest_of_line ();
13647 }
13648
13649 /* Handle the .cpadd pseudo-op.  This is used when dealing with switch
13650    tables in SVR4 PIC code.  */
13651
13652 static void
13653 s_cpadd (int ignore ATTRIBUTE_UNUSED)
13654 {
13655   int reg;
13656
13657   /* This is ignored when not generating SVR4 PIC code.  */
13658   if (mips_pic != SVR4_PIC)
13659     {
13660       s_ignore (0);
13661       return;
13662     }
13663
13664   /* Add $gp to the register named as an argument.  */
13665   macro_start ();
13666   reg = tc_get_register (0);
13667   macro_build (NULL, ADDRESS_ADD_INSN, "d,v,t", reg, reg, mips_gp_register);
13668   macro_end ();
13669
13670   demand_empty_rest_of_line ();
13671 }
13672
13673 /* Handle the .insn pseudo-op.  This marks instruction labels in
13674    mips16 mode.  This permits the linker to handle them specially,
13675    such as generating jalx instructions when needed.  We also make
13676    them odd for the duration of the assembly, in order to generate the
13677    right sort of code.  We will make them even in the adjust_symtab
13678    routine, while leaving them marked.  This is convenient for the
13679    debugger and the disassembler.  The linker knows to make them odd
13680    again.  */
13681
13682 static void
13683 s_insn (int ignore ATTRIBUTE_UNUSED)
13684 {
13685   mips16_mark_labels ();
13686
13687   demand_empty_rest_of_line ();
13688 }
13689
13690 /* Handle a .stabn directive.  We need these in order to mark a label
13691    as being a mips16 text label correctly.  Sometimes the compiler
13692    will emit a label, followed by a .stabn, and then switch sections.
13693    If the label and .stabn are in mips16 mode, then the label is
13694    really a mips16 text label.  */
13695
13696 static void
13697 s_mips_stab (int type)
13698 {
13699   if (type == 'n')
13700     mips16_mark_labels ();
13701
13702   s_stab (type);
13703 }
13704
13705 /* Handle the .weakext pseudo-op as defined in Kane and Heinrich.  */
13706
13707 static void
13708 s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
13709 {
13710   char *name;
13711   int c;
13712   symbolS *symbolP;
13713   expressionS exp;
13714
13715   name = input_line_pointer;
13716   c = get_symbol_end ();
13717   symbolP = symbol_find_or_make (name);
13718   S_SET_WEAK (symbolP);
13719   *input_line_pointer = c;
13720
13721   SKIP_WHITESPACE ();
13722
13723   if (! is_end_of_line[(unsigned char) *input_line_pointer])
13724     {
13725       if (S_IS_DEFINED (symbolP))
13726         {
13727           as_bad (_("ignoring attempt to redefine symbol %s"),
13728                   S_GET_NAME (symbolP));
13729           ignore_rest_of_line ();
13730           return;
13731         }
13732
13733       if (*input_line_pointer == ',')
13734         {
13735           ++input_line_pointer;
13736           SKIP_WHITESPACE ();
13737         }
13738
13739       expression (&exp);
13740       if (exp.X_op != O_symbol)
13741         {
13742           as_bad (_("bad .weakext directive"));
13743           ignore_rest_of_line ();
13744           return;
13745         }
13746       symbol_set_value_expression (symbolP, &exp);
13747     }
13748
13749   demand_empty_rest_of_line ();
13750 }
13751
13752 /* Parse a register string into a number.  Called from the ECOFF code
13753    to parse .frame.  The argument is non-zero if this is the frame
13754    register, so that we can record it in mips_frame_reg.  */
13755
13756 int
13757 tc_get_register (int frame)
13758 {
13759   unsigned int reg;
13760
13761   SKIP_WHITESPACE ();
13762   if (! reg_lookup (&input_line_pointer, RWARN | RTYPE_NUM | RTYPE_GP, &reg))
13763     reg = 0;
13764   if (frame)
13765     {
13766       mips_frame_reg = reg != 0 ? reg : SP;
13767       mips_frame_reg_valid = 1;
13768       mips_cprestore_valid = 0;
13769     }
13770   return reg;
13771 }
13772
13773 valueT
13774 md_section_align (asection *seg, valueT addr)
13775 {
13776   int align = bfd_get_section_alignment (stdoutput, seg);
13777
13778   if (IS_ELF)
13779     {
13780       /* We don't need to align ELF sections to the full alignment.
13781          However, Irix 5 may prefer that we align them at least to a 16
13782          byte boundary.  We don't bother to align the sections if we
13783          are targeted for an embedded system.  */
13784       if (strncmp (TARGET_OS, "elf", 3) == 0)
13785         return addr;
13786       if (align > 4)
13787         align = 4;
13788     }
13789
13790   return ((addr + (1 << align) - 1) & (-1 << align));
13791 }
13792
13793 /* Utility routine, called from above as well.  If called while the
13794    input file is still being read, it's only an approximation.  (For
13795    example, a symbol may later become defined which appeared to be
13796    undefined earlier.)  */
13797
13798 static int
13799 nopic_need_relax (symbolS *sym, int before_relaxing)
13800 {
13801   if (sym == 0)
13802     return 0;
13803
13804   if (g_switch_value > 0)
13805     {
13806       const char *symname;
13807       int change;
13808
13809       /* Find out whether this symbol can be referenced off the $gp
13810          register.  It can be if it is smaller than the -G size or if
13811          it is in the .sdata or .sbss section.  Certain symbols can
13812          not be referenced off the $gp, although it appears as though
13813          they can.  */
13814       symname = S_GET_NAME (sym);
13815       if (symname != (const char *) NULL
13816           && (strcmp (symname, "eprol") == 0
13817               || strcmp (symname, "etext") == 0
13818               || strcmp (symname, "_gp") == 0
13819               || strcmp (symname, "edata") == 0
13820               || strcmp (symname, "_fbss") == 0
13821               || strcmp (symname, "_fdata") == 0
13822               || strcmp (symname, "_ftext") == 0
13823               || strcmp (symname, "end") == 0
13824               || strcmp (symname, "_gp_disp") == 0))
13825         change = 1;
13826       else if ((! S_IS_DEFINED (sym) || S_IS_COMMON (sym))
13827                && (0
13828 #ifndef NO_ECOFF_DEBUGGING
13829                    || (symbol_get_obj (sym)->ecoff_extern_size != 0
13830                        && (symbol_get_obj (sym)->ecoff_extern_size
13831                            <= g_switch_value))
13832 #endif
13833                    /* We must defer this decision until after the whole
13834                       file has been read, since there might be a .extern
13835                       after the first use of this symbol.  */
13836                    || (before_relaxing
13837 #ifndef NO_ECOFF_DEBUGGING
13838                        && symbol_get_obj (sym)->ecoff_extern_size == 0
13839 #endif
13840                        && S_GET_VALUE (sym) == 0)
13841                    || (S_GET_VALUE (sym) != 0
13842                        && S_GET_VALUE (sym) <= g_switch_value)))
13843         change = 0;
13844       else
13845         {
13846           const char *segname;
13847
13848           segname = segment_name (S_GET_SEGMENT (sym));
13849           gas_assert (strcmp (segname, ".lit8") != 0
13850                   && strcmp (segname, ".lit4") != 0);
13851           change = (strcmp (segname, ".sdata") != 0
13852                     && strcmp (segname, ".sbss") != 0
13853                     && strncmp (segname, ".sdata.", 7) != 0
13854                     && strncmp (segname, ".sbss.", 6) != 0
13855                     && strncmp (segname, ".gnu.linkonce.sb.", 17) != 0
13856                     && strncmp (segname, ".gnu.linkonce.s.", 16) != 0);
13857         }
13858       return change;
13859     }
13860   else
13861     /* We are not optimizing for the $gp register.  */
13862     return 1;
13863 }
13864
13865
13866 /* Return true if the given symbol should be considered local for SVR4 PIC.  */
13867
13868 static bfd_boolean
13869 pic_need_relax (symbolS *sym, asection *segtype)
13870 {
13871   asection *symsec;
13872
13873   /* Handle the case of a symbol equated to another symbol.  */
13874   while (symbol_equated_reloc_p (sym))
13875     {
13876       symbolS *n;
13877
13878       /* It's possible to get a loop here in a badly written program.  */
13879       n = symbol_get_value_expression (sym)->X_add_symbol;
13880       if (n == sym)
13881         break;
13882       sym = n;
13883     }
13884
13885   if (symbol_section_p (sym))
13886     return TRUE;
13887
13888   symsec = S_GET_SEGMENT (sym);
13889
13890   /* This must duplicate the test in adjust_reloc_syms.  */
13891   return (symsec != &bfd_und_section
13892           && symsec != &bfd_abs_section
13893           && !bfd_is_com_section (symsec)
13894           && !s_is_linkonce (sym, segtype)
13895 #ifdef OBJ_ELF
13896           /* A global or weak symbol is treated as external.  */
13897           && (!IS_ELF || (! S_IS_WEAK (sym) && ! S_IS_EXTERNAL (sym)))
13898 #endif
13899           );
13900 }
13901
13902
13903 /* Given a mips16 variant frag FRAGP, return non-zero if it needs an
13904    extended opcode.  SEC is the section the frag is in.  */
13905
13906 static int
13907 mips16_extended_frag (fragS *fragp, asection *sec, long stretch)
13908 {
13909   int type;
13910   const struct mips16_immed_operand *op;
13911   offsetT val;
13912   int mintiny, maxtiny;
13913   segT symsec;
13914   fragS *sym_frag;
13915
13916   if (RELAX_MIPS16_USER_SMALL (fragp->fr_subtype))
13917     return 0;
13918   if (RELAX_MIPS16_USER_EXT (fragp->fr_subtype))
13919     return 1;
13920
13921   type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
13922   op = mips16_immed_operands;
13923   while (op->type != type)
13924     {
13925       ++op;
13926       gas_assert (op < mips16_immed_operands + MIPS16_NUM_IMMED);
13927     }
13928
13929   if (op->unsp)
13930     {
13931       if (type == '<' || type == '>' || type == '[' || type == ']')
13932         {
13933           mintiny = 1;
13934           maxtiny = 1 << op->nbits;
13935         }
13936       else
13937         {
13938           mintiny = 0;
13939           maxtiny = (1 << op->nbits) - 1;
13940         }
13941     }
13942   else
13943     {
13944       mintiny = - (1 << (op->nbits - 1));
13945       maxtiny = (1 << (op->nbits - 1)) - 1;
13946     }
13947
13948   sym_frag = symbol_get_frag (fragp->fr_symbol);
13949   val = S_GET_VALUE (fragp->fr_symbol);
13950   symsec = S_GET_SEGMENT (fragp->fr_symbol);
13951
13952   if (op->pcrel)
13953     {
13954       addressT addr;
13955
13956       /* We won't have the section when we are called from
13957          mips_relax_frag.  However, we will always have been called
13958          from md_estimate_size_before_relax first.  If this is a
13959          branch to a different section, we mark it as such.  If SEC is
13960          NULL, and the frag is not marked, then it must be a branch to
13961          the same section.  */
13962       if (sec == NULL)
13963         {
13964           if (RELAX_MIPS16_LONG_BRANCH (fragp->fr_subtype))
13965             return 1;
13966         }
13967       else
13968         {
13969           /* Must have been called from md_estimate_size_before_relax.  */
13970           if (symsec != sec)
13971             {
13972               fragp->fr_subtype =
13973                 RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
13974
13975               /* FIXME: We should support this, and let the linker
13976                  catch branches and loads that are out of range.  */
13977               as_bad_where (fragp->fr_file, fragp->fr_line,
13978                             _("unsupported PC relative reference to different section"));
13979
13980               return 1;
13981             }
13982           if (fragp != sym_frag && sym_frag->fr_address == 0)
13983             /* Assume non-extended on the first relaxation pass.
13984                The address we have calculated will be bogus if this is
13985                a forward branch to another frag, as the forward frag
13986                will have fr_address == 0.  */
13987             return 0;
13988         }
13989
13990       /* In this case, we know for sure that the symbol fragment is in
13991          the same section.  If the relax_marker of the symbol fragment
13992          differs from the relax_marker of this fragment, we have not
13993          yet adjusted the symbol fragment fr_address.  We want to add
13994          in STRETCH in order to get a better estimate of the address.
13995          This particularly matters because of the shift bits.  */
13996       if (stretch != 0
13997           && sym_frag->relax_marker != fragp->relax_marker)
13998         {
13999           fragS *f;
14000
14001           /* Adjust stretch for any alignment frag.  Note that if have
14002              been expanding the earlier code, the symbol may be
14003              defined in what appears to be an earlier frag.  FIXME:
14004              This doesn't handle the fr_subtype field, which specifies
14005              a maximum number of bytes to skip when doing an
14006              alignment.  */
14007           for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
14008             {
14009               if (f->fr_type == rs_align || f->fr_type == rs_align_code)
14010                 {
14011                   if (stretch < 0)
14012                     stretch = - ((- stretch)
14013                                  & ~ ((1 << (int) f->fr_offset) - 1));
14014                   else
14015                     stretch &= ~ ((1 << (int) f->fr_offset) - 1);
14016                   if (stretch == 0)
14017                     break;
14018                 }
14019             }
14020           if (f != NULL)
14021             val += stretch;
14022         }
14023
14024       addr = fragp->fr_address + fragp->fr_fix;
14025
14026       /* The base address rules are complicated.  The base address of
14027          a branch is the following instruction.  The base address of a
14028          PC relative load or add is the instruction itself, but if it
14029          is in a delay slot (in which case it can not be extended) use
14030          the address of the instruction whose delay slot it is in.  */
14031       if (type == 'p' || type == 'q')
14032         {
14033           addr += 2;
14034
14035           /* If we are currently assuming that this frag should be
14036              extended, then, the current address is two bytes
14037              higher.  */
14038           if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14039             addr += 2;
14040
14041           /* Ignore the low bit in the target, since it will be set
14042              for a text label.  */
14043           if ((val & 1) != 0)
14044             --val;
14045         }
14046       else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14047         addr -= 4;
14048       else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14049         addr -= 2;
14050
14051       val -= addr & ~ ((1 << op->shift) - 1);
14052
14053       /* Branch offsets have an implicit 0 in the lowest bit.  */
14054       if (type == 'p' || type == 'q')
14055         val /= 2;
14056
14057       /* If any of the shifted bits are set, we must use an extended
14058          opcode.  If the address depends on the size of this
14059          instruction, this can lead to a loop, so we arrange to always
14060          use an extended opcode.  We only check this when we are in
14061          the main relaxation loop, when SEC is NULL.  */
14062       if ((val & ((1 << op->shift) - 1)) != 0 && sec == NULL)
14063         {
14064           fragp->fr_subtype =
14065             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14066           return 1;
14067         }
14068
14069       /* If we are about to mark a frag as extended because the value
14070          is precisely maxtiny + 1, then there is a chance of an
14071          infinite loop as in the following code:
14072              la $4,foo
14073              .skip      1020
14074              .align     2
14075            foo:
14076          In this case when the la is extended, foo is 0x3fc bytes
14077          away, so the la can be shrunk, but then foo is 0x400 away, so
14078          the la must be extended.  To avoid this loop, we mark the
14079          frag as extended if it was small, and is about to become
14080          extended with a value of maxtiny + 1.  */
14081       if (val == ((maxtiny + 1) << op->shift)
14082           && ! RELAX_MIPS16_EXTENDED (fragp->fr_subtype)
14083           && sec == NULL)
14084         {
14085           fragp->fr_subtype =
14086             RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
14087           return 1;
14088         }
14089     }
14090   else if (symsec != absolute_section && sec != NULL)
14091     as_bad_where (fragp->fr_file, fragp->fr_line, _("unsupported relocation"));
14092
14093   if ((val & ((1 << op->shift) - 1)) != 0
14094       || val < (mintiny << op->shift)
14095       || val > (maxtiny << op->shift))
14096     return 1;
14097   else
14098     return 0;
14099 }
14100
14101 /* Compute the length of a branch sequence, and adjust the
14102    RELAX_BRANCH_TOOFAR bit accordingly.  If FRAGP is NULL, the
14103    worst-case length is computed, with UPDATE being used to indicate
14104    whether an unconditional (-1), branch-likely (+1) or regular (0)
14105    branch is to be computed.  */
14106 static int
14107 relaxed_branch_length (fragS *fragp, asection *sec, int update)
14108 {
14109   bfd_boolean toofar;
14110   int length;
14111
14112   if (fragp
14113       && S_IS_DEFINED (fragp->fr_symbol)
14114       && sec == S_GET_SEGMENT (fragp->fr_symbol))
14115     {
14116       addressT addr;
14117       offsetT val;
14118
14119       val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
14120
14121       addr = fragp->fr_address + fragp->fr_fix + 4;
14122
14123       val -= addr;
14124
14125       toofar = val < - (0x8000 << 2) || val >= (0x8000 << 2);
14126     }
14127   else if (fragp)
14128     /* If the symbol is not defined or it's in a different segment,
14129        assume the user knows what's going on and emit a short
14130        branch.  */
14131     toofar = FALSE;
14132   else
14133     toofar = TRUE;
14134
14135   if (fragp && update && toofar != RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14136     fragp->fr_subtype
14137       = RELAX_BRANCH_ENCODE (RELAX_BRANCH_UNCOND (fragp->fr_subtype),
14138                              RELAX_BRANCH_LIKELY (fragp->fr_subtype),
14139                              RELAX_BRANCH_LINK (fragp->fr_subtype),
14140                              toofar);
14141
14142   length = 4;
14143   if (toofar)
14144     {
14145       if (fragp ? RELAX_BRANCH_LIKELY (fragp->fr_subtype) : (update > 0))
14146         length += 8;
14147
14148       if (mips_pic != NO_PIC)
14149         {
14150           /* Additional space for PIC loading of target address.  */
14151           length += 8;
14152           if (mips_opts.isa == ISA_MIPS1)
14153             /* Additional space for $at-stabilizing nop.  */
14154             length += 4;
14155         }
14156
14157       /* If branch is conditional.  */
14158       if (fragp ? !RELAX_BRANCH_UNCOND (fragp->fr_subtype) : (update >= 0))
14159         length += 8;
14160     }
14161
14162   return length;
14163 }
14164
14165 /* Estimate the size of a frag before relaxing.  Unless this is the
14166    mips16, we are not really relaxing here, and the final size is
14167    encoded in the subtype information.  For the mips16, we have to
14168    decide whether we are using an extended opcode or not.  */
14169
14170 int
14171 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
14172 {
14173   int change;
14174
14175   if (RELAX_BRANCH_P (fragp->fr_subtype))
14176     {
14177
14178       fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE);
14179
14180       return fragp->fr_var;
14181     }
14182
14183   if (RELAX_MIPS16_P (fragp->fr_subtype))
14184     /* We don't want to modify the EXTENDED bit here; it might get us
14185        into infinite loops.  We change it only in mips_relax_frag().  */
14186     return (RELAX_MIPS16_EXTENDED (fragp->fr_subtype) ? 4 : 2);
14187
14188   if (mips_pic == NO_PIC)
14189     change = nopic_need_relax (fragp->fr_symbol, 0);
14190   else if (mips_pic == SVR4_PIC)
14191     change = pic_need_relax (fragp->fr_symbol, segtype);
14192   else if (mips_pic == VXWORKS_PIC)
14193     /* For vxworks, GOT16 relocations never have a corresponding LO16.  */
14194     change = 0;
14195   else
14196     abort ();
14197
14198   if (change)
14199     {
14200       fragp->fr_subtype |= RELAX_USE_SECOND;
14201       return -RELAX_FIRST (fragp->fr_subtype);
14202     }
14203   else
14204     return -RELAX_SECOND (fragp->fr_subtype);
14205 }
14206
14207 /* This is called to see whether a reloc against a defined symbol
14208    should be converted into a reloc against a section.  */
14209
14210 int
14211 mips_fix_adjustable (fixS *fixp)
14212 {
14213   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
14214       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14215     return 0;
14216
14217   if (fixp->fx_addsy == NULL)
14218     return 1;
14219
14220   /* If symbol SYM is in a mergeable section, relocations of the form
14221      SYM + 0 can usually be made section-relative.  The mergeable data
14222      is then identified by the section offset rather than by the symbol.
14223
14224      However, if we're generating REL LO16 relocations, the offset is split
14225      between the LO16 and parterning high part relocation.  The linker will
14226      need to recalculate the complete offset in order to correctly identify
14227      the merge data.
14228
14229      The linker has traditionally not looked for the parterning high part
14230      relocation, and has thus allowed orphaned R_MIPS_LO16 relocations to be
14231      placed anywhere.  Rather than break backwards compatibility by changing
14232      this, it seems better not to force the issue, and instead keep the
14233      original symbol.  This will work with either linker behavior.  */
14234   if ((lo16_reloc_p (fixp->fx_r_type)
14235        || reloc_needs_lo_p (fixp->fx_r_type))
14236       && HAVE_IN_PLACE_ADDENDS
14237       && (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
14238     return 0;
14239
14240   /* There is no place to store an in-place offset for JALR relocations.  */
14241   if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
14242     return 0;
14243
14244 #ifdef OBJ_ELF
14245   /* R_MIPS16_26 relocations against non-MIPS16 functions might resolve
14246      to a floating-point stub.  The same is true for non-R_MIPS16_26
14247      relocations against MIPS16 functions; in this case, the stub becomes
14248      the function's canonical address.
14249
14250      Floating-point stubs are stored in unique .mips16.call.* or
14251      .mips16.fn.* sections.  If a stub T for function F is in section S,
14252      the first relocation in section S must be against F; this is how the
14253      linker determines the target function.  All relocations that might
14254      resolve to T must also be against F.  We therefore have the following
14255      restrictions, which are given in an intentionally-redundant way:
14256
14257        1. We cannot reduce R_MIPS16_26 relocations against non-MIPS16
14258           symbols.
14259
14260        2. We cannot reduce a stub's relocations against non-MIPS16 symbols
14261           if that stub might be used.
14262
14263        3. We cannot reduce non-R_MIPS16_26 relocations against MIPS16
14264           symbols.
14265
14266        4. We cannot reduce a stub's relocations against MIPS16 symbols if
14267           that stub might be used.
14268
14269      There is a further restriction:
14270
14271        5. We cannot reduce R_MIPS16_26 relocations against MIPS16 symbols
14272           on targets with in-place addends; the relocation field cannot
14273           encode the low bit.
14274
14275      For simplicity, we deal with (3)-(5) by not reducing _any_ relocation
14276      against a MIPS16 symbol.
14277
14278      We deal with (1)-(2) by saying that, if there's a R_MIPS16_26
14279      relocation against some symbol R, no relocation against R may be
14280      reduced.  (Note that this deals with (2) as well as (1) because
14281      relocations against global symbols will never be reduced on ELF
14282      targets.)  This approach is a little simpler than trying to detect
14283      stub sections, and gives the "all or nothing" per-symbol consistency
14284      that we have for MIPS16 symbols.  */
14285   if (IS_ELF
14286       && fixp->fx_subsy == NULL
14287       && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
14288           || *symbol_get_tc (fixp->fx_addsy)))
14289     return 0;
14290 #endif
14291
14292   return 1;
14293 }
14294
14295 /* Translate internal representation of relocation info to BFD target
14296    format.  */
14297
14298 arelent **
14299 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
14300 {
14301   static arelent *retval[4];
14302   arelent *reloc;
14303   bfd_reloc_code_real_type code;
14304
14305   memset (retval, 0, sizeof(retval));
14306   reloc = retval[0] = (arelent *) xcalloc (1, sizeof (arelent));
14307   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
14308   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
14309   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
14310
14311   if (fixp->fx_pcrel)
14312     {
14313       gas_assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
14314
14315       /* At this point, fx_addnumber is "symbol offset - pcrel address".
14316          Relocations want only the symbol offset.  */
14317       reloc->addend = fixp->fx_addnumber + reloc->address;
14318       if (!IS_ELF)
14319         {
14320           /* A gruesome hack which is a result of the gruesome gas
14321              reloc handling.  What's worse, for COFF (as opposed to
14322              ECOFF), we might need yet another copy of reloc->address.
14323              See bfd_install_relocation.  */
14324           reloc->addend += reloc->address;
14325         }
14326     }
14327   else
14328     reloc->addend = fixp->fx_addnumber;
14329
14330   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
14331      entry to be used in the relocation's section offset.  */
14332   if (! HAVE_NEWABI && fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
14333     {
14334       reloc->address = reloc->addend;
14335       reloc->addend = 0;
14336     }
14337
14338   code = fixp->fx_r_type;
14339
14340   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
14341   if (reloc->howto == NULL)
14342     {
14343       as_bad_where (fixp->fx_file, fixp->fx_line,
14344                     _("Can not represent %s relocation in this object file format"),
14345                     bfd_get_reloc_code_name (code));
14346       retval[0] = NULL;
14347     }
14348
14349   return retval;
14350 }
14351
14352 /* Relax a machine dependent frag.  This returns the amount by which
14353    the current size of the frag should change.  */
14354
14355 int
14356 mips_relax_frag (asection *sec, fragS *fragp, long stretch)
14357 {
14358   if (RELAX_BRANCH_P (fragp->fr_subtype))
14359     {
14360       offsetT old_var = fragp->fr_var;
14361
14362       fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
14363
14364       return fragp->fr_var - old_var;
14365     }
14366
14367   if (! RELAX_MIPS16_P (fragp->fr_subtype))
14368     return 0;
14369
14370   if (mips16_extended_frag (fragp, NULL, stretch))
14371     {
14372       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14373         return 0;
14374       fragp->fr_subtype = RELAX_MIPS16_MARK_EXTENDED (fragp->fr_subtype);
14375       return 2;
14376     }
14377   else
14378     {
14379       if (! RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14380         return 0;
14381       fragp->fr_subtype = RELAX_MIPS16_CLEAR_EXTENDED (fragp->fr_subtype);
14382       return -2;
14383     }
14384
14385   return 0;
14386 }
14387
14388 /* Convert a machine dependent frag.  */
14389
14390 void
14391 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec, fragS *fragp)
14392 {
14393   if (RELAX_BRANCH_P (fragp->fr_subtype))
14394     {
14395       bfd_byte *buf;
14396       unsigned long insn;
14397       expressionS exp;
14398       fixS *fixp;
14399
14400       buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
14401
14402       if (target_big_endian)
14403         insn = bfd_getb32 (buf);
14404       else
14405         insn = bfd_getl32 (buf);
14406
14407       if (!RELAX_BRANCH_TOOFAR (fragp->fr_subtype))
14408         {
14409           /* We generate a fixup instead of applying it right now
14410              because, if there are linker relaxations, we're going to
14411              need the relocations.  */
14412           exp.X_op = O_symbol;
14413           exp.X_add_symbol = fragp->fr_symbol;
14414           exp.X_add_number = fragp->fr_offset;
14415
14416           fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14417                               4, &exp, TRUE, BFD_RELOC_16_PCREL_S2);
14418           fixp->fx_file = fragp->fr_file;
14419           fixp->fx_line = fragp->fr_line;
14420
14421           md_number_to_chars ((char *) buf, insn, 4);
14422           buf += 4;
14423         }
14424       else
14425         {
14426           int i;
14427
14428           as_warn_where (fragp->fr_file, fragp->fr_line,
14429                          _("relaxed out-of-range branch into a jump"));
14430
14431           if (RELAX_BRANCH_UNCOND (fragp->fr_subtype))
14432             goto uncond;
14433
14434           if (!RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14435             {
14436               /* Reverse the branch.  */
14437               switch ((insn >> 28) & 0xf)
14438                 {
14439                 case 4:
14440                   /* bc[0-3][tf]l? and bc1any[24][ft] instructions can
14441                      have the condition reversed by tweaking a single
14442                      bit, and their opcodes all have 0x4???????.  */
14443                   gas_assert ((insn & 0xf1000000) == 0x41000000);
14444                   insn ^= 0x00010000;
14445                   break;
14446
14447                 case 0:
14448                   /* bltz       0x04000000      bgez    0x04010000
14449                      bltzal     0x04100000      bgezal  0x04110000  */
14450                   gas_assert ((insn & 0xfc0e0000) == 0x04000000);
14451                   insn ^= 0x00010000;
14452                   break;
14453
14454                 case 1:
14455                   /* beq        0x10000000      bne     0x14000000
14456                      blez       0x18000000      bgtz    0x1c000000  */
14457                   insn ^= 0x04000000;
14458                   break;
14459
14460                 default:
14461                   abort ();
14462                 }
14463             }
14464
14465           if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14466             {
14467               /* Clear the and-link bit.  */
14468               gas_assert ((insn & 0xfc1c0000) == 0x04100000);
14469
14470               /* bltzal         0x04100000      bgezal  0x04110000
14471                  bltzall        0x04120000      bgezall 0x04130000  */
14472               insn &= ~0x00100000;
14473             }
14474
14475           /* Branch over the branch (if the branch was likely) or the
14476              full jump (not likely case).  Compute the offset from the
14477              current instruction to branch to.  */
14478           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14479             i = 16;
14480           else
14481             {
14482               /* How many bytes in instructions we've already emitted?  */
14483               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14484               /* How many bytes in instructions from here to the end?  */
14485               i = fragp->fr_var - i;
14486             }
14487           /* Convert to instruction count.  */
14488           i >>= 2;
14489           /* Branch counts from the next instruction.  */
14490           i--;
14491           insn |= i;
14492           /* Branch over the jump.  */
14493           md_number_to_chars ((char *) buf, insn, 4);
14494           buf += 4;
14495
14496           /* nop */
14497           md_number_to_chars ((char *) buf, 0, 4);
14498           buf += 4;
14499
14500           if (RELAX_BRANCH_LIKELY (fragp->fr_subtype))
14501             {
14502               /* beql $0, $0, 2f */
14503               insn = 0x50000000;
14504               /* Compute the PC offset from the current instruction to
14505                  the end of the variable frag.  */
14506               /* How many bytes in instructions we've already emitted?  */
14507               i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix;
14508               /* How many bytes in instructions from here to the end?  */
14509               i = fragp->fr_var - i;
14510               /* Convert to instruction count.  */
14511               i >>= 2;
14512               /* Don't decrement i, because we want to branch over the
14513                  delay slot.  */
14514
14515               insn |= i;
14516               md_number_to_chars ((char *) buf, insn, 4);
14517               buf += 4;
14518
14519               md_number_to_chars ((char *) buf, 0, 4);
14520               buf += 4;
14521             }
14522
14523         uncond:
14524           if (mips_pic == NO_PIC)
14525             {
14526               /* j or jal.  */
14527               insn = (RELAX_BRANCH_LINK (fragp->fr_subtype)
14528                       ? 0x0c000000 : 0x08000000);
14529               exp.X_op = O_symbol;
14530               exp.X_add_symbol = fragp->fr_symbol;
14531               exp.X_add_number = fragp->fr_offset;
14532
14533               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14534                                   4, &exp, FALSE, BFD_RELOC_MIPS_JMP);
14535               fixp->fx_file = fragp->fr_file;
14536               fixp->fx_line = fragp->fr_line;
14537
14538               md_number_to_chars ((char *) buf, insn, 4);
14539               buf += 4;
14540             }
14541           else
14542             {
14543               /* lw/ld $at, <sym>($gp)  R_MIPS_GOT16 */
14544               insn = HAVE_64BIT_ADDRESSES ? 0xdf810000 : 0x8f810000;
14545               exp.X_op = O_symbol;
14546               exp.X_add_symbol = fragp->fr_symbol;
14547               exp.X_add_number = fragp->fr_offset;
14548
14549               if (fragp->fr_offset)
14550                 {
14551                   exp.X_add_symbol = make_expr_symbol (&exp);
14552                   exp.X_add_number = 0;
14553                 }
14554
14555               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14556                                   4, &exp, FALSE, BFD_RELOC_MIPS_GOT16);
14557               fixp->fx_file = fragp->fr_file;
14558               fixp->fx_line = fragp->fr_line;
14559
14560               md_number_to_chars ((char *) buf, insn, 4);
14561               buf += 4;
14562
14563               if (mips_opts.isa == ISA_MIPS1)
14564                 {
14565                   /* nop */
14566                   md_number_to_chars ((char *) buf, 0, 4);
14567                   buf += 4;
14568                 }
14569
14570               /* d/addiu $at, $at, <sym>  R_MIPS_LO16 */
14571               insn = HAVE_64BIT_ADDRESSES ? 0x64210000 : 0x24210000;
14572
14573               fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
14574                                   4, &exp, FALSE, BFD_RELOC_LO16);
14575               fixp->fx_file = fragp->fr_file;
14576               fixp->fx_line = fragp->fr_line;
14577
14578               md_number_to_chars ((char *) buf, insn, 4);
14579               buf += 4;
14580
14581               /* j(al)r $at.  */
14582               if (RELAX_BRANCH_LINK (fragp->fr_subtype))
14583                 insn = 0x0020f809;
14584               else
14585                 insn = 0x00200008;
14586
14587               md_number_to_chars ((char *) buf, insn, 4);
14588               buf += 4;
14589             }
14590         }
14591
14592       gas_assert (buf == (bfd_byte *)fragp->fr_literal
14593               + fragp->fr_fix + fragp->fr_var);
14594
14595       fragp->fr_fix += fragp->fr_var;
14596
14597       return;
14598     }
14599
14600   if (RELAX_MIPS16_P (fragp->fr_subtype))
14601     {
14602       int type;
14603       const struct mips16_immed_operand *op;
14604       bfd_boolean small, ext;
14605       offsetT val;
14606       bfd_byte *buf;
14607       unsigned long insn;
14608       bfd_boolean use_extend;
14609       unsigned short extend;
14610
14611       type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
14612       op = mips16_immed_operands;
14613       while (op->type != type)
14614         ++op;
14615
14616       if (RELAX_MIPS16_EXTENDED (fragp->fr_subtype))
14617         {
14618           small = FALSE;
14619           ext = TRUE;
14620         }
14621       else
14622         {
14623           small = TRUE;
14624           ext = FALSE;
14625         }
14626
14627       resolve_symbol_value (fragp->fr_symbol);
14628       val = S_GET_VALUE (fragp->fr_symbol);
14629       if (op->pcrel)
14630         {
14631           addressT addr;
14632
14633           addr = fragp->fr_address + fragp->fr_fix;
14634
14635           /* The rules for the base address of a PC relative reloc are
14636              complicated; see mips16_extended_frag.  */
14637           if (type == 'p' || type == 'q')
14638             {
14639               addr += 2;
14640               if (ext)
14641                 addr += 2;
14642               /* Ignore the low bit in the target, since it will be
14643                  set for a text label.  */
14644               if ((val & 1) != 0)
14645                 --val;
14646             }
14647           else if (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype))
14648             addr -= 4;
14649           else if (RELAX_MIPS16_DSLOT (fragp->fr_subtype))
14650             addr -= 2;
14651
14652           addr &= ~ (addressT) ((1 << op->shift) - 1);
14653           val -= addr;
14654
14655           /* Make sure the section winds up with the alignment we have
14656              assumed.  */
14657           if (op->shift > 0)
14658             record_alignment (asec, op->shift);
14659         }
14660
14661       if (ext
14662           && (RELAX_MIPS16_JAL_DSLOT (fragp->fr_subtype)
14663               || RELAX_MIPS16_DSLOT (fragp->fr_subtype)))
14664         as_warn_where (fragp->fr_file, fragp->fr_line,
14665                        _("extended instruction in delay slot"));
14666
14667       buf = (bfd_byte *) (fragp->fr_literal + fragp->fr_fix);
14668
14669       if (target_big_endian)
14670         insn = bfd_getb16 (buf);
14671       else
14672         insn = bfd_getl16 (buf);
14673
14674       mips16_immed (fragp->fr_file, fragp->fr_line, type, val,
14675                     RELAX_MIPS16_USER_EXT (fragp->fr_subtype),
14676                     small, ext, &insn, &use_extend, &extend);
14677
14678       if (use_extend)
14679         {
14680           md_number_to_chars ((char *) buf, 0xf000 | extend, 2);
14681           fragp->fr_fix += 2;
14682           buf += 2;
14683         }
14684
14685       md_number_to_chars ((char *) buf, insn, 2);
14686       fragp->fr_fix += 2;
14687       buf += 2;
14688     }
14689   else
14690     {
14691       int first, second;
14692       fixS *fixp;
14693
14694       first = RELAX_FIRST (fragp->fr_subtype);
14695       second = RELAX_SECOND (fragp->fr_subtype);
14696       fixp = (fixS *) fragp->fr_opcode;
14697
14698       /* Possibly emit a warning if we've chosen the longer option.  */
14699       if (((fragp->fr_subtype & RELAX_USE_SECOND) != 0)
14700           == ((fragp->fr_subtype & RELAX_SECOND_LONGER) != 0))
14701         {
14702           const char *msg = macro_warning (fragp->fr_subtype);
14703           if (msg != 0)
14704             as_warn_where (fragp->fr_file, fragp->fr_line, "%s", msg);
14705         }
14706
14707       /* Go through all the fixups for the first sequence.  Disable them
14708          (by marking them as done) if we're going to use the second
14709          sequence instead.  */
14710       while (fixp
14711              && fixp->fx_frag == fragp
14712              && fixp->fx_where < fragp->fr_fix - second)
14713         {
14714           if (fragp->fr_subtype & RELAX_USE_SECOND)
14715             fixp->fx_done = 1;
14716           fixp = fixp->fx_next;
14717         }
14718
14719       /* Go through the fixups for the second sequence.  Disable them if
14720          we're going to use the first sequence, otherwise adjust their
14721          addresses to account for the relaxation.  */
14722       while (fixp && fixp->fx_frag == fragp)
14723         {
14724           if (fragp->fr_subtype & RELAX_USE_SECOND)
14725             fixp->fx_where -= first;
14726           else
14727             fixp->fx_done = 1;
14728           fixp = fixp->fx_next;
14729         }
14730
14731       /* Now modify the frag contents.  */
14732       if (fragp->fr_subtype & RELAX_USE_SECOND)
14733         {
14734           char *start;
14735
14736           start = fragp->fr_literal + fragp->fr_fix - first - second;
14737           memmove (start, start + first, second);
14738           fragp->fr_fix -= first;
14739         }
14740       else
14741         fragp->fr_fix -= second;
14742     }
14743 }
14744
14745 #ifdef OBJ_ELF
14746
14747 /* This function is called after the relocs have been generated.
14748    We've been storing mips16 text labels as odd.  Here we convert them
14749    back to even for the convenience of the debugger.  */
14750
14751 void
14752 mips_frob_file_after_relocs (void)
14753 {
14754   asymbol **syms;
14755   unsigned int count, i;
14756
14757   if (!IS_ELF)
14758     return;
14759
14760   syms = bfd_get_outsymbols (stdoutput);
14761   count = bfd_get_symcount (stdoutput);
14762   for (i = 0; i < count; i++, syms++)
14763     {
14764       if (ELF_ST_IS_MIPS16 (elf_symbol (*syms)->internal_elf_sym.st_other)
14765           && ((*syms)->value & 1) != 0)
14766         {
14767           (*syms)->value &= ~1;
14768           /* If the symbol has an odd size, it was probably computed
14769              incorrectly, so adjust that as well.  */
14770           if ((elf_symbol (*syms)->internal_elf_sym.st_size & 1) != 0)
14771             ++elf_symbol (*syms)->internal_elf_sym.st_size;
14772         }
14773     }
14774 }
14775
14776 #endif
14777
14778 /* This function is called whenever a label is defined.  It is used
14779    when handling branch delays; if a branch has a label, we assume we
14780    can not move it.  */
14781
14782 void
14783 mips_define_label (symbolS *sym)
14784 {
14785   segment_info_type *si = seg_info (now_seg);
14786   struct insn_label_list *l;
14787
14788   if (free_insn_labels == NULL)
14789     l = (struct insn_label_list *) xmalloc (sizeof *l);
14790   else
14791     {
14792       l = free_insn_labels;
14793       free_insn_labels = l->next;
14794     }
14795
14796   l->label = sym;
14797   l->next = si->label_list;
14798   si->label_list = l;
14799
14800 #ifdef OBJ_ELF
14801   dwarf2_emit_label (sym);
14802 #endif
14803 }
14804 \f
14805 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
14806
14807 /* Some special processing for a MIPS ELF file.  */
14808
14809 void
14810 mips_elf_final_processing (void)
14811 {
14812   /* Write out the register information.  */
14813   if (mips_abi != N64_ABI)
14814     {
14815       Elf32_RegInfo s;
14816
14817       s.ri_gprmask = mips_gprmask;
14818       s.ri_cprmask[0] = mips_cprmask[0];
14819       s.ri_cprmask[1] = mips_cprmask[1];
14820       s.ri_cprmask[2] = mips_cprmask[2];
14821       s.ri_cprmask[3] = mips_cprmask[3];
14822       /* The gp_value field is set by the MIPS ELF backend.  */
14823
14824       bfd_mips_elf32_swap_reginfo_out (stdoutput, &s,
14825                                        ((Elf32_External_RegInfo *)
14826                                         mips_regmask_frag));
14827     }
14828   else
14829     {
14830       Elf64_Internal_RegInfo s;
14831
14832       s.ri_gprmask = mips_gprmask;
14833       s.ri_pad = 0;
14834       s.ri_cprmask[0] = mips_cprmask[0];
14835       s.ri_cprmask[1] = mips_cprmask[1];
14836       s.ri_cprmask[2] = mips_cprmask[2];
14837       s.ri_cprmask[3] = mips_cprmask[3];
14838       /* The gp_value field is set by the MIPS ELF backend.  */
14839
14840       bfd_mips_elf64_swap_reginfo_out (stdoutput, &s,
14841                                        ((Elf64_External_RegInfo *)
14842                                         mips_regmask_frag));
14843     }
14844
14845   /* Set the MIPS ELF flag bits.  FIXME: There should probably be some
14846      sort of BFD interface for this.  */
14847   if (mips_any_noreorder)
14848     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_NOREORDER;
14849   if (mips_pic != NO_PIC)
14850     {
14851     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_PIC;
14852       elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14853     }
14854   if (mips_abicalls)
14855     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_CPIC;
14856
14857   /* Set MIPS ELF flags for ASEs.  */
14858   /* We may need to define a new flag for DSP ASE, and set this flag when
14859      file_ase_dsp is true.  */
14860   /* Same for DSP R2.  */
14861   /* We may need to define a new flag for MT ASE, and set this flag when
14862      file_ase_mt is true.  */
14863   if (file_ase_mips16)
14864     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_M16;
14865 #if 0 /* XXX FIXME */
14866   if (file_ase_mips3d)
14867     elf_elfheader (stdoutput)->e_flags |= ???;
14868 #endif
14869   if (file_ase_mdmx)
14870     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
14871
14872   /* Set the MIPS ELF ABI flags.  */
14873   if (mips_abi == O32_ABI && USE_E_MIPS_ABI_O32)
14874     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O32;
14875   else if (mips_abi == O64_ABI)
14876     elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_O64;
14877   else if (mips_abi == EABI_ABI)
14878     {
14879       if (!file_mips_gp32)
14880         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI64;
14881       else
14882         elf_elfheader (stdoutput)->e_flags |= E_MIPS_ABI_EABI32;
14883     }
14884   else if (mips_abi == N32_ABI)
14885     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ABI2;
14886
14887   /* Nothing to do for N64_ABI.  */
14888
14889   if (mips_32bitmode)
14890     elf_elfheader (stdoutput)->e_flags |= EF_MIPS_32BITMODE;
14891
14892 #if 0 /* XXX FIXME */
14893   /* 32 bit code with 64 bit FP registers.  */
14894   if (!file_mips_fp32 && ABI_NEEDS_32BIT_REGS (mips_abi))
14895     elf_elfheader (stdoutput)->e_flags |= ???;
14896 #endif
14897 }
14898
14899 #endif /* OBJ_ELF || OBJ_MAYBE_ELF */
14900 \f
14901 typedef struct proc {
14902   symbolS *func_sym;
14903   symbolS *func_end_sym;
14904   unsigned long reg_mask;
14905   unsigned long reg_offset;
14906   unsigned long fpreg_mask;
14907   unsigned long fpreg_offset;
14908   unsigned long frame_offset;
14909   unsigned long frame_reg;
14910   unsigned long pc_reg;
14911 } procS;
14912
14913 static procS cur_proc;
14914 static procS *cur_proc_ptr;
14915 static int numprocs;
14916
14917 /* Implement NOP_OPCODE.  We encode a MIPS16 nop as "1" and a normal
14918    nop as "0".  */
14919
14920 char
14921 mips_nop_opcode (void)
14922 {
14923   return seg_info (now_seg)->tc_segment_info_data.mips16;
14924 }
14925
14926 /* Fill in an rs_align_code fragment.  This only needs to do something
14927    for MIPS16 code, where 0 is not a nop.  */
14928
14929 void
14930 mips_handle_align (fragS *fragp)
14931 {
14932   char *p;
14933   int bytes, size, excess;
14934   valueT opcode;
14935
14936   if (fragp->fr_type != rs_align_code)
14937     return;
14938
14939   p = fragp->fr_literal + fragp->fr_fix;
14940   if (*p)
14941     {
14942       opcode = mips16_nop_insn.insn_opcode;
14943       size = 2;
14944     }
14945   else
14946     {
14947       opcode = nop_insn.insn_opcode;
14948       size = 4;
14949     }
14950
14951   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
14952   excess = bytes % size;
14953   if (excess != 0)
14954     {
14955       /* If we're not inserting a whole number of instructions,
14956          pad the end of the fixed part of the frag with zeros.  */
14957       memset (p, 0, excess);
14958       p += excess;
14959       fragp->fr_fix += excess;
14960     }
14961
14962   md_number_to_chars (p, opcode, size);
14963   fragp->fr_var = size;
14964 }
14965
14966 static void
14967 md_obj_begin (void)
14968 {
14969 }
14970
14971 static void
14972 md_obj_end (void)
14973 {
14974   /* Check for premature end, nesting errors, etc.  */
14975   if (cur_proc_ptr)
14976     as_warn (_("missing .end at end of assembly"));
14977 }
14978
14979 static long
14980 get_number (void)
14981 {
14982   int negative = 0;
14983   long val = 0;
14984
14985   if (*input_line_pointer == '-')
14986     {
14987       ++input_line_pointer;
14988       negative = 1;
14989     }
14990   if (!ISDIGIT (*input_line_pointer))
14991     as_bad (_("expected simple number"));
14992   if (input_line_pointer[0] == '0')
14993     {
14994       if (input_line_pointer[1] == 'x')
14995         {
14996           input_line_pointer += 2;
14997           while (ISXDIGIT (*input_line_pointer))
14998             {
14999               val <<= 4;
15000               val |= hex_value (*input_line_pointer++);
15001             }
15002           return negative ? -val : val;
15003         }
15004       else
15005         {
15006           ++input_line_pointer;
15007           while (ISDIGIT (*input_line_pointer))
15008             {
15009               val <<= 3;
15010               val |= *input_line_pointer++ - '0';
15011             }
15012           return negative ? -val : val;
15013         }
15014     }
15015   if (!ISDIGIT (*input_line_pointer))
15016     {
15017       printf (_(" *input_line_pointer == '%c' 0x%02x\n"),
15018               *input_line_pointer, *input_line_pointer);
15019       as_warn (_("invalid number"));
15020       return -1;
15021     }
15022   while (ISDIGIT (*input_line_pointer))
15023     {
15024       val *= 10;
15025       val += *input_line_pointer++ - '0';
15026     }
15027   return negative ? -val : val;
15028 }
15029
15030 /* The .file directive; just like the usual .file directive, but there
15031    is an initial number which is the ECOFF file index.  In the non-ECOFF
15032    case .file implies DWARF-2.  */
15033
15034 static void
15035 s_mips_file (int x ATTRIBUTE_UNUSED)
15036 {
15037   static int first_file_directive = 0;
15038
15039   if (ECOFF_DEBUGGING)
15040     {
15041       get_number ();
15042       s_app_file (0);
15043     }
15044   else
15045     {
15046       char *filename;
15047
15048       filename = dwarf2_directive_file (0);
15049
15050       /* Versions of GCC up to 3.1 start files with a ".file"
15051          directive even for stabs output.  Make sure that this
15052          ".file" is handled.  Note that you need a version of GCC
15053          after 3.1 in order to support DWARF-2 on MIPS.  */
15054       if (filename != NULL && ! first_file_directive)
15055         {
15056           (void) new_logical_line (filename, -1);
15057           s_app_file_string (filename, 0);
15058         }
15059       first_file_directive = 1;
15060     }
15061 }
15062
15063 /* The .loc directive, implying DWARF-2.  */
15064
15065 static void
15066 s_mips_loc (int x ATTRIBUTE_UNUSED)
15067 {
15068   if (!ECOFF_DEBUGGING)
15069     dwarf2_directive_loc (0);
15070 }
15071
15072 /* The .end directive.  */
15073
15074 static void
15075 s_mips_end (int x ATTRIBUTE_UNUSED)
15076 {
15077   symbolS *p;
15078
15079   /* Following functions need their own .frame and .cprestore directives.  */
15080   mips_frame_reg_valid = 0;
15081   mips_cprestore_valid = 0;
15082
15083   if (!is_end_of_line[(unsigned char) *input_line_pointer])
15084     {
15085       p = get_symbol ();
15086       demand_empty_rest_of_line ();
15087     }
15088   else
15089     p = NULL;
15090
15091   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15092     as_warn (_(".end not in text section"));
15093
15094   if (!cur_proc_ptr)
15095     {
15096       as_warn (_(".end directive without a preceding .ent directive."));
15097       demand_empty_rest_of_line ();
15098       return;
15099     }
15100
15101   if (p != NULL)
15102     {
15103       gas_assert (S_GET_NAME (p));
15104       if (strcmp (S_GET_NAME (p), S_GET_NAME (cur_proc_ptr->func_sym)))
15105         as_warn (_(".end symbol does not match .ent symbol."));
15106
15107       if (debug_type == DEBUG_STABS)
15108         stabs_generate_asm_endfunc (S_GET_NAME (p),
15109                                     S_GET_NAME (p));
15110     }
15111   else
15112     as_warn (_(".end directive missing or unknown symbol"));
15113
15114 #ifdef OBJ_ELF
15115   /* Create an expression to calculate the size of the function.  */
15116   if (p && cur_proc_ptr)
15117     {
15118       OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (p);
15119       expressionS *exp = xmalloc (sizeof (expressionS));
15120
15121       obj->size = exp;
15122       exp->X_op = O_subtract;
15123       exp->X_add_symbol = symbol_temp_new_now ();
15124       exp->X_op_symbol = p;
15125       exp->X_add_number = 0;
15126
15127       cur_proc_ptr->func_end_sym = exp->X_add_symbol;
15128     }
15129
15130   /* Generate a .pdr section.  */
15131   if (IS_ELF && !ECOFF_DEBUGGING && mips_flag_pdr)
15132     {
15133       segT saved_seg = now_seg;
15134       subsegT saved_subseg = now_subseg;
15135       expressionS exp;
15136       char *fragp;
15137
15138 #ifdef md_flush_pending_output
15139       md_flush_pending_output ();
15140 #endif
15141
15142       gas_assert (pdr_seg);
15143       subseg_set (pdr_seg, 0);
15144
15145       /* Write the symbol.  */
15146       exp.X_op = O_symbol;
15147       exp.X_add_symbol = p;
15148       exp.X_add_number = 0;
15149       emit_expr (&exp, 4);
15150
15151       fragp = frag_more (7 * 4);
15152
15153       md_number_to_chars (fragp, cur_proc_ptr->reg_mask, 4);
15154       md_number_to_chars (fragp + 4, cur_proc_ptr->reg_offset, 4);
15155       md_number_to_chars (fragp + 8, cur_proc_ptr->fpreg_mask, 4);
15156       md_number_to_chars (fragp + 12, cur_proc_ptr->fpreg_offset, 4);
15157       md_number_to_chars (fragp + 16, cur_proc_ptr->frame_offset, 4);
15158       md_number_to_chars (fragp + 20, cur_proc_ptr->frame_reg, 4);
15159       md_number_to_chars (fragp + 24, cur_proc_ptr->pc_reg, 4);
15160
15161       subseg_set (saved_seg, saved_subseg);
15162     }
15163 #endif /* OBJ_ELF */
15164
15165   cur_proc_ptr = NULL;
15166 }
15167
15168 /* The .aent and .ent directives.  */
15169
15170 static void
15171 s_mips_ent (int aent)
15172 {
15173   symbolS *symbolP;
15174
15175   symbolP = get_symbol ();
15176   if (*input_line_pointer == ',')
15177     ++input_line_pointer;
15178   SKIP_WHITESPACE ();
15179   if (ISDIGIT (*input_line_pointer)
15180       || *input_line_pointer == '-')
15181     get_number ();
15182
15183   if ((bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) == 0)
15184     as_warn (_(".ent or .aent not in text section."));
15185
15186   if (!aent && cur_proc_ptr)
15187     as_warn (_("missing .end"));
15188
15189   if (!aent)
15190     {
15191       /* This function needs its own .frame and .cprestore directives.  */
15192       mips_frame_reg_valid = 0;
15193       mips_cprestore_valid = 0;
15194
15195       cur_proc_ptr = &cur_proc;
15196       memset (cur_proc_ptr, '\0', sizeof (procS));
15197
15198       cur_proc_ptr->func_sym = symbolP;
15199
15200       ++numprocs;
15201
15202       if (debug_type == DEBUG_STABS)
15203         stabs_generate_asm_func (S_GET_NAME (symbolP),
15204                                  S_GET_NAME (symbolP));
15205     }
15206
15207   symbol_get_bfdsym (symbolP)->flags |= BSF_FUNCTION;
15208
15209   demand_empty_rest_of_line ();
15210 }
15211
15212 /* The .frame directive. If the mdebug section is present (IRIX 5 native)
15213    then ecoff.c (ecoff_directive_frame) is used. For embedded targets,
15214    s_mips_frame is used so that we can set the PDR information correctly.
15215    We can't use the ecoff routines because they make reference to the ecoff
15216    symbol table (in the mdebug section).  */
15217
15218 static void
15219 s_mips_frame (int ignore ATTRIBUTE_UNUSED)
15220 {
15221 #ifdef OBJ_ELF
15222   if (IS_ELF && !ECOFF_DEBUGGING)
15223     {
15224       long val;
15225
15226       if (cur_proc_ptr == (procS *) NULL)
15227         {
15228           as_warn (_(".frame outside of .ent"));
15229           demand_empty_rest_of_line ();
15230           return;
15231         }
15232
15233       cur_proc_ptr->frame_reg = tc_get_register (1);
15234
15235       SKIP_WHITESPACE ();
15236       if (*input_line_pointer++ != ','
15237           || get_absolute_expression_and_terminator (&val) != ',')
15238         {
15239           as_warn (_("Bad .frame directive"));
15240           --input_line_pointer;
15241           demand_empty_rest_of_line ();
15242           return;
15243         }
15244
15245       cur_proc_ptr->frame_offset = val;
15246       cur_proc_ptr->pc_reg = tc_get_register (0);
15247
15248       demand_empty_rest_of_line ();
15249     }
15250   else
15251 #endif /* OBJ_ELF */
15252     s_ignore (ignore);
15253 }
15254
15255 /* The .fmask and .mask directives. If the mdebug section is present
15256    (IRIX 5 native) then ecoff.c (ecoff_directive_mask) is used. For
15257    embedded targets, s_mips_mask is used so that we can set the PDR
15258    information correctly. We can't use the ecoff routines because they
15259    make reference to the ecoff symbol table (in the mdebug section).  */
15260
15261 static void
15262 s_mips_mask (int reg_type)
15263 {
15264 #ifdef OBJ_ELF
15265   if (IS_ELF && !ECOFF_DEBUGGING)
15266     {
15267       long mask, off;
15268
15269       if (cur_proc_ptr == (procS *) NULL)
15270         {
15271           as_warn (_(".mask/.fmask outside of .ent"));
15272           demand_empty_rest_of_line ();
15273           return;
15274         }
15275
15276       if (get_absolute_expression_and_terminator (&mask) != ',')
15277         {
15278           as_warn (_("Bad .mask/.fmask directive"));
15279           --input_line_pointer;
15280           demand_empty_rest_of_line ();
15281           return;
15282         }
15283
15284       off = get_absolute_expression ();
15285
15286       if (reg_type == 'F')
15287         {
15288           cur_proc_ptr->fpreg_mask = mask;
15289           cur_proc_ptr->fpreg_offset = off;
15290         }
15291       else
15292         {
15293           cur_proc_ptr->reg_mask = mask;
15294           cur_proc_ptr->reg_offset = off;
15295         }
15296
15297       demand_empty_rest_of_line ();
15298     }
15299   else
15300 #endif /* OBJ_ELF */
15301     s_ignore (reg_type);
15302 }
15303
15304 /* A table describing all the processors gas knows about.  Names are
15305    matched in the order listed.
15306
15307    To ease comparison, please keep this table in the same order as
15308    gcc's mips_cpu_info_table[].  */
15309 static const struct mips_cpu_info mips_cpu_info_table[] =
15310 {
15311   /* Entries for generic ISAs */
15312   { "mips1",          MIPS_CPU_IS_ISA,          ISA_MIPS1,      CPU_R3000 },
15313   { "mips2",          MIPS_CPU_IS_ISA,          ISA_MIPS2,      CPU_R6000 },
15314   { "mips3",          MIPS_CPU_IS_ISA,          ISA_MIPS3,      CPU_R4000 },
15315   { "mips4",          MIPS_CPU_IS_ISA,          ISA_MIPS4,      CPU_R8000 },
15316   { "mips5",          MIPS_CPU_IS_ISA,          ISA_MIPS5,      CPU_MIPS5 },
15317   { "mips32",         MIPS_CPU_IS_ISA,          ISA_MIPS32,     CPU_MIPS32 },
15318   { "mips32r2",       MIPS_CPU_IS_ISA,          ISA_MIPS32R2,   CPU_MIPS32R2 },
15319   { "mips64",         MIPS_CPU_IS_ISA,          ISA_MIPS64,     CPU_MIPS64 },
15320   { "mips64r2",       MIPS_CPU_IS_ISA,          ISA_MIPS64R2,   CPU_MIPS64R2 },
15321
15322   /* MIPS I */
15323   { "r3000",          0,                        ISA_MIPS1,      CPU_R3000 },
15324   { "r2000",          0,                        ISA_MIPS1,      CPU_R3000 },
15325   { "r3900",          0,                        ISA_MIPS1,      CPU_R3900 },
15326
15327   /* MIPS II */
15328   { "r6000",          0,                        ISA_MIPS2,      CPU_R6000 },
15329
15330   /* MIPS III */
15331   { "r4000",          0,                        ISA_MIPS3,      CPU_R4000 },
15332   { "r4010",          0,                        ISA_MIPS2,      CPU_R4010 },
15333   { "vr4100",         0,                        ISA_MIPS3,      CPU_VR4100 },
15334   { "vr4111",         0,                        ISA_MIPS3,      CPU_R4111 },
15335   { "vr4120",         0,                        ISA_MIPS3,      CPU_VR4120 },
15336   { "vr4130",         0,                        ISA_MIPS3,      CPU_VR4120 },
15337   { "vr4181",         0,                        ISA_MIPS3,      CPU_R4111 },
15338   { "vr4300",         0,                        ISA_MIPS3,      CPU_R4300 },
15339   { "r4400",          0,                        ISA_MIPS3,      CPU_R4400 },
15340   { "r4600",          0,                        ISA_MIPS3,      CPU_R4600 },
15341   { "orion",          0,                        ISA_MIPS3,      CPU_R4600 },
15342   { "r4650",          0,                        ISA_MIPS3,      CPU_R4650 },
15343   /* ST Microelectronics Loongson 2E and 2F cores */
15344   { "loongson2e",     0,                        ISA_MIPS3,   CPU_LOONGSON_2E },
15345   { "loongson2f",     0,                        ISA_MIPS3,   CPU_LOONGSON_2F },
15346
15347   /* MIPS IV */
15348   { "r8000",          0,                        ISA_MIPS4,      CPU_R8000 },
15349   { "r10000",         0,                        ISA_MIPS4,      CPU_R10000 },
15350   { "r12000",         0,                        ISA_MIPS4,      CPU_R12000 },
15351   { "r14000",         0,                        ISA_MIPS4,      CPU_R14000 },
15352   { "r16000",         0,                        ISA_MIPS4,      CPU_R16000 },
15353   { "vr5000",         0,                        ISA_MIPS4,      CPU_R5000 },
15354   { "vr5400",         0,                        ISA_MIPS4,      CPU_VR5400 },
15355   { "vr5500",         0,                        ISA_MIPS4,      CPU_VR5500 },
15356   { "rm5200",         0,                        ISA_MIPS4,      CPU_R5000 },
15357   { "rm5230",         0,                        ISA_MIPS4,      CPU_R5000 },
15358   { "rm5231",         0,                        ISA_MIPS4,      CPU_R5000 },
15359   { "rm5261",         0,                        ISA_MIPS4,      CPU_R5000 },
15360   { "rm5721",         0,                        ISA_MIPS4,      CPU_R5000 },
15361   { "rm7000",         0,                        ISA_MIPS4,      CPU_RM7000 },
15362   { "rm9000",         0,                        ISA_MIPS4,      CPU_RM9000 },
15363
15364   /* MIPS 32 */
15365   { "4kc",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15366   { "4km",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15367   { "4kp",            0,                        ISA_MIPS32,     CPU_MIPS32 },
15368   { "4ksc",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32,     CPU_MIPS32 },
15369
15370   /* MIPS 32 Release 2 */
15371   { "4kec",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15372   { "4kem",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15373   { "4kep",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15374   { "4ksd",           MIPS_CPU_ASE_SMARTMIPS,   ISA_MIPS32R2,   CPU_MIPS32R2 },
15375   { "m4k",            0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15376   { "m4kp",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15377   { "24kc",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15378   { "24kf2_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15379   { "24kf",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15380   { "24kf1_1",        0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15381   /* Deprecated forms of the above.  */
15382   { "24kfx",          0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15383   { "24kx",           0,                        ISA_MIPS32R2,   CPU_MIPS32R2 },
15384   /* 24KE is a 24K with DSP ASE, other ASEs are optional.  */
15385   { "24kec",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15386   { "24kef2_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15387   { "24kef",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15388   { "24kef1_1",       MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15389   /* Deprecated forms of the above.  */
15390   { "24kefx",         MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15391   { "24kex",          MIPS_CPU_ASE_DSP,         ISA_MIPS32R2,   CPU_MIPS32R2 },
15392   /* 34K is a 24K with DSP and MT ASE, other ASEs are optional.  */
15393   { "34kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15394                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15395   { "34kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15396                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15397   { "34kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15398                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15399   { "34kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15400                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15401   /* Deprecated forms of the above.  */
15402   { "34kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15403                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15404   { "34kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15405                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15406   /* 74K with DSP and DSPR2 ASE, other ASEs are optional.  */
15407   { "74kc",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15408                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15409   { "74kf2_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15410                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15411   { "74kf",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15412                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15413   { "74kf1_1",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15414                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15415   { "74kf3_2",        MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15416                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15417   /* Deprecated forms of the above.  */
15418   { "74kfx",          MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15419                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15420   { "74kx",           MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_DSPR2,
15421                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15422   /* 1004K cores are multiprocessor versions of the 34K.  */
15423   { "1004kc",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15424                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15425   { "1004kf2_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15426                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15427   { "1004kf",         MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15428                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15429   { "1004kf1_1",      MIPS_CPU_ASE_DSP | MIPS_CPU_ASE_MT,
15430                                                 ISA_MIPS32R2,   CPU_MIPS32R2 },
15431
15432   /* MIPS 64 */
15433   { "5kc",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15434   { "5kf",            0,                        ISA_MIPS64,     CPU_MIPS64 },
15435   { "20kc",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15436   { "25kf",           MIPS_CPU_ASE_MIPS3D,      ISA_MIPS64,     CPU_MIPS64 },
15437
15438   /* Broadcom SB-1 CPU core */
15439   { "sb1",            MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15440                                                 ISA_MIPS64,     CPU_SB1 },
15441   /* Broadcom SB-1A CPU core */
15442   { "sb1a",           MIPS_CPU_ASE_MIPS3D | MIPS_CPU_ASE_MDMX,
15443                                                 ISA_MIPS64,     CPU_SB1 },
15444
15445   /* MIPS 64 Release 2 */
15446
15447   /* Cavium Networks Octeon CPU core */
15448   { "octeon",         0,      ISA_MIPS64R2,   CPU_OCTEON },
15449
15450   /* RMI Xlr */
15451   { "xlr",            0,      ISA_MIPS64,     CPU_XLR },
15452
15453   /* End marker */
15454   { NULL, 0, 0, 0 }
15455 };
15456
15457
15458 /* Return true if GIVEN is the same as CANONICAL, or if it is CANONICAL
15459    with a final "000" replaced by "k".  Ignore case.
15460
15461    Note: this function is shared between GCC and GAS.  */
15462
15463 static bfd_boolean
15464 mips_strict_matching_cpu_name_p (const char *canonical, const char *given)
15465 {
15466   while (*given != 0 && TOLOWER (*given) == TOLOWER (*canonical))
15467     given++, canonical++;
15468
15469   return ((*given == 0 && *canonical == 0)
15470           || (strcmp (canonical, "000") == 0 && strcasecmp (given, "k") == 0));
15471 }
15472
15473
15474 /* Return true if GIVEN matches CANONICAL, where GIVEN is a user-supplied
15475    CPU name.  We've traditionally allowed a lot of variation here.
15476
15477    Note: this function is shared between GCC and GAS.  */
15478
15479 static bfd_boolean
15480 mips_matching_cpu_name_p (const char *canonical, const char *given)
15481 {
15482   /* First see if the name matches exactly, or with a final "000"
15483      turned into "k".  */
15484   if (mips_strict_matching_cpu_name_p (canonical, given))
15485     return TRUE;
15486
15487   /* If not, try comparing based on numerical designation alone.
15488      See if GIVEN is an unadorned number, or 'r' followed by a number.  */
15489   if (TOLOWER (*given) == 'r')
15490     given++;
15491   if (!ISDIGIT (*given))
15492     return FALSE;
15493
15494   /* Skip over some well-known prefixes in the canonical name,
15495      hoping to find a number there too.  */
15496   if (TOLOWER (canonical[0]) == 'v' && TOLOWER (canonical[1]) == 'r')
15497     canonical += 2;
15498   else if (TOLOWER (canonical[0]) == 'r' && TOLOWER (canonical[1]) == 'm')
15499     canonical += 2;
15500   else if (TOLOWER (canonical[0]) == 'r')
15501     canonical += 1;
15502
15503   return mips_strict_matching_cpu_name_p (canonical, given);
15504 }
15505
15506
15507 /* Parse an option that takes the name of a processor as its argument.
15508    OPTION is the name of the option and CPU_STRING is the argument.
15509    Return the corresponding processor enumeration if the CPU_STRING is
15510    recognized, otherwise report an error and return null.
15511
15512    A similar function exists in GCC.  */
15513
15514 static const struct mips_cpu_info *
15515 mips_parse_cpu (const char *option, const char *cpu_string)
15516 {
15517   const struct mips_cpu_info *p;
15518
15519   /* 'from-abi' selects the most compatible architecture for the given
15520      ABI: MIPS I for 32-bit ABIs and MIPS III for 64-bit ABIs.  For the
15521      EABIs, we have to decide whether we're using the 32-bit or 64-bit
15522      version.  Look first at the -mgp options, if given, otherwise base
15523      the choice on MIPS_DEFAULT_64BIT.
15524
15525      Treat NO_ABI like the EABIs.  One reason to do this is that the
15526      plain 'mips' and 'mips64' configs have 'from-abi' as their default
15527      architecture.  This code picks MIPS I for 'mips' and MIPS III for
15528      'mips64', just as we did in the days before 'from-abi'.  */
15529   if (strcasecmp (cpu_string, "from-abi") == 0)
15530     {
15531       if (ABI_NEEDS_32BIT_REGS (mips_abi))
15532         return mips_cpu_info_from_isa (ISA_MIPS1);
15533
15534       if (ABI_NEEDS_64BIT_REGS (mips_abi))
15535         return mips_cpu_info_from_isa (ISA_MIPS3);
15536
15537       if (file_mips_gp32 >= 0)
15538         return mips_cpu_info_from_isa (file_mips_gp32 ? ISA_MIPS1 : ISA_MIPS3);
15539
15540       return mips_cpu_info_from_isa (MIPS_DEFAULT_64BIT
15541                                      ? ISA_MIPS3
15542                                      : ISA_MIPS1);
15543     }
15544
15545   /* 'default' has traditionally been a no-op.  Probably not very useful.  */
15546   if (strcasecmp (cpu_string, "default") == 0)
15547     return 0;
15548
15549   for (p = mips_cpu_info_table; p->name != 0; p++)
15550     if (mips_matching_cpu_name_p (p->name, cpu_string))
15551       return p;
15552
15553   as_bad (_("Bad value (%s) for %s"), cpu_string, option);
15554   return 0;
15555 }
15556
15557 /* Return the canonical processor information for ISA (a member of the
15558    ISA_MIPS* enumeration).  */
15559
15560 static const struct mips_cpu_info *
15561 mips_cpu_info_from_isa (int isa)
15562 {
15563   int i;
15564
15565   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15566     if ((mips_cpu_info_table[i].flags & MIPS_CPU_IS_ISA)
15567         && isa == mips_cpu_info_table[i].isa)
15568       return (&mips_cpu_info_table[i]);
15569
15570   return NULL;
15571 }
15572
15573 static const struct mips_cpu_info *
15574 mips_cpu_info_from_arch (int arch)
15575 {
15576   int i;
15577
15578   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15579     if (arch == mips_cpu_info_table[i].cpu)
15580       return (&mips_cpu_info_table[i]);
15581
15582   return NULL;
15583 }
15584 \f
15585 static void
15586 show (FILE *stream, const char *string, int *col_p, int *first_p)
15587 {
15588   if (*first_p)
15589     {
15590       fprintf (stream, "%24s", "");
15591       *col_p = 24;
15592     }
15593   else
15594     {
15595       fprintf (stream, ", ");
15596       *col_p += 2;
15597     }
15598
15599   if (*col_p + strlen (string) > 72)
15600     {
15601       fprintf (stream, "\n%24s", "");
15602       *col_p = 24;
15603     }
15604
15605   fprintf (stream, "%s", string);
15606   *col_p += strlen (string);
15607
15608   *first_p = 0;
15609 }
15610
15611 void
15612 md_show_usage (FILE *stream)
15613 {
15614   int column, first;
15615   size_t i;
15616
15617   fprintf (stream, _("\
15618 MIPS options:\n\
15619 -EB                     generate big endian output\n\
15620 -EL                     generate little endian output\n\
15621 -g, -g2                 do not remove unneeded NOPs or swap branches\n\
15622 -G NUM                  allow referencing objects up to NUM bytes\n\
15623                         implicitly with the gp register [default 8]\n"));
15624   fprintf (stream, _("\
15625 -mips1                  generate MIPS ISA I instructions\n\
15626 -mips2                  generate MIPS ISA II instructions\n\
15627 -mips3                  generate MIPS ISA III instructions\n\
15628 -mips4                  generate MIPS ISA IV instructions\n\
15629 -mips5                  generate MIPS ISA V instructions\n\
15630 -mips32                 generate MIPS32 ISA instructions\n\
15631 -mips32r2               generate MIPS32 release 2 ISA instructions\n\
15632 -mips64                 generate MIPS64 ISA instructions\n\
15633 -mips64r2               generate MIPS64 release 2 ISA instructions\n\
15634 -march=CPU/-mtune=CPU   generate code/schedule for CPU, where CPU is one of:\n"));
15635
15636   first = 1;
15637
15638   for (i = 0; mips_cpu_info_table[i].name != NULL; i++)
15639     show (stream, mips_cpu_info_table[i].name, &column, &first);
15640   show (stream, "from-abi", &column, &first);
15641   fputc ('\n', stream);
15642
15643   fprintf (stream, _("\
15644 -mCPU                   equivalent to -march=CPU -mtune=CPU. Deprecated.\n\
15645 -no-mCPU                don't generate code specific to CPU.\n\
15646                         For -mCPU and -no-mCPU, CPU must be one of:\n"));
15647
15648   first = 1;
15649
15650   show (stream, "3900", &column, &first);
15651   show (stream, "4010", &column, &first);
15652   show (stream, "4100", &column, &first);
15653   show (stream, "4650", &column, &first);
15654   fputc ('\n', stream);
15655
15656   fprintf (stream, _("\
15657 -mips16                 generate mips16 instructions\n\
15658 -no-mips16              do not generate mips16 instructions\n"));
15659   fprintf (stream, _("\
15660 -msmartmips             generate smartmips instructions\n\
15661 -mno-smartmips          do not generate smartmips instructions\n"));  
15662   fprintf (stream, _("\
15663 -mdsp                   generate DSP instructions\n\
15664 -mno-dsp                do not generate DSP instructions\n"));
15665   fprintf (stream, _("\
15666 -mdspr2                 generate DSP R2 instructions\n\
15667 -mno-dspr2              do not generate DSP R2 instructions\n"));
15668   fprintf (stream, _("\
15669 -mmt                    generate MT instructions\n\
15670 -mno-mt                 do not generate MT instructions\n"));
15671   fprintf (stream, _("\
15672 -mfix-loongson2f-jump   work around Loongson2F JUMP instructions\n\
15673 -mfix-loongson2f-nop    work around Loongson2F NOP errata\n\
15674 -mfix-vr4120            work around certain VR4120 errata\n\
15675 -mfix-vr4130            work around VR4130 mflo/mfhi errata\n\
15676 -mfix-24k               insert a nop after ERET and DERET instructions\n\
15677 -mfix-cn63xxp1          work around CN63XXP1 PREF errata\n\
15678 -mgp32                  use 32-bit GPRs, regardless of the chosen ISA\n\
15679 -mfp32                  use 32-bit FPRs, regardless of the chosen ISA\n\
15680 -msym32                 assume all symbols have 32-bit values\n\
15681 -O0                     remove unneeded NOPs, do not swap branches\n\
15682 -O                      remove unneeded NOPs and swap branches\n\
15683 --trap, --no-break      trap exception on div by 0 and mult overflow\n\
15684 --break, --no-trap      break exception on div by 0 and mult overflow\n"));
15685   fprintf (stream, _("\
15686 -mhard-float            allow floating-point instructions\n\
15687 -msoft-float            do not allow floating-point instructions\n\
15688 -msingle-float          only allow 32-bit floating-point operations\n\
15689 -mdouble-float          allow 32-bit and 64-bit floating-point operations\n\
15690 --[no-]construct-floats [dis]allow floating point values to be constructed\n"
15691                      ));
15692 #ifdef OBJ_ELF
15693   fprintf (stream, _("\
15694 -KPIC, -call_shared     generate SVR4 position independent code\n\
15695 -call_nonpic            generate non-PIC code that can operate with DSOs\n\
15696 -mvxworks-pic           generate VxWorks position independent code\n\
15697 -non_shared             do not generate code that can operate with DSOs\n\
15698 -xgot                   assume a 32 bit GOT\n\
15699 -mpdr, -mno-pdr         enable/disable creation of .pdr sections\n\
15700 -mshared, -mno-shared   disable/enable .cpload optimization for\n\
15701                         position dependent (non shared) code\n\
15702 -mabi=ABI               create ABI conformant object file for:\n"));
15703
15704   first = 1;
15705
15706   show (stream, "32", &column, &first);
15707   show (stream, "o64", &column, &first);
15708   show (stream, "n32", &column, &first);
15709   show (stream, "64", &column, &first);
15710   show (stream, "eabi", &column, &first);
15711
15712   fputc ('\n', stream);
15713
15714   fprintf (stream, _("\
15715 -32                     create o32 ABI object file (default)\n\
15716 -n32                    create n32 ABI object file\n\
15717 -64                     create 64 ABI object file\n"));
15718 #endif
15719 }
15720
15721 #ifdef TE_IRIX
15722 enum dwarf2_format
15723 mips_dwarf2_format (asection *sec ATTRIBUTE_UNUSED)
15724 {
15725   if (HAVE_64BIT_SYMBOLS)
15726     return dwarf2_format_64bit_irix;
15727   else
15728     return dwarf2_format_32bit;
15729 }
15730 #endif
15731
15732 int
15733 mips_dwarf2_addr_size (void)
15734 {
15735   if (HAVE_64BIT_OBJECTS)
15736     return 8;
15737   else
15738     return 4;
15739 }
15740
15741 /* Standard calling conventions leave the CFA at SP on entry.  */
15742 void
15743 mips_cfi_frame_initial_instructions (void)
15744 {
15745   cfi_add_CFA_def_cfa_register (SP);
15746 }
15747
15748 int
15749 tc_mips_regname_to_dw2regnum (char *regname)
15750 {
15751   unsigned int regnum = -1;
15752   unsigned int reg;
15753
15754   if (reg_lookup (&regname, RTYPE_GP | RTYPE_NUM, &reg))
15755     regnum = reg;
15756
15757   return regnum;
15758 }